python-day43--单表查询之关键字执行优先级(重点)

一、关键字的执行优先级(重点)

1.关键字执行优先级

from
where        #约束条件(在数据产生之前执行)
group by     #分组    没有分组则默认一组
按照select后的字段取得一张新的虚拟表,有聚合函数则执行聚合函数
having         #过滤条件 ,having 是根据内存中的虚拟表 过滤的 ;出现having的时候肯定是有group by,不然没意义
distinct     #去重        #在select 之后执行  忽略先后顺序
order by     #排序          #在select 之后执行  忽略先后顺序
limit        #限制查询的记录数    #在select 之后执行  忽略先后顺序

  1.找到表:from
  2.拿着where指定的约束条件,去文件/表中取出一条条记录
  3.将取出的一条条记录进行分组group by,如果没有group by,则整体作为一组
  4.按照select后的字段得到一张新的虚拟表,如果有聚合函数,则将组内数据进行聚合
  5.将4的结果过滤:having
  6.查出结果:select
  7.去重
  8.将结果按条件排序:order by
  9.限制结果的显示条数

2.having与where不一样的地方在于!!!!!!

#!!!执行优先级从高到低:where > group by > 聚合函数 > having
#1. Where 是一个约束声明,使用Where约束来自数据库的数据,Where是在结果返回之前起作用的(先找到表,按照where的约束条件,从表(文件)中取出数据),Where中不能使用聚合函数。
#2. Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作(先找到表,按照where的约束条件,从表(文件)中取出数据,然后group by分组,如果没有group by则所有记录整体为一组,然后执行聚合函数,然后使用having对聚合的结果进行过滤),在Having中可以使用聚合函数。
#3. having可以放到group by之后,而where只能放到group by之前
#4. 在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行。而where子句在查询过程中执行优先级高于聚合语句。

验证不同之处:

#验证之前再次强调:执行优先级从高到低:where > group by > 聚合函数 > having
select count(id) from employee where salary > 10000; #正确,分析:where先执行,后执行聚合count(id),然后select出结果
select count(id) from employee having salary > 10000;#错误,分析:先执行聚合count(id),后执行having过滤,无法对id进行salary>10000的过滤

以上两条sql的顺序是:

1:找到表employee--->用where过滤---->没有分组则默认一组执行聚合count(id)--->select执行查看组内id数目
2:找到表employee--->没有分组则默认一组执行聚合count(id)---->having 基于上一步聚合的结果(此时只有count(id)字段了)进行salary>10000的过滤,很明显,根本无法获取到salary字段

其他需要注意的问题:

select post,group_concat(name) from employee group by post having salary > 10000;#错误,分组后无法直接取到salary字段
select post,group_concat(name) from employee group by post having avg(salary) > 10000; 正确

例子:

例子:
select max(salary) from t1 where id > 2 group by depart_id having count(id) > 2;
执行顺序: from t1 ——> where id >2  ——>  group by depart_id ——>  max(salary)和count(id) 然后才执行 having count(id) >2   最后打印

辅助理解:select 333333333 from t1 where id > 2 group by depart_id having 4 > 2;

练习:

#练习
select post,count(id),group_concat(name) from emp group by post having count(id) < 2;      #可以运行
select count(id) from emp having id > 15;            #运行错误

3.命名

命名:
select post,avg(salary) as 平均工资 from emp group by post having avg(salary) > 10000;
select post 岗位名,avg(salary) 平均工资 from emp group by post having avg(salary) > 10000;    #命名时 as 可以省略

4.order by关键字

select * from emp order by salary;    #默认就是升序
select * from emp order by salary asc; #升序
select * from emp order by salary desc; #降序
select * from emp order by age asc,salary desc; #先按照年龄从小到大排,如果年龄分不出胜负(即值相同)再按照salary从大到小排。

练习:

select * from emp order by age asc,hire_date desc;
select post 岗位名,avg(salary) 平均工资 from emp group by post having avg(salary) > 10000 order by avg(salary) asc;

5.通过四则运算查询:

select name, salary*12 AS Annual_salary FROM employee;
select name, salary*12 Annual_salary FROM employee;
select * from employee where id%2=1;  

6.定义显示格式:

1.CONCAT() 函数用于连接字符串
   SELECT CONCAT(‘姓名: ‘,name,‘  年薪: ‘, salary*12)  AS Annual_salary FROM employee;

mysql> SELECT CONCAT(‘姓名: ‘,name,‘  年薪: ‘, salary*12)  AS Annual_salary
    ->    FROM emp;
