数据库
首页 > 数据库> > Navicat的使用与python中使用MySQL的基本方法

Navicat的使用与python中使用MySQL的基本方法

作者:互联网

Navicat的使用与python中使用MySQL的基本方法

实验Navicat模板

/*
 数据导入:
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 50624
 Source Host           : localhost
 Source Database       : sqlexam

 Target Server Type    : MySQL
 Target Server Version : 50624
 File Encoding         : utf-8

 Date: 10/21/2016 06:46:46 AM
*/

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `class`
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `caption` varchar(32) NOT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `class`
-- ----------------------------
BEGIN;
INSERT INTO `class` VALUES ('1', '三年二班'), ('2', '三年三班'), ('3', '一年二班'), ('4', '二年九班');
COMMIT;

-- ----------------------------
--  Table structure for `course`
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(32) NOT NULL,
  `teacher_id` int(11) NOT NULL,
  PRIMARY KEY (`cid`),
  KEY `fk_course_teacher` (`teacher_id`),
  CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `course`
-- ----------------------------
BEGIN;
INSERT INTO `course` VALUES ('1', '生物', '1'), ('2', '物理', '2'), ('3', '体育', '3'), ('4', '美术', '2');
COMMIT;

-- ----------------------------
--  Table structure for `score`
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  `num` int(11) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_score_student` (`student_id`),
  KEY `fk_score_course` (`course_id`),
  CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
  CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `score`
-- ----------------------------
BEGIN;
INSERT INTO `score` VALUES ('1', '1', '1', '10'), ('2', '1', '2', '9'), ('5', '1', '4', '66'), ('6', '2', '1', '8'), ('8', '2', '3', '68'), ('9', '2', '4', '99'), ('10', '3', '1', '77'), ('11', '3', '2', '66'), ('12', '3', '3', '87'), ('13', '3', '4', '99'), ('14', '4', '1', '79'), ('15', '4', '2', '11'), ('16', '4', '3', '67'), ('17', '4', '4', '100'), ('18', '5', '1', '79'), ('19', '5', '2', '11'), ('20', '5', '3', '67'), ('21', '5', '4', '100'), ('22', '6', '1', '9'), ('23', '6', '2', '100'), ('24', '6', '3', '67'), ('25', '6', '4', '100'), ('26', '7', '1', '9'), ('27', '7', '2', '100'), ('28', '7', '3', '67'), ('29', '7', '4', '88'), ('30', '8', '1', '9'), ('31', '8', '2', '100'), ('32', '8', '3', '67'), ('33', '8', '4', '88'), ('34', '9', '1', '91'), ('35', '9', '2', '88'), ('36', '9', '3', '67'), ('37', '9', '4', '22'), ('38', '10', '1', '90'), ('39', '10', '2', '77'), ('40', '10', '3', '43'), ('41', '10', '4', '87'), ('42', '11', '1', '90'), ('43', '11', '2', '77'), ('44', '11', '3', '43'), ('45', '11', '4', '87'), ('46', '12', '1', '90'), ('47', '12', '2', '77'), ('48', '12', '3', '43'), ('49', '12', '4', '87'), ('52', '13', '3', '87');
COMMIT;

-- ----------------------------
--  Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `gender` char(1) NOT NULL,
  `class_id` int(11) NOT NULL,
  `sname` varchar(32) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_class` (`class_id`),
  CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `student`
-- ----------------------------
BEGIN;
INSERT INTO `student` VALUES ('1', '男', '1', '理解'), ('2', '女', '1', '钢蛋'), ('3', '男', '1', '张三'), ('4', '男', '1', '张一'), ('5', '女', '1', '张二'), ('6', '男', '1', '张四'), ('7', '女', '2', '铁锤'), ('8', '男', '2', '李三'), ('9', '男', '2', '李一'), ('10', '女', '2', '李二'), ('11', '男', '2', '李四'), ('12', '女', '3', '如花'), ('13', '男', '3', '刘三'), ('14', '男', '3', '刘一'), ('15', '女', '3', '刘二'), ('16', '男', '3', '刘四');
COMMIT;

-- ----------------------------
--  Table structure for `teacher`
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `tname` varchar(32) NOT NULL,
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `teacher`
-- ----------------------------
BEGIN;
INSERT INTO `teacher` VALUES ('1', '张磊老师'), ('2', '李平老师'), ('3', '刘海燕老师'), ('4', '朱云海老师'), ('5', '李杰老师');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;
1、查询所有的课程的名称以及对应的任课老师姓名
    -- 首先查看老师列表和课程列表
    -- select * from teacher;
    -- select * from course;
    # 查看到一共有四门课,然后有五名老师然后通过课程表和老师表的关系来查看关系
    SELECT
        course.cname,
        teacher.tname 
    FROM
        course
        INNER JOIN teacher ON teacher_id = teacher.tid;
