记录查询
最基本的查询语句是由SELECT和FROM 关键字组成的
SELECT * FROM t_emp; // 查询t_emp表下所有
SELECT empno,ename FROM t_emp; // 查询t_emp表下empno,ename
SELECT语句屏蔽了物理层的操作,用户不必关心数据的真实存储,交由数据库高效的查找数据
使用列别名
通常情况下,SELECT子句中使用了表达式,那么这列的名字就默认为表达式,因此需要一种对列名重命名的机制
SELECT
empno,
sal*12 AS "income"
FROM t_emp;
查询语句的子句执行顺序
- 语法分析与优化,读取SQL语句
- FROM 选择数据来源
- SELECT选择输出内容
数据分页
如果结果集的记录很多,则可以使用LIMIT 关键字限定结果集数量
SELECT ...... FROM ....... LIMIT 起始位置,偏移量;
SELECT ename FROM t_emp LIMIT 20,20; // 从第20条往后查20条
数据分页的简写用法
如果LIMIT子句只有一个参数,它表示的是偏移量,起始值默认为0
SELECT empno FROM t_emp LIMIT 10; // 等同于
SELECT empno FROM t_emp LIMIT 0,10;
优先级
FROM => SELECT => LIMIT
结果集排序
如果没有设置,查询语句不会对结果集进行排序。也就是说,如果想让结果集按照某种顺序排列,就必须使用ORDER BY子句
SELECT ...... FROM ....... ORDER BY 列名 [ASC(默认) | DESC]
SELECT ename FROM t_emp ORDER BY sal DESC;
排序关键字
- ASC代表升序(默认),DESC代表降序
- 如果排序列是数字类型,数据库就按照数字大小排序,如果是日期类型就按照日期大小排序,如果是字符串就按照字符集序号排序
排序字段内容相同的情况
- 默认情况下,如果两条数据排序字段内容相同,那么排序会按照主键排序
- 我们可以使用ORDER BY 规定首要排序条件和次要排序条件。数据库会先按照首要排序条件排序,如果遇到首要排序内容相同的记录,那么就会启用次要排序条件接着排序
SELECT
empno,ename,sal,deptno
FROM t_emp
ORDER BY deptno,sal DESC;
SELECT
empno,ename,sal,deptno
FROM t_emp
ORDER BY sal DESC,empno LIMIT 0,5;
排序+分页
ORDER BY 子句书写的时候放在LIMIT 子句的前面
FROM => SELECT => ORDER BY => LIMIT
去除结果集重复记录
如果我们需要去除重复的数据,可以使用DISTINCT关键字来实现
SELECT DISTINCT 字段 FROM ......;
SELECT DISTINCT job FROM t_emp;
注意事项
- 使用DISTINCT 的SELECT子句中只能查询一列数据,如果查询多列,完全一样才去重
- DISTINCT 关键字只能在SELECT子句中使用一次
条件查询 WHERE
SELECT ...... FROM ...... WHERE 条件 [ AND | OR ] 条件
SELECT ename,sal FROM t_emp
WHERE deptno=10 AND sal >= 2000;
算数运算符
+、-、*、/、%
与null运算返回null
10*IFNULL(null,0)
// DATEDIFF 相差多少天
DATEDIFF(NOW(),hiredate)/365>=20
SELECT ename,sal FROM t_emp
WHERE deptno=10 AND (sal+IFNULL(comm,0)) >= 2000
AND DATEDIFF(NOW(),hiredate)/365>=20;
比较运算符
表达式 | 意义 | 例子 |
---|---|---|
> | 大于 | |
>= | 大于等于 | |
< | 小于 | |
<= | 小于等于 | |
= | 等于 | |
!= | 不等于 | |
IN | 包含 | deptno IN(10,30,40) |
IS NULL | 为空 | comm IS NULL |
IS NOT NULL | 不为空 | comm IS NOT NULL |
BETWEEN AND | 范围 | sal BETWEEN 2000 AND 3000 |
LIKE | 模糊查询 | ename LIKE “A%” |
REGEXP | 正则表达式 | ename REGEXP “[a-zA-Z]{4}” |
例:
SELECT
ename,comm,sal
FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000
AND ename LIKE "_LIKE"
SELECT
ename,comm,sal
FROM t_emp WHERE comm IS NULL
AND sal BETWEEN 2000 AND 3000
AND ename REGEXP "^[\\u4e00-\\u9fa5]{2,4}$";
逻辑运算符
表达式 | 意义 | 例子 |
---|---|---|
AND | 与关系 | age > 18 AND sex = “男” |
OR | 或关系 | |
NOT | 非关系 | NOT deptno = 20 |
XOR | 异或关系 | age > 18 XOR sex = “男” (两边都一样才为true,例如都为true或都为false) |
SELECT
emane, deptno
FROM t_emp
WHERE NOT deptno IN(10,20) XOR sal>=2000;
二进制按位运算
二进制位运算的实质是将参与运算的两个操作数,按对应的二进制数逐位进行逻辑运算。
WHERE 子句的注意事项
WHERE子句中,条件执行的顺序是从左到右的。所以我们应该把索引条件,或者筛选掉记录最多的条件写在最左侧
SELECT empno,ename FROM t_emp
WHERE ename = "FORD" AND sal >= 2000;
SELECT empno,ename FROM t_emp
WHERE deptno = 10 AND sal >= 2000;
各种子句的执行顺序
FROM => WHERE => SELECT => ORDER BY => LIMIT