1. 删除数据

mysql> select course.cid, course.tid, score.grade, teacher.tname, count(teacher.tid) as count_teacher from course join score on score.grade < 60 and course.cid=score.cid join teacher on course.tid=teacher.tid group by course.tid order by count_teacher desc limit 5;
+-----+-----+-------+--------------------------+---------------+
| cid | tid | grade | tname                    | count_teacher |
+-----+-----+-------+--------------------------+---------------+
|  12 | 127 |    45 | 574c3344f37b9c6f3e       |           587 |
|  14 | 190 |    21 | ab5f646915d0005657dd7074 |           560 |
|  16 | 112 |    40 | e270e527                 |           555 |
|  11 | 157 |    19 | 86703bbdf4f546fb         |           550 |
|  13 | 186 |    12 | 827be3f52efd52596563cc   |           546 |
+-----+-----+-------+--------------------------+---------------+
5 rows in set (0.00 sec)mysql> select tid from (select course.cid, course.tid, score.grade, teacher.tname, count(teacher.tid) as count_teacher from course join score on score.grade < 60 and course.cid=score.cid join teacher on course.tid=teacher.tid group by course.tid order by count_teacher desc limit 5) as delete_teacher_id;           //必须重命名得到的字段,否则报错ERROR 1248 (42000): Every derived table must have its own alias
+-----+
| tid |
+-----+
| 127 |
| 190 |
| 112 |
| 157 |
| 186 |
+-----+
5 rows in set (0.00 sec)mysql> delete from teacher where tid in (select tid from (select course.cid, course.tid, score.grade, teacher.tname, count(teacher.tid) as count_teacher from course join score on score.grade < 60 and course.cid=score.cid join teacher on course.tid=teacher.tid group by course.tid order by count_teacher desc limit 5) as delete_teacher_id);
Query OK, 5 rows affected (0.01 sec)mysql> select course.cid, course.tid, score.grade, teacher.tname, count(teacher.tid) as count_teacher from course join score on score.grade < 60 and course.cid=score.cid join teacher on course.tid=teacher.tid group by course.tid order by count_teacher desc limit 5;
+-----+-----+-------+-------------------------+---------------+
| cid | tid | grade | tname                   | count_teacher |
+-----+-----+-------+-------------------------+---------------+
|  19 | 105 |    15 | 89c19462c2a967          |           524 |
|  20 | 101 |    18 | b78aa7d6a3f40960a062dad |           520 |
|  18 | 118 |    22 | 3ab1117efe9f4aa         |           518 |
|  15 | 167 |    52 | abf2c6018fc358766       |           512 |
|  17 | 116 |    46 | ff27c156ca5b8b47cb76    |           509 |
+-----+-----+-------+-------------------------+---------------+
5 rows in set (0.01 sec)

解析:
  1. 查询course表的课程id 和 老师id
  2. 关联score表,查询课程表的课程id和分数表的课程id 对应的少于60分的分数, 这时候得到的是所有不及格的课程
  3. 关联teacher表,查询课程表的老师id和老师表的老师id 对应的老师名字和老师id,  这时候得到的是这个老师负责的所有不及格的课程
  4. 把课程表的课程id分组,对组里的老师id做统计,然后排序得出前5
  5. 从teacher表中删除这5个tid对应的老师

2. 更新数据

需求:把分数低于5分的加60分
把分数低于5分的都查出来,然后加60分作为一个新列
mysql> select *, (grade+60) as new_grade from score where grade <5 limit 10;
+-------+-------+-----+-------+-----------+
| sid   | stdid | cid | grade | new_grade |
+-------+-------+-----+-------+-----------+
| 10003 | 13579 |  11 |     2 |        62 |
| 10034 | 11737 |  18 |     2 |        62 |
| 10061 | 14361 |  15 |     4 |        64 |
| 10089 | 19056 |  18 |     1 |        61 |
| 10103 | 15362 |  18 |     4 |        64 |
| 10109 | 17304 |  13 |     3 |        63 |
| 10127 | 10554 |  13 |     2 |        62 |
| 10185 | 16417 |  20 |     1 |        61 |
| 10199 | 15302 |  16 |     4 |        64 |
| 10225 | 19942 |  18 |     1 |        61 |
+-------+-------+-----+-------+-----------+
10 rows in set (0.00 sec)

更新数据:把低于5分的都加60分

mysql> update score set grade=grade+60 where grade < 5;
Query OK, 434 rows affected (0.00 sec)
Rows matched: 434  Changed: 434  Warnings: 0mysql> select * from score where grade <5;
Empty set (0.00 sec)

3. mysql索引

  1. 索引的概念
索引是一种特殊的文件(innodb数据表上的索引是表空间的一个组成部分),包含着对数据表里所有记录的引用指针
通俗地说,数据表如果是一本书,那么索引就是书的目录,能加快查询数据表的数据
索引是牺牲磁盘空间获得查询速度的提升
  1. 索引的分类
  • 2.1 普通索引
