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]$';
python-day43--单表查询之关键字执行优先级(重点)的更多相关文章
- MySQL数据库之单表查询中关键字的执行顺序
目录 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 2 执行顺序 3 关键字使用语法 MySQL数据库之单表查询中关键字的执行顺序 1 语法顺序 select distinct from ...
- python mysql 单表查询 多表查询
一.外键 变种: 三种关系: 多对一 站在左表的角度: (1)一个员工 能不能在 多个部门? 不成立 (2)多个员工 能不能在 一个部门? 成立 只要有一个条件成立:多 对 一或者是1对多 如果两个条 ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
- 0x06 MySQL 单表查询
一 单表查询语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 二 关键字 ...
- MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询
MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...
- python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)
12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...
- python实现简易数据库之二——单表查询和top N实现
上一篇中,介绍了我们的存储和索引建立过程,这篇将介绍SQL查询.单表查询和TOPN实现. 一.SQL解析 正规的sql解析是用语法分析器,但是我找了好久,只知道可以用YACC.BISON等,sqlit ...
- python 3 mysql 单表查询
python 3 mysql 单表查询 1.准备表 company.employee 员工id id int 姓名 emp_name varchar 性别 sex enum 年龄 age int 入职 ...
- Python进阶----pymysql模块的使用,单表查询
Python进阶----pymysql模块的使用,单表查询 一丶使用pymysql 1.下载pymysql包: pip3 install pymysql 2.编写代码 ...
随机推荐
- 使用 Laravel 数据填充生成 中文 测试数据
Laravel5.4 及更新版本设置了相关的配置项 app.faker_locale,只不过在文档和默认的配置文件中看不到这一参数.相关源码在 Illuminate\Database\Database ...
- C/C++之进制转换
二进制.八进制.十进制.十六进制之间转换 一. 十进制与二进制之间的转换 (1) 十进制转换为二进制,分为整数部分和小数部分 ① 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权 ...
- pyDay6
内容来自廖雪峰的官方网站 1.在Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好,1行代码能实现的功能,决不写5行代码.请始终牢记,代码越少,开发效率越高. 2.取指 ...
- bzoj1648 / P2853 [USACO06DEC]牛的野餐Cow Picnic
P2853 [USACO06DEC]牛的野餐Cow Picnic 你愿意的话,可以写dj. 然鹅,对一个缺时间的退役选手来说,暴力模拟是一个不错的选择. 让每个奶牛都把图走一遍,显然那些被每个奶牛都走 ...
- jenkins 安装 + maven + git部署
1. 安装JDK 2. 安装maven 3. 安装git 4. 安装tomcat tar zxvf apache-tomcat-8.5.14.tar.gz 找到tomcat-->config-- ...
- bzoj 1096 仓库建设 -斜率优化
L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L先生接到气 ...
- 求LCA练习+部分算法复习 2017.1.22
第一题就LCA即可.不过推荐用Tarjan(最快,常数很小).然后Tarjan的时候顺便就出一个dist[i],表示i节点到根节点的距离.求出了LCA,那么两点间的距离就为dist[u] + dist ...
- Win32程序支持命令行参数的做法(转载)
转载:http://www.cnblogs.com/lanzhi/p/6470406.html 转载:http://blog.csdn.net/kelsel/article/details/52759 ...
- Python3基础 dict keys+values 循环打印字典中的所有键和值
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Git 基础 —— 安装 配置 别名 对象
Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 Git 安装 Git下载地址 ...