去重
如果我们需要去重重复的数据,可以使用DISTINCT关键字来实现
SELECT DISTINCT 字段 FROM ......;
注意:使用DISTINCT的SELECT子句中只能查询一列数据,如果查询多列去重就会失效。DISTINCT关键字只能在SELECT子句中使用一次
条件查询
很多时间,用户感兴趣的并不是逻辑表里的全部记录,而只是他们当中能够满足某一种或某几 种条件的记录。这类条件要用WHERE子句来失效数据的筛选。
SELECT ...... FROM ...... WHERE 条件 [AND|OR] 条件 ……;
条件筛选的四类运算符
运算符: 数学运算符,比较运算符,逻辑运算符,按位运算符
数学运算符
序号 | 表达式 | 意义 | 例子 |
1 | + | 加法 | 1+2+3 |
2 | - | 减法 | 1-2-3 |
3 | * | 乘法 | 1*2*3 |
4 | / | 除法 | 6/3 |
5 | % | 求模 | 10%3 |
比较运算符
序号 | 表达式 | 意义 | 例子 |
1 | > | 大于 | age>18 |
2 | >= | 大于等于 | agr>=18 |
3 | < | 小于 | sal<4000 |
4 | <= | 小于等于 | sal<=4000 |
5 | = | 等于 | deptno=10 |
6 | != | 不等于 | deptno!=30 |
7 | IN | 包含 | deptno IN(10,20,30) |
8 | IS NULL | 为空 | comm IS NULL |
9 | IS NOT NULL | 不为空 | comm IS NOT NULL |
10 | BETWEEN AND | 范围 | sal BETWEEN 4000 AND 9000 |
11 | LIKE | 模糊查询 | ename like "%c" |
12 | REGEXP | 正则表达式 | ename REGEXP "[a-zA-Z]{4}" |
逻辑运算符
序号 | 表达式 | 意义 | 例子 |
1 | AND | 与关系 | age>18 AND sex="男" |
2 | OR | 或关系 | empno=8000 OR deptno=20 |
3 | NOT | 非关系 | NOT deptno=30 |
4 | XOP | 异或关系 | age>18 XOP sex="男" |
按位运算符
序号 | 表达式 | 意义 | 例子 |
1 | & | 位于关系 | 3&7 |
2 | | | 位或关系 | 3|7 |
3 | ~ | 位取反 | ~10 |
4 | ^ | 位异或 | 3^7 |
5 | << | 左移 | 10<<1 |
6 | >> | 右移 | 10>>1 |
WHERE子句注意事项
WHERE子句中,条件执行的顺序是从左到右的。所以我们应该把索引条件,或者筛选掉记录最 多的条件写在最左侧。
高级查询
聚合函数
SUN函数
SUM函数用于求和,只能用于数字类型,字符类型的统计结果为0,日期类型统计结果是毫秒数相加。
数据表的每一列都是不可分割的基本数据项,同一列中不能有多个值,也不能存在重复的属性。
字符串求和位0,日期求和毫秒数相加
MAX函数
MAX函数用于获得非空值的最大值。
MIN函数
MIN函数用于获得非空值的最小值。
AVG函数
AVG函数用于获得非空值的平均值,非数字数据统计结果为0。
字符串求和为0
COUNT函数
COUNT(*)用于获得包含空值的记录数,COUNT(列名)用于获得包含非空值的记录数。
只统计非空的数据
常见错误
聚合函数不能出现在WHERE子句中
分组函数
GROUP BY子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对每个小区域分别进行数据汇总处理。
逐级分组
数据库支持多列分组条件,执行的时候逐级分组。
查询每个部门里,每种职位的人员数量和平均底薪。
对SELECT子句的要求:
查询语句中如果含有GROUP BY子句,那么SELECT子句中的内容就必须要遵守规定。
SELECT子句中可以包括聚合函数,或者GROUPBY子句的分组列,其余内容均不可以出现在SELECT子句中。
汇总
WITH ROLLUP配合分组函数进行再次汇总。
GROUP_CONCAT函数
GROUP_CONCAT函数可以把分组查询中的某个字段拼接成一个字符串。
HAVING子句
表连接查询数据
笛卡尔积
从多张表中提取数据,必须指定关联的条件。如果不定义关联条件就会出现无条件连接,两张表的数据会交叉连 接,产生笛卡尔积。
关联条件查询
规定了连接条件的表连接语句,就不会出现笛卡儿积。
关联条件的数据为N-1个
表连接的分类
表连接分为两种:内连接和外连接
内连接是结果集中只保留符合连接条件的记录
外连接是不管符不符合连接条件,记录都要保留在结果集中。
内连接
内连接是最常见的一种表连接,用于查询多张关系表符合连接条件的记录。
语法结构:
SELECT …… FROM 表1
[INNER] JOIN 表2 ON 条件
[INNER] JOIN 表3 ON 条件
..........
内连接的多种语法形式:
SELECT …… FROM 表1 JOIN 表2 ON 连接条件;
SELECT …… FROM 表1 JOIN 表2 WHERE 连接条件;
SELECT …… FROM 表1,表2 WHERE 连接条件;
外连接
外连接与内连接的区别在于,除了符合条件的记录之外,结果集中还会保留不符合条件的记录。
语法结构:
‘SELECT …… FROM 表1
LEFT JOIN 表2 ON 条件
左连接,右连接
左外连接就是保留左表所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接。如果右表没有符 合条件的记录,就用NULL与左表连接。右外连接也是如此。
子查询
子查询可以写在三个地方:
WHERE子句、FROM子句、SELECT子句,但是只有FROM子句子查询是最可取的
单行子查询和多行子查询
单行子查询的结果集只有一条记录,多行子查询结果集有多行记录
多行子查询只能出现在WHERE子句和FROM子句中。
WHERE子句中的多行子查询
WHERE子句中,可以使用IN、ALL、ANY、EXISTS关键字来处理多行表达式结果集的条件判断
EXISTS关键字
EXISTS关键字是把原来在子查询之外的条件判断,写到了子查询的里面。
SELECT …… FROM 表名 WHERE [NOT] EXISTS(子查询);
效率极低,不建议使用