mysql语言
https://cyborg2077.github.io/2022/07/21/MySQL06/
不能在 WHERE 子句中使用聚合函数
where,having的区别:
- 区别1:WHERE 可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件;HAVING 必须要与 GROUP BY 配合使用,可以把分组计算的函数和分组字段作为筛选条件。
这决定了,在需要对数据进行分组统计的时候,HAVING 可以完成 WHERE 不能完成的任务。这是因为,在查询语法结构中,WHERE 在 GROUP BY 之前,所以无法对分组结果进行筛选。HAVING 在 GROUP BY 之后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选,这个功能是 WHERE 无法完成的。另外,WHERE排除的记录不再包括在分组中。
区别2:如果需要通过连接从关联表中获取需要的数据,WHERE 是先筛选后连接,而 HAVING 是先连接后筛选。
-
这一点,就决定了在关联查询中,WHERE 比 HAVING 更高效。因为 WHERE 可以先筛选,用一个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。HAVING 则需要先把结果集准备好,也就是用未被筛选的数据集进行关联,然后对这个大的数据集进行筛选,这样占用的资源就比较多,执行效率也较低。
空值参与运算
SELECT employee_id,last_name,salary * 12 * (1 + IFNULL(commission_pct,0)) AS "年薪"
FROM employees;
null参与条件判断
SELECT last_name,commission_pct
FROM employees
WHERE commission_pct = NULL;
-- 此时执行,不会有任何的结果
-- 原因:因为null参与等号的运算,结果都是null,where条件选择只要结果不是1,数据全部过滤掉
<=>
安全等于运算符(<=>)与等于运算符(=)的作用是相似的, 唯一的区别 是‘<=>’可以用来对NULL进行判断。在两个操作数均为NULL时,其返回值为1,而不为NULL;当一个操作数为NULL时,其返回值为0,而不为NULL。
总结:安全等于运算符是为NULL而生的。
SELECT 1 <=> '1', 1 <=> 0, 'a' <=>NULL,NULL<=> NULL
FROM DUAL;
-- 结果:1,0,0,1
查询包含a和e的
SELECT last_name,salary,department_id
FROM employees
WHERE last_name LIKE '%a%e%' OR last_name LIKE '%e%a%';
_ :代表一个不确定的字符
-- 练习:查询last_name中第二个字符是'a'的员工信息
SELECT last_name,salary,department_id
FROM employees
WHERE last_name LIKE '_a%';
-- 练习:查询last_name中第2个字符是_且第3个字符是a的员工信息
-- 需要使用转义字符:\
SELECT last_name,salary,department_id
FROM employees
WHERE last_name LIKE '_\_a%';
列的别名只能在ORDER BY 中使用,不能在WHERE中使用,因为WHERE的执行顺序先于别名,故在WHERE使用时会报错
SQL执行顺序
先从FROM开始走,挑出来是哪个表
然后看看WHERE有哪些过滤条件,筛选完之后,得到一批数据(包括所有字段)
再看看SELECT想查什么(只选择SELECT需要的字段),再加上别名
之后再ORDER BY进行排序
单行函数
CONCAT(s1,s2,……,sn) 连接s1,s2,……,sn为一个字符串CONCAT_WS(x,s1,s2,…….,sn) 同CONCAT(s1,s2,…)函数,但是每个字符串之间要加上x
日期和时间函数
NOW() / SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() /LOCALTIMESTAMP() 返回当前系统日期和时间
CURDATE() 返回当前日期,只包含年、月、日; CURTIME() 返回当前时间,只包含时、分、秒
-- 格式化
SELECT
DATE_FORMAT(CURDATE(),'%Y-%M-%D'), -- 2022-July-21st
TIME_FORMAT(CURTIME(),'%h:%i:%s') -- 06:00:00
FROM DUAL;
-- 解析
SELECT
STR_TO_DATE('2022-December-25th 12:21:30 Monday','%Y-%M-%D %h:%i:%S %W')
FROM DUAL;
-- 2022-12-25 12:21:30
加密
MD5(str);
SHA(str);
ENCODE(VALUE,password_seed) 返回使用password_seed作为加密密码加密value
DECODE(VALUE,password_seed) 返回使用password_seed作为加密密码解密value
聚合
返回使用password_seed作为加密密码解密value;
count(*),count(1),count(列名)
1. count(*):统计行数。这会统计表中的所有行,包括NULL值。这是最慢但最准确的统计方式。
2. count(1):也是统计行数。这会统计表中的所有行,但会忽略NULL值。这比count(*)稍微快一点,但结果也是相同的行数统计。
3. count(列名):统计指定列中非NULL值的行数。这会忽略该列中NULL值的行。所以结果可能小于实际行数。但是这种方式最快,因为MySQL可以直接读取行指针中的列值,而不用读取整行。


浙公网安备 33010602011771号