普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的访问速度
因此,应该只为那些最经常出现在查询条件(WHERE column =)或排序条件(ORDER BY column)中的数据列创建索引
只要有可能,应该选择一个数据最整齐、最紧凑的数据列(例如一个int类型的数据列)来创建索引
  • 2.2 唯一索引
普通索引允许被索引的数据列包含重复的值。比如说,因为人有可能同名,所以同一个姓名在同一个“员工个人资料”数据表里可能出现两次或更多次
如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE 把它定义为一个唯一索引
这么做的好处:一是简化了 MySQL 对这个索引的管理工作,这个索引也因此而变得更有效率;二是 MySQL 会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经存在于数据表中,如果是,MySQL 将拒绝插入那条新记录
也就是说,唯一索引可以保证数据记录的唯一性。事实上在很多场景,创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复
  • 2.3 主索引
mysql会为主键自动创建一个主索引,主键创建的索引称为主索引
主索引与唯一索引的唯一区别是:前者在定义时使用的关键字是 PRIMARY 而不是 UNIQUE
  • 2.4 外键索引
如果为某个外键字段定义了一个外键约束条件,MySQL 就会定义一个内部索引来帮助自己以最有效率的方式去管理和使用外键约束条件
  • 2.5 复合索引
索引可以覆盖多个数据列,INDEX(columnA, columnB)定义的就是一个复合索引
这种索引的特点是 MySQL 可以有选择地使用一个这样的索引。如果查询操作只需要用到 columnA 数据列上的一个索引,就可以使用复合索引 INDEX(columnA, columnB)。不过,这种用法仅适用于在复合索引中排列在前的数据列组合。比如说,INDEX (A,B,C) 可以当做 A 或 (A,B) 的索引来使用,但不能当做 B、C 或 (B,C) 的索引来使用
  1. mysql主键和索引的区别
主键一定是唯一性索引,唯一性索引并不一定就是主键
所谓主键就是能够唯一标识表中某一行的属性或属性组的索引,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。数据库在设计时,主键起到了很重要的作用
主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引
一个表中可以有多个唯一性索引,但只能有一个主键
主键列不允许空值,而唯一性索引列允许空值
索引可以提高查询的速度
创建复合索引演示
mysql> alter table score add index idx_stdid_cid(stdid, cid);                //为stdid字段和cid字段创建一个复合索引
Query OK, 0 rows affected (0.16 sec)
Records: 0  Duplicates: 0  Warnings: 0mysql> explain select * from score where stdid=17654;                       //使用explain关键字查看查询是否使用了索引
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key           | key_len | ref   | rows | Extra |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------+
|  1 | SIMPLE      | score | ref  | idx_stdid_cid | idx_stdid_cid | 4       | const |    2 | NULL  |
+----+-------------+-------+------+---------------+---------------+---------+-------+------+-------+
1 row in set (0.00 sec)mysql> select * from score where stdid=17654;
+-------+-------+-----+-------+
| sid   | stdid | cid | grade |
+-------+-------+-----+-------+
| 10760 | 17654 |  12 |    35 |
| 10005 | 17654 |  13 |    12 |
+-------+-------+-----+-------+
2 rows in set (0.00 sec)mysql> explain select * from score where stdid=10380 and cid=13;        //idx_stdid_cid(stdid, cid)这个复合索引只能用作字段stdid的索引或者stdid和cid共同查询时使用的索引
+----+-------------+-------+------+---------------+---------------+---------+-------------+------+-------+
| id | select_type | table | type | possible_keys | key           | key_len | ref         | rows | Extra |
+----+-------------+-------+------+---------------+---------------+---------+-------------+------+-------+
|  1 | SIMPLE      | score | ref  | idx_stdid_cid | idx_stdid_cid | 8       | const,const |    1 | NULL  |
+----+-------------+-------+------+---------------+---------------+---------+-------------+------+-------+
1 row in set (0.01 sec)mysql> select * from score where stdid=10380 and cid=13;
+-------+-------+-----+-------+
| sid   | stdid | cid | grade |
+-------+-------+-----+-------+
| 10007 | 10380 |  13 |    36 |
+-------+-------+-----+-------+
1 row in set (0.00 sec)mysql> explain select * from score where stdid=10380 and cid>13;
+----+-------------+-------+-------+---------------+---------------+---------+------+------+-----------------------+
| id | select_type | table | type  | possible_keys | key           | key_len | ref  | rows | Extra                 |
+----+-------------+-------+-------+---------------+---------------+---------+------+------+-----------------------+
|  1 | SIMPLE      | score | range | idx_stdid_cid | idx_stdid_cid | 8       | NULL |    2 | Using index condition |
+----+-------------+-------+-------+---------------+---------------+---------+------+------+-----------------------+
1 row in set (0.00 sec)mysql> explain select * from score where stdid>10380 and cid>13;         //如果where条件没有使用关系型运算符= , 那么查询不走索引
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | score | ALL  | idx_stdid_cid | NULL | NULL    | NULL | 10294 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
1 row in set (0.00 sec)

