MySQL基础-DQL学习笔记

北城余情 提交于 2020-11-02 10:48:40

1.基础查询

语法:SELECT 查询列表 FROM 表名; 特点:查询列表可以是:表中的字段,常量值,表达式,函数( 使用注重号包裹字段,可以区分是否是关键字) 案例:

# 查询常量值
SELECT 100;
SELECT ‘john’;

# 查询表达式
SELECT 100*99;

# 查询函数
SELECT VERSION( );

**起别名:**便于理解,查询字段有重名可以区分。

# 起别名
# 方式一:使用AS
SELECT last_name AS 姓, first_name AS 名 FROM 表名;
# 方式二:使用空格
SELECT last_name 姓, first_name 名 FROM 表名;

**去重:**DISTINCT

SELECT DISTINCT 字段名 FROM 表名;

+号的作用:

  • mysql中只有运算符的功能,如果是数值型,直接运算;
  • 如果是字符型转换成数值型运算,不能转换的字符,转换成0;
  • 如果是null,结果为null;
  • 如果要拼接字符使用CONCAT( )函数;

2.条件查询

语法:SELECT 查询列表 FROM 表名 WHERE 筛选条件 分类:

  • 按条件表达式筛选:> < = != <> >= <=
  • 按逻辑表达式筛选:and or not
  • 模糊查询:like 案例:
# like 
# 包含字符a
…… WHERE last_name LIKE ‘%a%’;
# 查询第三个字符为e第五个字符为a
…… WHERE last_name LIKE ‘__e_a%’;
# 查询第三个字符为下划线的 使用转义字符\
…… WHERE last_name LIKE ‘__\_%’;

# between and
特点:包含临界值;大小不能颠倒

