DQL语句

  • [----- 》数据库文件 点击此链接下载 《-------](https://download.csdn.net/download/weixin_45260385/15452324)
    • (1) 基础查询
      • ① 基础查询语句
      • ② 查询常量值
      • ③ 查询表达式
      • ④ 查询函数
      • ⑤ 起别名
        • 练习一:
        • 练习二:
      • ⑥ 去重
      • ⑦ CONCAT 连接
      • -------------------------------------------------------------------
    • (2) 条件查询 (AND , OR , NOT)
      • -------------------------------------------------------------------
    • (3) 模糊查询 (like,between and , in .......)
      • 简单通配符:
      • 转义符:
      • ① like 关键字
        • 练习一 (%):
        • 练习二 (% _):
        • 练习三 (% _ \ ):
        • 练习四 (% _ escape ):
      • ② between and 关键字
      • ③ in 关键字
      • ④ is null 关键字
      • ⑤ is not null 关键字
      • -------------------------------------------------------------------
    • (4) 排序查询 (order by)
        • 练习一 (DESC , ASC):
        • 练习二 (添加筛选条件):
        • 练习三 (按表达式的别名排序):
        • 练习四 (按函数排序):
        • 练习五 (按多个字段主次排序):
      • -------------------------------------------------------------------
    • (5) 常见函数
      • ---------------------------单行函数---------------------------
      • 单行函数 --- 字符函数 ① ~ ⑧:
      • ① length() 字符长度
      • ② concat() 字符拼接
      • ③ upper() ,lower() 大写,小写
      • ④ substr() (全称:substring) 截取
        • 练习一 :
        • 练习二 :
        • 练习三 (concat,substr,upper,lower):
      • ⑤ trim()
        • 练习一 (去空格):
        • 练习二 (去指定字符):
      • ⑥ lpad() 左填充长度
      • ⑦ rpad() 右填充长度
      • ⑧ replace() 置换
      • 单行函数 --- 数字函数 ① ~ ⑤:
      • ① round() 四舍五入
      • ② ceil() 向上取整
      • ③ floor() 向下取整
      • ④ truncate() 截断
      • ⑤ mod() 取余
      • 单行函数 --- 日期函数 ① ~ ⑤:
      • ① now() 返回当前系统日期+时间
      • ② curdate() 返回当前系统日期,不包含时间
      • ③ curtime() 返回当前时间,不包含日期
      • ④ str_to_date() 字符转日期
      • ⑤ year() ,month() ,day() 分别获取年月日
      • 单行函数 --- 流程控制函数 ① ~ ②:
      • ① if()
      • ② case()
      • ---------------------------分组函数---------------------------
      • 分组函数的特点
      • 分组函数 --- 简单使用 :
      • ① sum(),avg(),max(),min(),count()
      • 分组函数 --- 搭配distinct :
      • ① sum() + distinct
      • ② count() + distinct
      • -------------------------------------------------------------------
    • (6) 分组查询 (group by)
      • 分组查询的特点
      • ① 简单使用 group by
      • ② 添加分组前筛选
        • 练习一 :
        • 练习二 :
      • ③ 添加分组后筛选 (having)
        • 练习一 :
        • 练习二 :
        • 练习三 :
      • ④ 按函数分组
      • ⑤ 按多个字段分组
      • -------------------------------------------------------------------
    • (7) 连接查询
      • ---------------------------sql92标准---------------------------
      • ① 等值连接 (sql92标准)
        • 练习一 :
        • 练习二 :
        • 练习三 (加筛选):
        • 练习四 (加筛选):
        • 练习五 (加分组):
        • 练习六 (加排序):
        • 练习七 (三表连接):
      • ② 非等值连接 (sql92标准)
      • ③ 自连接 (sql92标准)
      • ---------------------------sql99标准---------------------------
    • 内连接
      • ① 等值连接 (sql99标准)
        • 练习一 :
        • 练习二 (加筛选):
        • 练习三 (添加分组加筛选):
        • 练习四 (加排序):
        • 练习五 (三表连接):
      • ② 非等值连接 (sql99标准)
        • 练习一 :
        • 练习二 (加筛选,排序,分组) :
      • ③ 自连接 (sql99标准)
    • 外连接
      • 外连接的应用场景和特点:
      • ① 左(右)外连接
        • 练习一 :
        • 练习二 :
        • 练习三 :
      • ② 交叉连接
      • -------------------------------------------------------------------
    • (8) 子查询
      • ① where 后面的标量子查询
        • 练习一 :
        • 练习二 :
        • 练习三 :
        • 练习四 :
      • ② where 后面的列子查询 (in,any,some,all)
        • 练习一 :
        • 练习二 :
      • ③ where 后面的行子查询
      • ④ select 后面的标量子查询
      • ⑤ from 后面的表子查询
      • ③ exists 后面的表子查询 (相关子查询)
        • 练习一 :
        • 练习二 :
      • -------------------------------------------------------------------
    • (9) 分页查询 (limit)
      • 分页查询的应用场景和特点
        • 练习一 :
        • 练习二 :
        • 练习三 :
      • -------------------------------------------------------------------
    • (10) 联合查询 (union)
      • 联合查询的应用场景特点:


----- 》数据库文件 点击此链接下载 《-------



(1) 基础查询

① 基础查询语句

SELECT * FROM employees ;


② 查询常量值

SELECT 'andy';


③ 查询表达式

SELECT 50+50*50 ;


④ 查询函数

SELECT VERSION() ;


⑤ 起别名

ps : 可省略 AS , 中间有空格即可
ps : 别名建议打双引号
练习一:
SELECT 100*50 AS "结果" ;


练习二:
SELECTlast_name AS "姓",first_name AS "名"
FROMemployees


⑥ 去重

使用 DISTINCT 关键字 进行去重

# 查询员工表中所有 部门编号 (不要重复)
SELECT DISTINCTdepartment_id
FROMemployees;


⑦ CONCAT 连接

使用 CONCAT 关键字 进行字段连接

# 拼接字段内容
SELECTCONCAT( last_name, first_name ) AS "结果"
FROMemployees;


-------------------------------------------------------------------

(2) 条件查询 (AND , OR , NOT)

AND : 都是 true 才为 true ,否则为 falseOR : 至少有一个为 true 则为 true ,否则为 falseNOT : 取反,true 为 false,false 为 true
# 案例:查询部门编号不在 90-110 之间 或者 工资高于 15000 的员工信息
SELECT*
FROMemployees
WHERENOT ( department_id >= 90 AND department_id <= 110 ) OR salary >= 15000;


-------------------------------------------------------------------

(3) 模糊查询 (like,between and , in …)

简单通配符:

% : 任意多个字符(包含0个字符)_ : 任意单个字符

转义符:

\escape

① like 关键字

练习一 (%):
# 案例:查询 first_name 为 d 开头的员工信息
SELECT*
FROMemployees
WHEREfirst_name LIKE 'd%';


练习二 (% _):
# 案例:查询 first_name 中第一个字符为d,第三个字符为n的员工信息
SELECT*
FROMemployees
WHEREfirst_name LIKE 'd_n%';


练习三 (% _ \ ):
# 案例:查询 last_name 中第二个字符为_的员工信息
SELECT*
FROMemployees
WHERElast_name LIKE '_\_%';


练习四 (% _ escape ):

此时 $ 相当于 \ (推荐)

# 案例:查询 last_name 中第二个字符为_的员工信息
SELECT*
FROMemployees
WHERElast_name LIKE '_$_%' ESCAPE '$';


② between and 关键字

# 案例:查询 工资在 10000-20000 的员工信息
SELECT*
FROMemployees
WHEREsalary BETWEEN 10000 AND 20000 ;


③ in 关键字

# 案例:查询 工作编号 为 AD_VP,SA_MAN,PR_REP 的员工信息
SELECT*
FROMemployees
WHEREjob_id IN ("AD_VP" , "SA_MAN" , "PR_REP") ;


④ is null 关键字

# 案例:查询 奖金率 为 null的员工编号,奖金率
SELECTemployee_id,commission_pct
FROMemployees
WHEREcommission_pct IS NULL ;


⑤ is not null 关键字

# 案例:查询 奖金率 不为 null的员工编号,奖金率
SELECTemployee_id,commission_pct
FROMemployees
WHEREcommission_pct IS NOT NULL ;


-------------------------------------------------------------------

(4) 排序查询 (order by)

DESC: 降序排序 (从高到低)ASC: 升序排序 (从低到高)

练习一 (DESC , ASC):
# 案例:查询员工信息,并按照工资从高到低排序
SELECT*
FROMemployees
ORDER BYsalary DESC;


(可以不加ASC,默认排序方式为ASC)

# 案例:查询员工信息,并按照工资从低到高排序
SELECT*
FROMemployees
ORDER BYsalary ASC;


练习二 (添加筛选条件):
# 案例:查询员工编号>=90的员工信息,按入职时间的先后进行排序
SELECT*
FROMemployees
WHEREemployee_id >= 90
ORDER BYhiredate ASC;

练习三 (按表达式的别名排序):
# 案例:按年薪的高低显示员工的信息和年薪
SELECT*,salary*12*(1+IFNULL(commission_pct,0)) 年薪
FROMemployees
ORDER BY年薪 DESC;


练习四 (按函数排序):
# 案例:按姓的长度显示员工的姓和工资
SELECTLENGTH( last_name ) 姓的长度,last_name,salary
FROMemployees
ORDER BYLENGTH( last_name ) DESC;


# 案例:将员工信息先按工资降序排序,再按员工编号升序排序
SELECT*
FROMemployees
ORDER BYsalary DESC,employee_id ASC;
练习五 (按多个字段主次排序):


-------------------------------------------------------------------

(5) 常见函数

---------------------------单行函数---------------------------

单行函数 — 字符函数 ① ~ ⑧:

① length() 字符长度

SELECT LENGTH('abcde')


② concat() 字符拼接

SELECT CONCAT("aaa","bbb","ccc") 结果;


③ upper() ,lower() 大写,小写

# 将姓变大写,名变小写,然后进行拼接
SELECTCONCAT(UPPER( last_name ),LOWER( first_name )) 姓名
FROMemployees;


④ substr() (全称:substring) 截取

ps : 下标从 1 开始
练习一 :
# 截取李四,从第四个开始一直到最后
SELECT SUBSTR("张三和李四",4) 结果;


练习二 :
# 截取张三
SELECT SUBSTR("张三和李四",1,2) ;


练习三 (concat,substr,upper,lower):
# 案例:姓中首字符大写,其他字符小写,然后用_拼接,显示出来
SELECTCONCAT(UPPER(SUBSTR( last_name, 1, 1 )),"_",LOWER(SUBSTR( last_name, 2 ))) 结果
FROMemployees;


⑤ trim()

默认去除前面和后面的空格前面指的是:第一个不为空格的字符之前的所有空格后面指的是:最后一个不为空格的字符之后的所有空格

练习一 (去空格):
# 去除前面和后面的空格
SELECT TRIM("      a  a      a     ") 结果 ;


练习二 (去指定字符):

前面 aa 的个数是奇数,所以剩下一个

SELECT TRIM("aa" FROM "aaaaaaaaabbbaaaaaaaa") 结果 ;


⑥ lpad() 左填充长度

用指定的字符实现 左填充 指定长度
SELECT LPAD("aaa",6,"b") 结果 ;


⑦ rpad() 右填充长度

用指定的字符实现 右填充 指定长度
SELECT RPAD("aaa",6,"b") 结果 ;


⑧ replace() 置换

用 cc 去 替换 aa

SELECT REPLACE("aaaabbaaaa","aa","cc") 结果 ;


单行函数 — 数字函数 ① ~ ⑤:

① round() 四舍五入

# 四舍五入
SELECT ROUND(5.5) ;


# 四舍五入 (第二个参数表示保留的小数位数)
SELECT ROUND(5.55,1) ;


② ceil() 向上取整

# 向上取整
SELECT CEIL(2.00002) ;


③ floor() 向下取整

# 向下取整
SELECT floor(2.99999) ;


④ truncate() 截断

# 截断,保留几位小数(不进位)
SELECT TRUNCATE(2.9999,1) ;


⑤ mod() 取余

# 取余
SELECT MOD(10,3) ;


单行函数 — 日期函数 ① ~ ⑤:

① now() 返回当前系统日期+时间

SELECT NOW() ;


② curdate() 返回当前系统日期,不包含时间

SELECT CURDATE() ;


③ curtime() 返回当前时间,不包含日期

SELECT CURTIME() ;


④ str_to_date() 字符转日期

SELECT STR_TO_DATE("21-2-2021","%d-%c-%Y") ;


⑤ year() ,month() ,day() 分别获取年月日

SELECT YEAR(NOW()) ;


单行函数 — 流程控制函数 ① ~ ②:

① if()

参数一:表达式参数二:表达式为真时的结果参数三:表达式为假时的结果
SELECT IF(1<2,"Yes","No") ;


② case()

/*案例:查询员工的工资当部门号为30 , 显示工资为2倍当部门号为40 , 显示工资为3倍当部门号为50 , 显示工资为4倍其他部门,显示工资不变
*/
SELECT salary 原工资,department_id 部门号,
CASE department_idWHEN 30 THEN salary*2WHEN 40 THEN salary*3WHEN 50 THEN salary*4ELSE salary
END 新工资
FROM employees;


---------------------------分组函数---------------------------

分组函数的特点

常见的分组函数:sum()求和,avg()平均,max()最大值,min()最小值,count()个数特点:
1:sum() 和 avg() 一般用于处理数值型2:max(),min(),count() 可以处理任何类型3:以上分组函数都忽略null值4:可以和distinct进行搭配使用5:count()函数,一般使用count(*)统计行数6:和分组函数一同查询的字段要求是group by后的字段
(分组函数一般用来统计,只有一个结果,而查询的字段有多个结果,表格不规则)

分组函数 — 简单使用 :

① sum(),avg(),max(),min(),count()

SELECTSUM( salary ) 总工资,AVG( salary ) 平均工资,MAX( salary ) 最高工资,MIN( salary ) 最低工资,COUNT( salary ) 工资份数
FROMemployees;


分组函数 — 搭配distinct :

① sum() + distinct

SELECTSUM( salary ) 总工资,SUM( DISTINCT salary ) 去重后的总工资
FROMemployees;


② count() + distinct

SELECTCOUNT( department_id ) 部门数,COUNT( DISTINCT department_id ) 去重后的部门数
FROMemployees;


-------------------------------------------------------------------

(6) 分组查询 (group by)

分组查询的特点

数据源 位置 关键字
分组前筛选 原始表 group by子句的前面 where
分组后筛选 分组后的结果集 group by子句的后面 having
1:分组函数作条件时要放在having子句中2:能用分组前筛选的,就优先考虑分组前筛选3:group by 子句支持单个字段分组,多个字段分组,表达式和函数分组(不常用)4:也可以添加排序 (排序放在整个分组查询的最后)

① 简单使用 group by

#查询每个工种的最高工资
SELECTjob_id 工种,MAX( salary ) 最高工资
FROMemployees
GROUP BYjob_id


② 添加分组前筛选

练习一 :
#案例1:查询邮箱中包含a字符的每个部门的平均工资
SELECTdepartment_id 部门,AVG( salary ) 平均工资
FROMemployees
WHEREemail LIKE "%a%"
GROUP BY部门


练习二 :
#案例2:查询每个领导手下有奖金的员工的最高工资
SELECTmanager_id 领导,MAX( salary )
FROMemployees
WHEREcommission_pct IS NOT NULL
GROUP BY领导


③ 添加分组后筛选 (having)

个人理解:案例一:查询哪些部门的员工个数>2当前面的结果(即每个部门的员工个数)不为表中的字段时
需要先查询出前面的结果后才可以找出哪些员工个数>2,此时需要使用havingps:一开始错误的觉得可以直接放在where中。where只能对表中已存在的字段进行操作(不知道理解的对不对)而此时每个部门的员工个数在表中并不存在,需要先进行统计,再找>2的mysql中这些关键字是按照如下顺序进行执行的:from, Where, Group By
Having, Order by。 从这看出,假如在where中找员工个数大于2的,那么
还没进行分组,找的就不是每个部门的了,即使没报错结果也不对了。(xia bi bi)
练习一 :
#案例1:查询哪些部门的员工个数>2
SELECTdepartment_id 部门,COUNT(*) 员工个数
FROMemployees
GROUP BY部门
HAVING员工个数 > 2


练习二 :
#案例二:查询每个工种有奖金的最高工资>12000的工种编号和最高工资
SELECTjob_id 工种,MAX( salary ) 最高工资
FROMemployees
WHEREcommission_pct IS NOT NULL
GROUP BYjob_id
HAVING最高工资 > 12000


练习三 :
/*案例三:查询领导编号>102的每个领导手下的员工最低工资>5000的领导编号是哪个,以及其最低工资
*/
SELECTmanager_id 领导编号,MIN( salary ) 最低工资
FROMemployees
WHEREmanager_id > 102
GROUP BY领导编号
HAVING最低工资 > 5000


④ 按函数分组

#案例:按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
SELECTLENGTH( last_name ) 员工姓名长度,COUNT(*) 员工个数
FROMemployees
GROUP BY员工姓名长度
HAVING员工个数 > 5


⑤ 按多个字段分组

#案例:查询每个部门每个工种的员工的平均工资,并且按平均工资的高低显示
SELECTAVG( salary ) 平均工资,department_id 部门编号,job_id 工种
FROMemployees
GROUP BY部门编号,工种
ORDER BY平均工资 DESC


-------------------------------------------------------------------

(7) 连接查询

---------------------------sql92标准---------------------------

① 等值连接 (sql92标准)

练习一 :
# 案例一:查询员工名和对应的部门名
SELECTlast_name,department_name
FROMemployees e,departments d
WHEREe.department_id = d.department_id


练习二 :
# 案例二:查询员工名,工种编号,工种名
SELECTlast_name,e.job_id,job_title
FROMjobs j,employees e
WHEREj.job_id = e.job_id


练习三 (加筛选):
# 案例三:查询有奖金的员工名,部门名
SELECTlast_name,d.department_id
FROMemployees e,departments d
WHEREcommission_pct IS NOT NULL AND e.department_id = d.department_id


练习四 (加筛选):
# 案例四:查询城市名中第二个字符为o的部门名和城市名
SELECTdepartment_name,city
FROMdepartments d,locations l
WHEREd.location_id = l.location_id AND city LIKE "_o%"


练习五 (加分组):
# 案例:查询每个城市的部门个数
SELECTCOUNT(*),city
FROMdepartments d,locations l
WHEREd.location_id = l.location_id
GROUP BYcity


练习六 (加排序):
#案例:查询每个工种的工种名和员工的个数,并且按员工个数降序
SELECTjob_title 工种名,COUNT(*) 员工个数
FROMjobs j,employees e
WHEREj.job_id = e.job_id
GROUP BY工种名
ORDER BY员工个数 DESC


练习七 (三表连接):
#案例:查询员工名,部门名和所在的城市
SELECTlast_name 员工名,department_name 部门名,city 城市
FROMemployees e,departments d,locations l
WHEREe.department_id = d.department_id AND d.location_id = l.location_id


② 非等值连接 (sql92标准)

#案例:查询员工的工资和工资级别
SELECTsalary 工资,grade_level 工资级别
FROMemployees e,job_grades j
WHEREsalary BETWEEN j.lowest_sal AND j.highest_sal


③ 自连接 (sql92标准)

先从 employees表 中找到员工名以及他所对应的领导编号
然后再通过领导编号找到领导名
(相当于要查询两次employees表,所以将一张表起两个别名,当作两张表来操作)
#案例:查询员工名和上级的名称
SELECTe.employee_id 员工编号,e.last_name 员工名,m.employee_id 上级编号,m.last_name 上级名
FROMemployees e,employees m
WHEREe.manager_id = m.employee_id


---------------------------sql99标准---------------------------

内连接

① 等值连接 (sql99标准)

练习一 :
# 案例:查询员工名,部门名
SELECTlast_name 员工名,department_name 部门名
FROMemployees eINNER JOIN departments d ON e.department_id = d.department_id


练习二 (加筛选):
# 案例:查询名字中包含e的员工名和工种名
SELECTlast_name 员工名,j.job_title 工种名
FROMemployees eINNER JOIN jobs j ON e.job_id = j.job_id
WHERElast_name LIKE "%e%"


练习三 (添加分组加筛选):
# 案例:查询部门个数>3的城市名和部门个数
SELECTcity,COUNT(*) 部门个数
FROMdepartments dINNER JOIN locations l ON d.location_id = l.location_id
GROUP BYcity
HAVING部门个数 >3


练习四 (加排序):
# 案例:查询哪个部门的部门员工个数>3的部门名和员工个数,并按个数降序
SELECTdepartment_name 部门名,COUNT(*) 员工个数
FROMdepartments dINNER JOIN employees e ON d.department_id = e.department_id
GROUP BY部门名
HAVING员工个数 > 3
ORDER BY员工个数 DESC


练习五 (三表连接):
# 案例:查询员工名,部门名,工种名,并按部门名降序
SELECTlast_name 员工名,department_name 部门名,job_title 工种名
FROMemployees eINNER JOIN departments d ON e.department_id = d.department_idINNER JOIN jobs j ON e.job_id = j.job_id
ORDER BY部门名 DESC


② 非等值连接 (sql99标准)

练习一 :
# 案例:查询员工的工资级别
SELECTsalary 工资,grade_level 工资级别
FROMemployees eINNER JOIN job_grades j ON salary BETWEEN j.lowest_sal AND j.highest_sal


练习二 (加筛选,排序,分组) :
# 案例:查询员工个数>20的工资级别,并且按工资级别降序
SELECTgrade_level 工资级别,COUNT(*) 个数
FROMemployees eINNER JOIN job_grades j ON salary BETWEEN j.lowest_sal AND j.highest_sal
GROUP BY工资级别
HAVING个数 > 20
ORDER BY工资级别 DESC


③ 自连接 (sql99标准)

#案例:查询姓名中包含字符k的员工名和上级的名称
SELECTe1.last_name 员工名,e2.last_name 上级名称
FROMemployees e1INNER JOIN employees e2 ON e1.manager_id = e2.employee_id
WHEREe1.last_name LIKE "%k%"


外连接

外连接的应用场景和特点:

应用场景:用于查询一个表中有,另一个表中没有的记录
(需要不匹配的记录null时)特点:
1、 外连接的查询结果为主表中的所有记录如果 从表 中有和他匹配的,则显示匹配的值如果 从表 中没有和他匹配的,则显示null外连接查询结果 = 内连接结果 + 主表 中有而 从表 中没有的记录2、 左外连接,left join 左边的是主表 右外连接,right join 右边的是主表

① 左(右)外连接

练习一 :
# 案例:查询男朋友不在boys表中的女生名
SELECTb.NAME,bo.id,bo.boyName
FROMbeauty bLEFT OUTER JOIN boys bo ON b.boyfriend_id = bo.id
WHEREbo.id IS NULL

右外连接,结果相同,将left 改为 right ,再把两表的位置交换即可

# 案例:查询男朋友不在boys表中的女生名
SELECTb.NAME,bo.id,bo.boyName
FROMboys boRIGHT OUTER JOIN beauty b ON b.boyfriend_id = bo.id
WHEREbo.id IS NULL

练习二 :
# 案例:查询哪个城市没有部门
SELECTcity,d.*
FROMlocations lLEFT JOIN departments d ON l.location_id = d.location_id
WHEREdepartment_id IS NULL


练习三 :
# 查询部门名为SAL或IT的员工信息
SELECTd.department_id 部门编号,department_name 部门名,e.*
FROMdepartments dLEFT JOIN employees e ON d.department_id = e.department_id
WHEREdepartment_name IN ("SAL","IT")


② 交叉连接

展示结果类似两表的笛卡尔乘积
SELECTb.*,bo.*
FROMbeauty bCROSS JOIN boys bo


-------------------------------------------------------------------

(8) 子查询

① where 后面的标量子查询

标量子查询:结果集只有一行一列
练习一 :
# 查询工资比 Abel 高的员工信息
SELECT *
FROM employees
WHERE salary > (SELECT salary FROM employees WHERE last_name = "Abel"
)


练习二 :
# 案例:返回job_id 与 141号员工相同,salary 比143号员工多的员工姓名,job_id 和工资
SELECT last_name,job_id,salary
FROM employees
WHERE job_id = (SELECT job_idFROM employeesWHERE employee_id = 141
)
AND salary > (SELECT salary FROM employeesWHERE employee_id = 143
)


练习三 :
#案例:返回公司工资最少的员工的last_name,job_id和salary
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (SELECT MIN(salary)FROM employees
)


练习四 :
#案例4:查询最低工资大于50号部门最低工资的部门id和其最低工资
SELECT department_id,MIN(salary)FROM employeesGROUP BY department_idHAVING MIN(salary) > (SELECT MIN(salary)FROM employeesWHERE department_id = 50
)


② where 后面的列子查询 (in,any,some,all)

列子查询:结果集只有一列多行
练习一 :
#列子查询(多行子查询)
# 案例1:返回location_id是1400或1700的部门中的所有员工姓名
SELECT last_name
FROM employees e
WHERE department_id IN (SELECT department_idFROM departments dWHERE location_id IN(1400,1700)
)


练习二 :
#案例2:返回其它工种中比job_id为"IT_PROG"部门任一工资低的员工的员工号,姓名,job_id 以及 salary
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary < ANY(SELECT salary FROM employeesWHERE job_id = "IT_PROG"
) AND job_id <> "IT_PROG"


③ where 后面的行子查询

行子查询:结果集只有一行多列
#行子查询(结果集一行多列或多行多列)
# 案例:查询员工编号最小并且工资最高的员工信息
SELECT *
FROM employees
WHERE (employee_id,salary) = (SELECT MIN(employee_id),MAX(salary)FROM employees
)


④ select 后面的标量子查询

# 案例:查询每个部门的员工个数
SELECT d.*,(SELECT COUNT(*)FROM employees eWHERE e.department_id = d.department_id
) 个数
FROM departments d


⑤ from 后面的表子查询

表子查询:结果集一般为多行多列

(必须起别名)

#案例:查询每个部门的平均工资的工资等级
SELECT ag.*,g.grade_level
FROM (SELECT department_id,AVG(salary) saFROM employeesGROUP BY department_id
) ag
INNER JOIN  job_grades g
ON ag.sa BETWEEN g.lowest_sal AND g.highest_sal

s


③ exists 后面的表子查询 (相关子查询)

练习一 :
#案例:查询有员工的部门名
#(个人理解:员工表中有该部门id,该部门一定有员工)
SELECT department_name
FROM departments d
WHERE EXISTS(SELECT * FROM employees eWHERE e.department_id = d.department_id
)


练习二 :

把beauty 表中id=10的删去,再测试

#案例:查询没有女朋友的男生信息
SELECT *
FROM boys bo
WHERE NOT EXISTS(SELECT * FROM beauty bWHERE b.boyfriend_id = bo.id
)


-------------------------------------------------------------------

(9) 分页查询 (limit)

分页查询的应用场景和特点

应用场景:当要显示的数据,一页显示不全,需要分页提交sql请求limit offset,size
offset:要显示条目的起始索引(起始索引从0开始) 若为0可以省略
size:要显示的条目个数特点:
1、 limit语句放在查询语句的最后面
2、 公式:
当要显示的页数为page, 每页的条目数为size
limit (page-1)*size , size例如size=10
page   起始
0       0
1       10
2       20

练习一 :
# 案例1:查询前五条员工信息
SELECT*
FROMemployees LIMIT 5


练习二 :
# 案例2:查询第11条 - 第25条员工信息
SELECT*
FROMemployees LIMIT 10,15


练习三 :
 # 案例3:查询有奖金的员工信息,并且工资较高的前10名显示出来
SELECT*
FROMemployees
WHEREcommission_pct IS NOT NULL
ORDER BYsalary DESC LIMIT 10


-------------------------------------------------------------------

(10) 联合查询 (union)

联合查询的应用场景特点:

联合查询:将多条查询语句的结果合并为一个结果语法:
查询语句1
union
查询语句2
union
查寻语句3
.....特点:
1、要求多条查询语句的查询列数是一致的
2、要求多条查询语句的每一列的类型和顺序最好一致
3、union关键字默认去重,如果使用union all可以包含重复项

【Mysql 学习笔记】DQL语句(非常详细,结合多个案例快速入门)相关推荐

  1. Oracle中job_type,【学习笔记】Oracle DBMS_SCHEDULER详细介绍与使用案例

    天萃荷净 分享一篇关于Oracle DBMS_SCHEDULER详细介绍与使用案例 1.通过DBMS_SCHEDULER.CREATE_JOB直接创建job SQL> create table ...

  2. mysql学习笔记(常用语句)

    mysql学习总结: 1.启动 mysql -uusername -ppassword 2.切换数据库 use databasename 3.创建数据库 create database name 4. ...

  3. MySQL学习笔记04-DDL语句学习

    目录 07.DDL语句学习 7.1.库和表的管理 库的管理 库的创建:CREATE 库的修改:ALTER 库的删除:DROP 表的管理 表的创建:CREATE 表的修改:ALTER 表的删除:DROP ...

  4. MySQL学习笔记——基础语句

    MySQL默认端口号为3306: 超级用户为root: MySQL常用命令 显示当前服务器版本:select version(); 显示当前日期时间:select now(); 显示当前用户:sele ...

  5. Mysql学习笔记(查询语句练习题1)

    表格详情: student表: teacher表: course表: score表: Mysql查询语句练习: 1.查询Student表中的所有记录的Sname.Ssex和Class列 select ...

  6. Mysql学习笔记(基础)基础sql语句详细记录

    数据库学习(基础) // 个人网课学习记录,如果有违规等问题,请联系我删除~ mysql下载安装( 解压版安装配置 下载版安装配置 ) 需求分析:使用cmd命令来创建一个数据库,并对数据库中得一张分类 ...

  7. Mysql学习笔记--多表之间约束等详细记录

    sql 进阶学习笔记-多表(二) 笔记(一)内容回顾 Mysql学习笔记(基础)基础sql语句详细记录 ​ 数据库的创建 : create database 数据库的名 character set 字 ...

  8. MySQL学习笔记-基础篇1

    MySQL 学习笔记–基础篇1 目录 MySQL 学习笔记--基础篇1 1. 数据库概述与MySQL安装 1.1 数据库概述 1.1.1 为什么要使用数据库 1.2 数据库与数据库管理系统 1.2.1 ...

  9. MySQL 学习笔记②

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/BV1Kr4y1i7ru 资料链接 ...

  10. Mysql 学习笔记(快速复习)

    Mysql 学习笔记(快速复习) 一.MySQL 基础 1.数据库连接工具 1.1.Navicat 使用教程 2.DDL 操作数据库 2.1.创建新数据库 2.2.删除数据库 2.3.使用数据库 3. ...

最新文章

  1. ISME:水库蓝藻影响真核浮游生物的群落演替和物种共存
  2. Enum类的非一般用法汇总(工作中遇到时持续更新)
  3. 《数据结构》第01章在线测试
  4. 深度学习 占用gpu内存 使用率为0_深度学习的完整硬件指南
  5. javascript入门_您需要一个JavaScript入门工具包
  6. npm下载缓慢解决方法
  7. 深度学习与自然语言处理 主要概念一览
  8. onvif协议之抓图
  9. 攻防世界mobile新手区之app3 write up
  10. 东大计算机硕士奖学金,计算机科学与技术学院2018级硕士研究生学业奖学金评定情况.PDF...
  11. 八爪鱼采集ajax表格,怎么采集八爪鱼采集器单网页表格信息
  12. 本地部署iOS应用OTA安装 Go + Goland详细实现步骤
  13. 小米2/2S刷基于Android 5.1.1的CM12.1系统教程
  14. Xilinx SDx 2018.3安装
  15. MySQL建立索引注意事项以及面试问题
  16. async与awite详解
  17. 马未都:人生三重境界
  18. Java开发进阶10本必备书单
  19. 计算机丢失unityplayer.dll,UnityPlayer.dll
  20. 代替vscode的工具_VSCode下载-VS编辑器Visual Studio Code下载V1.52.0.0 中文版-西西软件下载...

热门文章

  1. EFReport报表中国插件说明
  2. 云电脑玩游戏用手柄可以吗
  3. html如何动态显示天气,纯CSS实现动态的天气图标
  4. 数字经济快速发展下企业需要什么样的数智平台?
  5. IBM Dr Watson 的那些事儿
  6. WebForm常见错误之验证控件报错
  7. 人生要小心处理的50件事
  8. 用python画耳朵_【分享】如何用Python画小猪佩奇 | 勤奋的小青蛙
  9. 手机玩exe游戏的模拟器_使命召唤手游模拟器和手机一起玩怎么样 拟器和手机一览_使命召唤手游...
  10. v-echarts的介绍及使用