2、查询平均成绩大于八十分的同学的姓名和平均成绩
	-- 2、查询平均成绩大于八十分的同学的姓名和平均成绩
    -- 首先我们应该查看我们需要的表的对应关系(成绩表,学生表,课程表)
    -- select * from student;
    -- select * from course;
    -- select * from score;
    # 然后发现他们的表关系是多对多,都需要成绩表来连接他们之间的关系
    /*先将所有学生进行分组,利用子连接拿到学生id和平均值*/-- select student_id from score group by student_id;
    -- select student_id,avg(num) from score group by student_id having avg(num) > 80;
    # 然后获取学生姓名
    SELECT
        student.sname,
        t1.avg_num 
    FROM
        student
        INNER JOIN ( SELECT student_id, avg( num ) AS avg_num FROM score GROUP BY student_id HAVING avg( num ) > 80 ) AS t1 ON student.sid = t1.student_id;
3、查询只单独报了李平老师一门课的学生姓名
	-- 还是查看相关的表有什么
    -- select * from teacher;
    -- select * from course;
    -- select * from score;
    -- SELECT * FROM student;
    # 根据李平老师编号获取教授哪几个课程
    -- select teacher.tname,course.teacher_id from teacher.tname inner join course on teacher.tid=course.teacher_id ;
    # 获取一下成绩表
    select sname from student where sid not in(select distinct sid from score where course_id in(select cid from course where teacher_id=(select tid from teacher where tname='李平老师')));
4、查询没有同时选修物理课程和体育课程的学生姓名
	-- select * from student;
    -- select * from score;
    -- select * from course;
    # 获取物理和体育课程的编号
    -- select cid from course where cname in ('物理','体育');
    # 获取成绩中的学生编号
    -- select sid from score where course_id in ( select cid from course where cname in ('物理','体育'));
    # 获取到有报过物理和体育的所有学生
    select sname from student where sid in(select score.student_id from score where course_id in (select cid from course where cname in ('物理','体育')group by score.student_id having count(score.course_id)=1);
5、查询挂科超过两门(包括两门)的学生姓名和班级
-- 5、查询挂科超过两门(包括两门)的学生姓名和班级
select * from score;
select * from student;
select * from class;
-- select * from score where num < 60;
select student_id from score where score.num < 60 group by student_id having count(student_id) = 2;
select * from student where sid=(select student_id from score where score.num < 60 group by student_id having count(student_id) >= 2);
SELECT
	class.caption,
	student.sname 
FROM
	class
	INNER JOIN student ON class.cid = student.class_id 
WHERE
	student.sid IN ( SELECT student_id FROM score WHERE num < 60 GROUP BY student_id HAVING count( student_id ) >= 2 ));

python操作mysql的基本方法

1.我们要是想使用python操控mysql那么就需要下载一个第三方模块,pymysql模块
2.下载:pip install pymysql
3.固定格式
    import pymysql  # 导入模块

    conn = pymysql.connect(  # 连接服务器
        host='127.0.0.1',  # 本机地址
        port=3306,  # 端口号,3306 mysql默认端口号
        user='root',  # 用户名
        password='',  # 密码
        database='db3',  # 库名
        charset='utf8mb4',  # 编码格式
        autocommit=True  # 输入二次确认自动确认
    )
    cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 产生一个游标对象(等待输入命令)
    sql1 = 'select * from userinfo'  # 编写SQL语句,飘黄不怕因为他本来就是SQL语句pycharm不识别很正常
    cursor.execute(sql1)  # 发送给服务端
    res = cursor.fetchall()  # 获取执行结果
    print(res)  # 打印

python操作mysql的增删改查的提交操作

1.增
	insert_form有三种
	insert当有与主键相同的值插入时,不会插入数据并报错
	insert.ignore当有与主键相同值插入时,忽略该记录不插入但是不报错
	replace 当有与主键相同值插入时,删除原有记录重新插入新纪录值
	def insert_data(insert_form, insert_table):
        sql_insert = """{} into {}(id,name,number) values(%s,%s,%s)""".format(insert_form, insert_table)
        cur.execute(sql_insert % (1,'lewis',44))
        conn.commit()   # 一定不能忘记commit
        cur.close()
        conn.close()
        print('插入数据成功')
2.删
	删除权限金山使用,一旦删除,恢复比较麻烦,建议一条一条删除
	def delete_data(delete_table):
        sql_selete = """delete from {} where id=%d""".format(delete_table)
        cur.execute(sql_selete %(1))
        conn.commit()   # 一定不能忘记commit
        cur.close()
        conn.close()
        print('删除数据成功')
3.改
	在外面增加循环可更改任意字段
	def update_data(update_table, **kwargs):
        sql_selete = """update {} set {}=%s where name=%s""".format(update_table, key)   # key、value为kwargs的key与value
        cur.execute(sql_selete %(1, value))
        conn.commit()   # 一定不能忘记commit
        cur.close()
        conn.close()
        print('更新数据成功')