+---------------------------------------+
| Annual_salary                         |
+---------------------------------------+
| 姓名: egon  年薪: 87603.96            |
| 姓名: alex  年薪: 12000003.72         |
| 姓名: wupeiqi  年薪: 99600.00         |
| 姓名: yuanhao  年薪: 42000.00         |
| 姓名: liwenzhou  年薪: 25200.00       |
| 姓名: jingliyang  年薪: 108000.00     |
| 姓名: jinxin  年薪: 360000.00         |
| 姓名: 成龙  年薪: 120000.00           |
| 姓名: 歪歪  年薪: 36001.56            |
| 姓名: 丫丫  年薪: 24004.20            |
| 姓名: 丁丁  年薪: 12004.44            |
| 姓名: 星星  年薪: 36003.48            |
| 姓名: 格格  年薪: 48003.96            |
| 姓名: 张野  年薪: 120001.56           |
| 姓名: 程咬金  年薪: 240000.00         |
| 姓名: 程咬银  年薪: 228000.00         |
| 姓名: 程咬铜  年薪: 216000.00         |
| 姓名: 程咬铁  年薪: 204000.00         |
+---------------------------------------+
18 rows in set (0.00 sec)

2.CONCAT_WS() 第一个参数为分隔符
   SELECT CONCAT_WS(‘:‘,name,salary*12)  AS Annual_salary FROM employee;

mysql> SELECT CONCAT_WS(‘:‘,name,salary*12)  AS Annual_salary
    ->    FROM emp;
+----------------------+
| Annual_salary        |
+----------------------+
| egon:87603.96        |
| alex:12000003.72     |
| wupeiqi:99600.00     |
| yuanhao:42000.00     |
| liwenzhou:25200.00   |
| jingliyang:108000.00 |
| jinxin:360000.00     |
| 成龙:120000.00       |
| 歪歪:36001.56        |
| 丫丫:24004.20        |
| 丁丁:12004.44        |
| 星星:36003.48        |
| 格格:48003.96        |
| 张野:120001.56       |
| 程咬金:240000.00     |
| 程咬银:228000.00     |
| 程咬铜:216000.00     |
| 程咬铁:204000.00     |
+----------------------+
18 rows in set (0.00 sec)

7. limit   限制查询的记录数

  1. select * from emp limit 10;     #第一条到第十条记录

mysql> select * from emp limit 10;
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| id | name       | sex    | age | hire_date  | post                                    | post_comment | salary     | office | depart_id |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
|  1 | egon       | male   |  18 | 2017-03-01 | 老男孩驻沙河办事处外交大使              | NULL         |    7300.33 |    401 |         1 |
|  2 | alex       | male   |  78 | 2015-03-02 | teacher                                 | NULL         | 1000000.31 |    401 |         1 |
|  3 | wupeiqi    | male   |  81 | 2013-03-05 | teacher                                 | NULL         |    8300.00 |    401 |         1 |
|  4 | yuanhao    | male   |  73 | 2014-07-01 | teacher                                 | NULL         |    3500.00 |    401 |         1 |
|  5 | liwenzhou  | male   |  28 | 2012-11-01 | teacher                                 | NULL         |    2100.00 |    401 |         1 |
|  6 | jingliyang | female |  18 | 2011-02-11 | teacher                                 | NULL         |    9000.00 |    401 |         1 |
|  7 | jinxin     | male   |  18 | 1900-03-01 | teacher                                 | NULL         |   30000.00 |    401 |         1 |
|  8 | 成龙       | male   |  48 | 2010-11-11 | teacher                                 | NULL         |   10000.00 |    401 |         1 |
|  9 | 歪歪       | female |  48 | 2015-03-11 | sale                                    | NULL         |    3000.13 |    402 |         2 |
| 10 | 丫丫       | female |  38 | 2010-11-01 | sale                                    | NULL         |    2000.35 |    402 |         2 |
+----+------------+--------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
10 rows in set (0.00 sec)

  2.从哪开始,往后取几条    第一个数字表示的是索引,第二个代表步距
  select * from emp limit 0,3;    #第一条开始往后三条

select * from emp limit 0,3;    #第一条开始往后三条

+----+---------+------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
| id | name    | sex  | age | hire_date  | post                                    | post_comment | salary     | office | depart_id |
+----+---------+------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
|  1 | egon    | male |  18 | 2017-03-01 | 老男孩驻沙河办事处外交大使              | NULL         |    7300.33 |    401 |         1 |
|  2 | alex    | male |  78 | 2015-03-02 | teacher                                 | NULL         | 1000000.31 |    401 |         1 |
|  3 | wupeiqi | male |  81 | 2013-03-05 | teacher                                 | NULL         |    8300.00 |    401 |         1 |
+----+---------+------+-----+------------+-----------------------------------------+--------------+------------+--------+-----------+
3 rows in set (0.00 sec)

select * from emp limit 3,3;

+----+------------+--------+-----+------------+---------+--------------+---------+--------+-----------+
| id | name       | sex    | age | hire_date  | post    | post_comment | salary  | office | depart_id |
+----+------------+--------+-----+------------+---------+--------------+---------+--------+-----------+
|  4 | yuanhao    | male   |  73 | 2014-07-01 | teacher | NULL         | 3500.00 |    401 |         1 |
|  5 | liwenzhou  | male   |  28 | 2012-11-01 | teacher | NULL         | 2100.00 |    401 |         1 |
|  6 | jingliyang | female |  18 | 2011-02-11 | teacher | NULL         | 9000.00 |    401 |         1 |
+----+------------+--------+-----+------------+---------+--------------+---------+--------+-----------+
3 rows in set (0.00 sec)