转载于:https://www.cnblogs.com/tobeone/p/7888923.html

python操作mysql(四)相关推荐

  1. python mysql倒序_day40:MySQL:python操作mysql:pymysql模块SQL注入攻击

    目录 part1:用python连接mysql 1.用python连接mysql的基本语法 创建连接conn→创建游标对象cursor→执行sql语句execute→获取数据fetchone→释放游标 ...

  2. python操作MySQL 模拟简单银行转账操作

    一.基础知识 1.MySQL-python的安装 下载,然后 pip install 安装包 2.python编写通用数据库程序的API规范 (1).数据库连接对象 connection,建立pyth ...

  3. python操作mysql中的表_带你了解什么是Python操作MySQL数据库

    写这篇文章主要是为了介绍Python操作MySQL数据库,并结合相应的实例带你更加深入了解.文中的代码实例很详细,对大家有一定的参考学习价值. 1.什么是pymysql? PyMySQL是在Pytho ...

  4. python操作mysql事务提交_python关于Mysql操作

    一.安装mysql windows下,直接下载mysql安装文件,双击安装文件下一步进行操作即可, Linux下的安装也很简单,除了下载安装包进行安装外,一般的linux仓库中都会有mysql ,我们 ...

  5. Python操作MySQL

    一 用户管理 用户在数据库操作系统中,是一个设计到数据安全的非常重要的数据库对象,在MySQL系统的数据库中root用户作为超级管理员用户,通常情况下不会给普通用户使用,所以掌握数据库管理系统中的用户 ...

  6. python操作mysql数据库练习

    python操作mysql数据库练习 本次练习是在windows下,mysql版本为5.7,python版本为2.7.5,集成环境为pycharm. 创建表时,enign在innodb下支持事务,其他 ...

  7. Python操作MySQL分享

    Python操作MySQL Python操作MySQL 关于MySQL数据库 开始之前 _mysql模块 MySQLdb模块 1. 第一个例子 2. 创建并填充表 3. 取回数据 4. 字典游标 5. ...

  8. 数据库——python操作MySQL、修改表SQL语句、视图、触发器、存储过程、事务、流程控制、常见函数、索引

    文章目录 一.python操作MySQL 1.pymysql模块 1.基本使用 2.sql注入问题 3.二次确认 二.修改表SQL语句 1.修改表的名字 rename 2.添加字段 add 3.修改字 ...

  9. python socket mysql_5.Python操作MySQL,三层架构,Socket网络编程

    Python操作MySQL - MySQL之查询操作 - MySQL之插入数据 - MySQL之批量插入数据 - MySQL之删除数据 - MySQL之更新数据库 - MySQL之事务 - MySQL ...

  10. 15.python操作mysql

    15.python操作mysql 导入包 from pymysql import* 1. 创建 Connection 连接 conn=conne(host='192.168.13.130',port= ...

最新文章

  1. Nginx配置和内核优化 实现突破十万并发
  2. App用户体验的一点思考
  3. MySql命令行基本操作
  4. 暑期训练日志----2018.8.16
  5. Server 2016DC查看五种AD角色的方法
  6. 拓端tecdat|matlab使用样条插值重采样估计INR数据研究
  7. springboot 配置mybatis
  8. Python 科学计算
  9. 刷网课-踩坑——jsDOM获取不到页面元素节点-iframe标签获取元素节点
  10. http://bt.neu6.edu.cn/forum.php,分享一些教育网访问较快的站点~
  11. 今天把中国建设银行APP4.2.1版iOS客户端里所有的功能都点了一遍
  12. 知识图谱构建技术简介
  13. HDU5285.wyh2000 and pupil
  14. postgres使用with计算占比,同比和环比
  15. Python串口操作纸币器1
  16. 静态链接库(Lib) 与 动态链接库(DLL)
  17. 医学图像分割知识点总结
  18. 微信小程序影视评论交流平台系统毕业设计毕设(2)小程序功能
  19. 聊聊APP数据分析的那些思路
  20. unity音乐计算机谱子,Unity钢琴简谱-数字双手-Alan Walker

热门文章

  1. java和python哪个好就业2020-python和java自学哪个好?
  2. 用python绘制漂亮的图形-用Python画一些漂亮图形--Quora代码赏析
  3. python处理excel-使用python将数据写入excel
  4. python中文意思k-python中“//”表示什么意思_后端开发
  5. python电脑下载什么软件好-Python工具 | 4个好用的开源 Python 下载器
  6. python游戏脚本实例-python实现的简单文本类游戏实例
  7. 如何自学python数据分析-Python学习干货 |如何用Python进行数据分析?
  8. 学python就业要看哪些书-编程0基础自学Python,踩完这些坑,我才成功就业!
  9. 学python那本书比较好-Python初学者最应该读的8本书
  10. python while循环语句-Python