4.查
	如果想要增加限制条件那么就需要自己添加where语句
	def select_data(select_table):
        sql_select = """select * from {}""".format(update_table)
        cur.execute(sql_selete)
        results = cursor.fetchall()   # cursor. fetchall():接收全部的返回结果行。fetchone()、fetchmany(size)与fetchall()的区别自行百度
        print(results)  # 只是查询结果,如有需要自行解析
        cur.close()
        conn.close()

python中获取结果注意事项

"""
获取结果有点像我们的文件中的光标就是文件的执行到哪里然后回到那里,去哪里
"""
1.cursor.fetchone()  # 获取结果集中一条数据
2.cursor.fetchall()  # 获取结果集中所有的数据
3.cursor.fetchmany()  # 获取结果集中指定条的数据
4.cursor.scroll(2,mode='relative')  # 基于当前位置向后移动然后输出
5.cursor.scroll(0,mode='absoulte')  # 基于数据集开头的位置向后移动

SQL注入问题

1.我们在登录过程中我们发现只要是名字正确或者他判断为True的时候就会直接登录进去并且还能查到你对应的信息,判断为为True则可以将你的数据库内所有的信息全部取出。
2.发现问题
	SQL注入,备注
	问题一:	select * from 库名 where name='用户名' --注释 'and password=''
	问题二:	select * from 库名 where name='随便输点东西' or 1=1 --注释'and password=''
3.错乱本质
	其实就是由一些特殊含义的符号逃脱了正常的业务逻辑,导致我们后面的代码无法正常运行
4.措施
	针对用户输入导致的错误,不需要我们自己处理,我们只需要交给专门的方法自动过滤即可
	sql = 'select * from 库名 where name=%s and password=%s'
	cuosor.execute(sql,username,password)  # 由execute自动帮我们识别出用户所输入的各种数据子哦对那个过滤页数含义符号,最后整合数据执行  一次性提交一个
	cursor.executemany()  # 一次提交多个

小知识补充

1.as语法
	给字段起别名,起表名都是as,在我们python中也经常使用as来替换变量名等
	select * from 表名 as 新表名
2.comment语法
	给表、字段等添加信息  # 也就是添加备注但是直接看是看不到的
	create table server(id int) comment  # 这个server的意思就是服务器表
	create table t1(
        id int comment'用户编码',
    	  name varchar(32) comment'用户名'
    ) comment'用户表'
3.查看eomment语法注释的位置
	show create table 表名
	use information_schema
4.concat、concat-ws语法
	concat		用于分组之前第一个字段数据的拼接
	concat_ws	如果有多个字段并且分隔符一直的话可以使用该方法减少代码
5.exists 语法
	select * from userinfo where exists(select * from department where id<100)
	exists后买你跟的sql语句如果有的结果也就是 True的话那么就会执行前面的语句,如果不为True那么不会执行,因为语法问题所以sql是从from开始执行的

作业

1、查询所有的课程的名称以及对应的任课老师姓名
	select * from teacher;
	select * from course;
	select cname,tname from course inner join teacher where course.teacher_id=teacher.tid;

2、查询学生表中男女生各有多少人
	select * from student;
	select gender,count(sid) from student group by gender;

3、查询物理成绩等于100的学生的姓名
	select * from course;
	select * from score;
	select cid from course where cname='物理';
	select student_id from score where course_id = (select cid from 		course where cname='物理');
	select * from student;
	select sname from student where sid = (select student_id from score 	where course_id = (select cid,score.num from course where cname='物理' 	group by score.num having score.num = 100));

4、查询平均成绩大于八十分的同学的姓名和平均成绩
	select * from score;
    select * from student;
    select sname,avg(num) from student group by student_id where score.avg(num) having score.avg(num) >= 80;
5、查询所有学生的学号,姓名,选课数,总成绩
	
6、 查询姓李老师的个数

7、 查询没有报李平老师课的学生姓名

8、 查询物理课程比生物课程高的学生的学号

9、 查询没有同时选修物理课程和体育课程的学生姓名

10、查询挂科超过两门(包括两门)的学生姓名和班级
、查询选修了所有课程的学生姓名

12、查询李平老师教的课程的所有成绩记录
 
13、查询全部学生都选修了的课程号和课程名

14、查询每门课程被选修的次数

15、查询之选修了一门课程的学生姓名和学号

16、查询所有学生考出的成绩并按从高到低排序(成绩去重)

17、查询平均成绩大于85的学生姓名和平均成绩

18、查询生物成绩不及格的学生姓名和对应生物分数

19、查询在所有选修了李平老师课程的学生中,这些课程(李平老师的课程,不是所有课程)平均成绩最高的学生姓名

20、查询每门课程成绩最好的前两名学生姓名

21、查询不同课程但成绩相同的学号,课程号,成绩

22、查询没学过“叶平”老师课程的学生姓名以及选修的课程名称;

23、查询所有选修了学号为1的同学选修过的一门或者多门课程的同学学号和姓名;

24、任课最多的老师中学生单科成绩最高的学生姓名

标签:course,python,Navicat,--,score,student,MySQL,id,select
来源: https://www.cnblogs.com/joseph-bright/p/16600560.html