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可以包含重复项
来源:oschina
链接:https://my.oschina.net/u/4661520/blog/4613714