# in 判断值是否属于in列表中的某一项
特点:列表类型必须一致;不支持通配符
…… WHERE job_id IN( ’IT’, ‘’, ‘');

# is null ; is not null
特点:=或<>不能判断null值
…… WHERE salary IS NULL;

通配符说明:% 任意多个字符;_ 任意单个字符。 安全等于:<=>即可以判断是否等于null,也可以判断普通值。

3.排序查询

语法:SELECT 查询列表 FROM 表名 WHERE 筛选条件 ORDER BY 排序列表【asc|desc】 特点:

  • 默认是升序asc;
  • 可以用表达式排序;
  • 可以用别名排序;
  • 可以用函数排序;
  • 可以多个字段排序;

4.常见函数(单行函数)

字符函数: LENGTH(字符):获取参数值的字节个数 CONCAT( ):拼接字符 UPPER( ):大写字符 LOWER( ):小写字符 SUBSTR( ):截取字符串 INSTR( ):返回子串在字符串中第一次出现的索引 TRIM( ):去前后空格,或者指定字符 LPAD( ):用指定字符左填充指定长度的字符 RPAD( ):右填充 REPLACE( ):替换 数学函数: ROUND( ):四舍五入 CEIL( ):向上取整 FLOOR( ):向下取整 TRUNCATE( ):截断 MOD( ):取余 日期函数: NOW( ):返回日期+时间 CURDATE( ):返回日期 CURTIME( ):返回时间 YEAR(date): MONTH( ): MONTHNAME( ):返回英文名 STR_TO_DATE( ): DATE_FORMAT( ):日期转换成指定格式的字符串 DATEDIFF( ):日期差 其他函数:
VERSION( ):查看版本 DATABASE( ): USER( ): 流程控制函数: IF(10>5,’大’,’小’)

CASE 要判断的字段或表达式 WHEN 常量 THEN 要显示的值或语句; 。。。 ELSE 要显示的值或语句; END 案例:

# 案例一
SELECT salary 原始工资, departmentId, 
CASE 30 THEN salary*1.1
CASE 40 THEN salary*1.2
。。。
ELSE salary
END AS 新工资
FROM employee

# 案例二
SELECT salary,
CASE
WHEN salary>20000 THEN ‘A’
WHEN salary>10000 THEN ‘B’
WHEN salary>5000 THEN ‘C’
ELSE ‘D’
END AS 工资等级

5.分组函数(聚合函数,统计函数,组函数)

SUM() AVG() MIN() MAX() COUNT() 特点:

  • SUM() AVG()函数只支持数值型;其他支持任何类型
  • 所有函数都忽略null值;
  • 可以和distinct搭配去重;SELECT SUM(DISTINCT,salary)FROM employee;
  • COUNT()用来统计行数;COUNT(1)也可以用来统计行数;效率:MYISAM下COUNT()效率高;INNODB下差不多;
  • 和分组函数一同查询的字段要求是group by后的字段 案例:
SELECT SUM(salary) FROM employees;

6.分组查询

语法:

SELECT column 分组函数(column)
FROM table
[WHERE 条件]
[GROUP BY expression]
[ORDER BY column]

案例:

# 查询每个工种的最高工资
SELECT MAX(salary),job_id
FROM employee
GROUP BY job_id;

# 添加筛选条件
# 邮箱中包含a字符,每个部门的平均工资
SELECT AVG(salary),dep_id
FROM employee
WHERE email LIKE ‘&a&’
GROUP BY dep_id;

# HAVING
# 添加分组后根据结果进行筛选
SELECT COUNT(*) ,dep_id
FROM employee
GROUP BY dep_id
HAVING COUNT(*)>2;

# 多个字段分组
SELECT AVG(salary),dep_id,job_id
FROM empolyee
GROUP BY dep_id,job_id;

# 添加排序
SELECT AVG(salary),dep_id,job_id
FROM empolyee
GROUP BY dep_id,job_id
ORDER BY AVG(salary)DESC;

7.连接查询(多表查询)

分类:

  • 按年代分类: sql92标准(只支持内连接); sql99标准【推荐】(支持内连接+左外连接+右外连接+ 交叉连接)
  • 按功能分类: 内连接: 等值连接 非等值连接 自连接 外连接: 左外连接 右外连接 全外连接 交叉连接 sql92标准案例:
# 等值连接
SELECT 字段1,字段2,……
FROM 表1,表2
WHERE 表1.字段 = 表2.字段

# 非等值连接
SELECT 字段1,字段2,……
FROM 表1,表2
WHERE 表1.字段 BETWEEN 表2.字段1 AND 表2.字段2;

sql99标准: 语法:

SELECT 查询列表
FROM 表1 别名 【连接类型】
JOIN 表2 别名 ON 连接条件
WHERE 筛选条件;
# 连接类型:inner(内连接);left(左外);right(右外);full(全外);cross(交叉)

内连接案例:

# 等值连接
SELECT name,dep
FROM 表1 INNER JOIN 表2
ON 表1.字段 = 表2.字段;

# 非等值连接
SELECT name,dep
FROM 表1 INNER JOIN 表2
ON 表1.字段 BETWEEN 表2.字段 AND 表2.字段;

外连接:应用场景,一个表中有,另一个表中没有。 特点:外连接的查询结果为主表中的所有记录,如果从表中没有匹配的,则显示null。左外连接,左边是主表,右外连接,右边是主表。 左外连接案例:

SELECT name,dep
FROM 表1 
LEFT OUTER JOIN 表2
ON 表1.字段 = 表2.字段
WHERE 表2.id IS NULL;

全外连接:结果是内连接+左外连接+右外连接。 交叉连接:结果就是笛卡尔乘积。

8.子查询

含义:出现在其他语句中的select语句,称为子查询或内查询 分类: 按子查询出现的位置: select后面:仅支持标量子查询 from后面:支持表子查询 where或having后面:标量子查询;列子查询;行子查询 exists后面:表子查询 按结果集的行列数不同: 标量子查询(结果集只有一行一列) 列子查询(结果集只有一列多行) 行子查询(结果集有一行多列) 表子查询(结果集一般为多行多列) 特点: 子查询放在小括号内; 子查询一般放在条件的右侧; 标量子查询,一般搭配着单行操作符使用:> < >= <= = <> 列子查询,一般搭配着多行操作符使用:IN/NOT IN(等于列表中的任意一个),ANY | SOME(和子查询返回的某一个值比较),ALL(和子查询返回的左右值比较) 子查询早于主查询 where或having后面的标量子查询(单行子查询):

# 谁的工资比Abel高
SELECT *
FROM employee
WHERE salary > (
    SELECT salary 
    FROM employee
    WHERE name = ‘Abel'
);

where或having后面的列子查询(多行子查询):

# 查询员工编号最小并且工资最高的员工信息
SELECT *
FROM employee
WHERE (employee_id,salary) = (
    SELECT MIN(employee),MAX(salary)
    FROM employee
);

select后面的子查询:

# 查询每个部门的员工个数
SELECT d.*,(
    SELECT COUNT(*)
    FROM employee e
    WHERE e.department_id = d.department_id
)
FROM department d;

from后面的子查询:

# 查询每个部门的平均工资的工资等级
SELECT ag_dep.*, g.grade_level
FROM (
    SELECT AVG(salary),department_id
    FROM employee
    GROUP BY department_id
) ag_dep
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN … AND …;

exists后面的子查询(相关子查询):结果只有1或者0

SELECT EXISTS(SELECT * FROM employee);

9.分页查询

语法:

SELECT 查询列表
FROM 表
……
LIMIT offset,size;
(offset表示起始索引,从0开始;size每页条数)

特点:limit语句在查询语句的最后

10.union联合查询

语法:

查询语句1
UNION
查询语句2
UNION
……;

案例:

# 查询中国用户中年龄大于12岁以及外国用户中年龄大于12岁的用户信息
SELECT * FROM t_ca WHERE age > 12
UNION
SELECT * FROM t_ua WHERE age > 12;

特点:

  • 要求多条查询语句的列数一致
  • 每一列的类型和顺序一致
  • UNION关键字默认去重,使用UNION ALL可以包含重复项
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!