数据库相关

  • 一 多表查询练习
  • 二 python操作MySQL
  • 2.1 基本操作
  • 2.2 获取结果相关方法
  • 三 SQL注入问题
  • 四 小知识补充
  • 练习

数据导入到Navicat(创建文件,以.sql结束,在Navicat中创建对应的表,在表中运行创建的文件。)

/*数据导入:Navicat Premium Data TransferSource Server         : localhostSource Server Type    : MySQLSource Server Version : 50624Source Host           : localhostSource Database       : sqlexamTarget Server Type    : MySQLTarget Server Version : 50624File Encoding         : utf-8Date: 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、查询所有的课程的名称以及对应的任课老师姓名

SELECTcourse.cname,teacher.tname
FROMcourseINNER JOIN teacher ON course.teacher_id = teacher.tid;

4、查询平均成绩大于八十分的同学的姓名和平均成绩

SELECTstudent.sname,new.avg_score
FROMstudentINNER JOIN ( SELECT student_id, avg( num ) AS avg_score FROM score GROUP BY student_id HAVING AVG( num )> 80 ) AS new ON student.sid = new.student_id;

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

SELECTsname
FROMstudent
WHEREsid NOT IN (SELECT DISTINCTstudent_id FROMscore WHEREcourse_id IN (SELECTcid FROMcourse WHEREteacher_id =(SELECTtid FROMteacher WHEREtname = '李平老师' )));

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

SELECTsname
FROMstudent
WHEREsid IN (SELECTstudent_id FROMscore WHEREcourse_id IN (SELECTcid FROMcourse WHEREcname IN ( '物理', '体育' )) GROUP BYstudent_id HAVINGCOUNT( course_id )= 1 );

9、查询挂科超过两门(包括两门)的学生姓名和班级

SELECTstudent.sname,class.caption
FROMclass
INNER JOINstudent ON class.cid = student.class_id
WHEREstudent.sid IN (SELECTsid FROMstudent WHEREsid IN ( SELECT student_id FROM score WHERE num < 60 GROUP BY student_id HAVING COUNT( course_id )>= 2 ))

二 python操作MySQL

2.1 基本操作

import pymysql# 1.连接服务端
conn = pymysql.connect(user='root',password='123',host='127.0.0.1',port=3306,database='db4',charset='utf8mb4',autocommit=True  # 执行增改删操作自动执行conn.commit()
)# 产生一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)# 编写sql语句
sql1 = "SELECT course.cname,teacher.tname FROM course INNER JOIN teacher ON course.teacher_id = teacher.tid;"# 发送给服务端 执行SQL语句
cursor.execute(sql1)# 获取命令的执行结果
res = cursor.fetchall()print(res)
# [{'cname': '生物', 'tname': '张磊老师'},
# {'cname': '物理', 'tname': '李平老师'},
# {'cname': '体育', 'tname': '刘海燕老师'},
# {'cname': '美术', 'tname': '李平老师'}]

2.2 获取结果相关方法

# res = cursor.fetchall()  # 一次获取所有# res = cursor.fetchone()  # 一次获取一条数据
# res1 = cursor.fetchone()
# res2 = cursor.fetchone()# res = cursor.fetchmany(3)  # 自定义获取数据条数# 类似于游标
# cursor.scroll(-3, mode="relative")  # "relative" 相关的
# cursor.scroll(2, mode="absolute")  # "absolute" 绝对的

三 SQL注入问题

利用一些特殊符号的组合产生了特殊的含义,逃脱正常的业务逻辑。

import pymysqlconn = pymysql.connect(user='root',password='123',host='127.0.0.1',port=3306,database='db4',charset='utf8mb4',autocommit=True
)cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)username = input('username>>>:').strip()
password = input('password>>>:').strip()# 针对用户输入数据 不要自己处理 交给专门的方法过滤
sql = f"select * from user_info where  name=%s and password=%s"cursor.execute(sql, (username, password))  # 自动识别并过滤res = cursor.fetchall()
if res:print('登录成功')
else:print('账号或密码错误')

四 小知识补充

  1. as语法
    起别名,可以给字段名起也可以给表起。
  2. comment语法
    给表字段添加注释信息
    查看描述信息的方法 show create table 表名
    use information_schema
  3. concat,concat_ws语法
    concat用于分组前多个字段的拼接,concat_ws是多个字段拼接并且分割符是一样的就可以使用concat_ws减少代码的书写。
  4. exists语法
    判断条件,如果有值就会执行前面的sql语句。

练习

1、查询所有的课程的名称以及对应的任课老师姓名

SELECTcourse.cname,teacher.tname
FROMcourseINNER JOIN teacher ON course.teacher_id = teacher.tid;

2、查询学生表中男女生各有多少人

SELECTgender,COUNT( sid )
FROMstudent
GROUP BYgender;

3、查询物理成绩等于100的学生的姓名

SELECT sname FROM student WHERE sid IN ( SELECT student_id FROM score WHERE course_id =( SELECT cid FROM course WHERE cname = '物理' ) AND num = 100
);

4、查询平均成绩大于八十分的同学的姓名和平均成绩

SELECTstudent.sname,new.avg_num
FROMstudentINNER JOIN ( SELECT student_id, AVG( num ) AS avg_num FROM score GROUP BY student_id HAVING AVG( num )> 80 ) AS new ON student.sid = new.student_id;

5、查询所有学生的学号,姓名,选课数,总成绩

SELECTstudent.sid,student.sname,new.xks,new.zcj
FROMstudentINNER JOIN ( SELECT student_id, COUNT( course_id ) AS xks, sum( num ) AS zcj FROM score GROUP BY student_id ) AS new ON student.sid = new.student_id;

6、 查询姓李老师的个数

SELECTCOUNT( tid ) AS '李姓老师个数'
FROMteacher
WHEREtname LIKE '李%'

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

SELECTsname
FROMstudent
WHEREsid NOT IN (SELECT DISTINCTstudent_id FROMscore WHEREcourse_id IN (SELECTcid FROMcourse WHEREteacher_id =(SELECTtid FROMteacher WHEREtname = '李平老师' )));

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

SELECTwl.student_id
FROM(SELECTstudent_id,num FROMscore WHEREcourse_id =(SELECTcid FROMcourse WHEREcname = '物理' )) AS wl INNER JOIN (SELECTstudent_id,num FROMscore WHEREcourse_id =(SELECTcid FROMcourse WHEREcname = '生物' )) AS sw ON wl.student_id = sw.student_id
WHEREwl.num > sw.num;

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

SELECTsname
FROMstudent
WHEREsid IN (SELECTstudent_id FROMscore WHEREcourse_id IN (SELECTcid FROMcourse WHEREcname IN ( '物理', '体育' )) GROUP BYstudent_id HAVINGCOUNT( course_id )= 1 );

10、查询挂科超过两门(包括两门)的学生姓名和班级

SELECTstudent.sname,class.caption
FROMclassINNER JOIN student ON class.cid = student.class_id
WHEREsid IN ( SELECT student_id FROM score WHERE num < 60 GROUP BY student_id HAVING COUNT( course_id ) >= 2 );

11、查询选修了所有课程的学生姓名

SELECTsname
FROMstudent
WHEREsid IN (SELECTstudent_id FROMscore GROUP BYstudent_id HAVINGCOUNT( course_id )=(SELECTcount( cid ) FROMcourse ));

12、查询李平老师教的课程的所有成绩记录

SELECTnum
FROMscore
WHEREcourse_id IN (SELECTcid FROMcourse WHEREteacher_id = ( SELECT tid FROM teacher WHERE tname = '李平老师' ));

13、查询全部学生都选修了的课程号和课程名

SELECTcid,cname
FROMcourse
WHEREcid IN (SELECTcourse_id FROMscore GROUP BYcourse_id HAVINGCOUNT( student_id )=(SELECTcount( sid ) FROMstudent ));

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

SELECTcourse_id,count( student_id )
FROMscore
GROUP BYcourse_id;

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

SELECTsname,sid
FROMstudent
WHEREsid IN ( SELECT student_id FROM score GROUP BY student_id HAVING count( course_id )= 1 );

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

SELECT DISTINCTnum
FROMscore
ORDER BYnum DESC;

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

SELECTstudent.sname,new.avg_num
FROMstudentINNER JOIN ( SELECT student_id, avg( num ) AS avg_num FROM score GROUP BY student_id HAVING avg( num ) > 85 ) AS new ON student.sid = new.student_id;

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

SELECTstudent.sname,new.num
FROMstudentINNER JOIN ( SELECT sid, num FROM score WHERE course_id = ( SELECT cid FROM course WHERE cname = '生物' ) AND num < 60 ) AS new ON student.sid = new.sid

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

SELECTstudent.sname,new.avg_num
FROMstudentINNER JOIN (SELECTstudent_id,avg( num ) AS avg_num FROMscore WHEREstudent_id IN (SELECT DISTINCTstudent_id FROMscore WHEREcourse_id IN (SELECTcid FROMcourse WHEREteacher_id =(SELECTtid FROMteacher WHEREtname = '李平老师' ))) GROUP BYstudent_id ORDER BYavg( num ) DESC ) AS new ON student.sid = new.student_id LIMIT 1;

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


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

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

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

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

三十三、数据库相关4相关推荐

  1. javaweb学习总结(三十三)——使用JDBC对数据库进行CRUD

    javaweb学习总结(三十三)--使用JDBC对数据库进行CRUD 一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过 ...

  2. 三十二、数据库相关3

    数据库相关 一 操作表的sql语句补充 二 表查询关键字 2.1 select from 2.2 where 筛选 2.3 group by 分组 2.4 having 过滤 2.5 distinct ...

  3. [Python从零到壹] 三十三.图像处理基础篇之什么是图像处理和OpenCV配置

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  4. 计算机网络 - 练习(二百三十三)

    计算机网络 练习(二百三十三) 以下关于入侵检测系统的描述中,正确的是(). A. 实现内外网隔离与访问控制 B. 对进出网络的信息进行实时的监测与比对,及时发现攻击行为 C. 隐藏内部网络拓扑 D. ...

  5. 使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置

    原文:使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置 摘要 讲解在IntelliJ IDEA中,如何进行Mysql数据库的配置 目录[-] 文章已针对IDEA 15做了一定的 ...

  6. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  7. 数据库相关中间件介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt412 这里主要介绍互联网行业内有关数据库的相关中间件.数据库相关平台主要解决 ...

  8. php调用mysql库_PHP调用三种数据库的方法(1)

    PHP调用三种数据库的方法(1) 更新时间:2006年10月09日 00:00:00   作者: MySQL是一个小巧灵珑的数据库服务器软件,对于中.小型应用系统是非常理想的.除了支持标准的ANSI ...

  9. 数据库相关的论文笔记

    db-readings 数据库相关的论文笔记 分布式理论-自问自答 GFS阅读问题 为什么存储三个副本?而不是两个或者四个? Chunk的大小为何选择64MB?这个选择主要基于哪些考虑? GFS主要支 ...

最新文章

  1. DeeCamp 2020 赛题大公开!快来看你想选哪个
  2. JEESZ架构、分布式服务:Dubbo+Zookeeper+Proxy+Restful
  3. css如何设置图转30度,使用CSS实现左右30度的摆钟
  4. 上海交通大学乐经良高数手写笔记-一元积分学
  5. 想要酷炫大气的网页设计?这样做超吸睛
  6. 局域网制作ftp服务器,如何架设内网ftp服务器 搭建ftp yum源
  7. [jQuery] Cannot read property ‘msie’ of undefined错误的解决方法
  8. cmd合并多个ts文件,ffmpeg快速转ts为mp4文件,通过m3u8合并文件
  9. jq 遍历map集合
  10. sass混合器,选择器的继承
  11. 益企工程云:成长型建筑企业专属的工程项目管理软件
  12. 运行edX Devstack
  13. NEO FANTASY:回合制策略游戏在ACGN文化与GameFi中的新探索09-07
  14. Linux:CPU频率调节模式以及降频方法简介
  15. 【CSAPP】家庭作业2.77~2.97
  16. clone别人远程仓库的代码,运行npm install报错npm ERR! Maximum call stack size exceeded
  17. 计算机毕设之 餐厅点餐app
  18. 蓝牙协议栈模组在linux ubuntu 跑蓝牙协议栈 --传统蓝牙搜索演示以及实现原理
  19. Android 音视频变速原理
  20. 基因-药物相互作用数据库 DGIdb 介绍

热门文章

  1. 混沌时间序列知识自学
  2. 电子工程师自学成才pdf_作为一名自学成才的软件工程师,我在第一个月的工作中所学到的知识
  3. 详解:二极管M7和A7的区别
  4. linux系统参数调优
  5. perform指标分析_如何看待Perform3D和Abaqus在结构分析中的作用
  6. Satwe楼板能用弹性模计算吗_satwe模型转perform-3d实例.pdf
  7. 【RX解码BT656输出】XS9922A 四合一同轴高清解码芯片方案 国产 交期无忧 对标TP9930
  8. JAVA--RSA加密
  9. Java实现多线程局域网聊天室
  10. 计算机图形学(2):OpenGL画球体