select * from emp limit 6,3;

 +----+--------+--------+-----+------------+---------+--------------+----------+--------+-----------+
| id | name   | sex    | age | hire_date  | post    | post_comment | salary   | office | depart_id |
+----+--------+--------+-----+------------+---------+--------------+----------+--------+-----------+
|  7 | jinxin | male   |  18 | 1900-03-01 | teacher | NULL         | 30000.00 |    401 |         1 |
|  8 | 成龙   | male   |  48 | 2010-11-11 | teacher | NULL         | 10000.00 |    401 |         1 |
|  9 | 歪歪   | female |  48 | 2015-03-11 | sale    | NULL         |  3000.13 |    402 |         2 |
+----+--------+--------+-----+------------+---------+--------------+----------+--------+-----------+
3 rows in set (0.00 sec)   

8.distinct  去重

select distinct sex from emp;

+--------+
| sex    |
+--------+
| male   |
| female |
+--------+
2 rows in set (0.00 sec)

9.where name 正则

SELECT * FROM employee WHERE name REGEXP ‘^ale‘;

SELECT * FROM employee WHERE name REGEXP ‘on$‘;

SELECT * FROM employee WHERE name REGEXP ‘m{2}‘;

小结:对字符串匹配的方式
WHERE name = ‘egon‘;
WHERE name LIKE ‘yua%‘;
WHERE name REGEXP ‘on$‘;

  小练习:查看所有员工中名字是jin开头,n或者g结果的员工信息

select * from employee where name regexp ‘^jin.*[gn]$‘;

时间: 2024-08-01 03:01:22

python-day43--单表查询之关键字执行优先级(重点)的相关文章

0x06 MySQL 单表查询

一 单表查询语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键字执行优先级(重点) 重点中的重点:关键字的执行优先级 1)from 2)where 3)group by 4)having 5)select 6)distinct 7)order by 8)limit 1.找到表:from 2.拿着where指定的约束条件,去文件/表中取出一条条记录 3.将取出的一

python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings") import django django.setup() # 启动Django项目 from app01 import models #返回QuerySet对象的方法: r

python开发mysql:单表查询&amp;多表查询

一 单表查询,以下是表内容 1 一 having 过滤 2 1.1 having和where 3 select * from emp where id > 15; 4 解析过程;from > where 找到数据 > 分组(没有默认一个组)> select 打印 where是出结果之前 5 select * from emp having id > 15; 6 解析过程;from > where 找到数据(没有约束条件,就是整个表)) > 分组(没有默认一个组)&

python学习第七十四天:单表查询

单表查询 创建表 创建模型 在models.py中定义类,一个类就是一张表 from django.db import models class Book(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64) pub_data = models.DateField() price = models.DecimalField(max_digits=5, decima

python之路--MySQl单表查询

一 单表查询语法 #查询数据的本质:mysql会到你本地的硬盘上找到对应的文件,然后打开文件,按照你的查询条件来找出你需要的数据.下面是完整的一个单表查询的语法 select * from,这个select * 指的是要查询所有字段的数据. SELECT distinct 字段1,字段2... FROM 库名.表名 #from后面是说从库的某个表中去找数据,mysql会去找到这个库对应的文件夹下去找到你表名对应的那个数据文件,找不到就直接报错了,找到了就继续后面的操作 WHERE 条件 #从表中

python 之 数据库(修改表、复制表、删除表、单表查询)

10.8 修改表.复制表.删除表 10.81 修改表 alter table 1. 修改表名 alter table 表名 rename 新表名; 2. 增加字段 alter table 表名 add 字段名 数据类型 [完整性约束条件…]; alter table t1 add stu char(10) not null after name; #添加到name字段之后 alter table t1 add sex enum('male','female') default 'male' fi

单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询

今日内容 表查询 单表查询: where group by 分组 having distinct 去重 order by 排序 limit 多表查询 子查询 连表查询 单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) u

MySQL数据库 多表查询 交叉连接 自然连接 内连接 自连接 外连接 子查询 多表查询练习 单表查询练习 &#109806;

原文: http://blog.gqylpy.com/gqy/466 置顶:来自一名75后老程序员的武林秘籍--必读(博主推荐) 来,先呈上武林秘籍链接:http://blog.gqylpy.com/gqy/401/ 你好,我是一名极客!一个 75 后的老工程师! 我将花两分钟,表述清楚我让你读这段文字的目的! 如果你看过武侠小说,你可以把这个经历理解为,你失足落入一个山洞遇到了一位垂暮的老者!而这位老者打算传你一套武功秘籍! 没错,我就是这个老者! 干研发 20 多年了!我也年轻过,奋斗过!我

mysql四-1:单表查询

阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询 一 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键字的执行优先级(重点) 重点中的重点:关键字的执行优先级 f