mysql的注释
mysql的注释有4 种 :
“#” : # 开头到行尾的都为注释,只能注释一行
“-- ” (2个减号 一个空格) : -- 开头到行尾都为注释 , 只能注释一行
“/* xxx */" : 可以注释多行,但是一定要闭合,不然出错
”/*! 数字 代码 */" : 可以跨行注释,但是一定要闭合,不然出错。
其中 , ”/*! 数字 代码 */" 是有特殊含义的
例如: /*!40101 SET NAMES gbk */; 代表的是 如果mysql 版本大于4.0.1.01 ,就执行后面的 set names gbk 这句代码。
这就有一个好处,这样就可以把mysql 特有的功能用这种注释,给注释掉,对于非mysql数据库可以正常运行,不需要修改,
而对于mysql 数据库,就可以利用这些特性。
SELECT
# 1
SELECT 1
FROM DUAL; #dual: 伪表
# 2
SELECT * FROM employee; #*:表中所有的字段(或者列)
# 3
# 列的别名
# 空格 AS:alias(别名) ""
SELECT employee_id emp_id,last_name AS lname,department_id "部门"
FROM employees;
# 4
# 去除重复行
SELECT DISTINCT department_id
FROM employee;
# 语法不错,但没有实际意义
SELECT DISTINCT department_id,salary
FROM employee;
# 5
# 空值:null
# null 不等同于0,‘’,‘null'
# 空值参与运算 : 其结果也为 空
# IFNULl( ,0)
# 6
# 着重号 ``
#
# 7
# 查询常数
SELECT 123,'查询常数',department_id
FROM employee;
# 8
DESCRIBE employees; # 显示了表中字段的详细信息
DESC employee;
# 9
# 过滤
# WHERE 需要跟在 FROM 后面
SELECT *
FROM employee;
WHERE department_id = 90;
SQL在windows 下除了 字符串 不区分大小写
MySQL 都不区分 也不区分 "" ''
运算符
#算数运算符
+ - * / div % mod
SELECT 100 + '1' #将字符串转换成数值(隐式转换)
FROM DUAL;
# 101
SELECT 100 + 'a' #将'a' 看作 0 处理
FROM DUAL;
SELECT 100 + NULL #null值参与运算,结果为null
FROM DUAL;
/ DIV
100/2 => 50.0000
100 DIV 0 => null
% mod
结果的符号与被模数 有关 , 与模数无关
比较运算符
符号
= <=> <> != > =>
SELECT 1 = 'a' # 'a' 看作 0
FROM DUAL;
SELECT 'a'='b' # =>0 本身的ANSI码比较
FROM DUAL;
# 只要有NULL参与 结果都为 NULL
SELECT lase_name,commission_pct
FROM employees;
WHERE commission_pct = NULL; #此时执行 ,都为NULL 不会有任何结果
<=> 安全等于
null <=> null => 1
null <=> => 0
两边有NULL参与的 都是 NULL
关键字
IS NULL \ IS NOT NULL \ ISNULL
SELECT last_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NULL;
SELECT last_name,salary,commission_pct
FROM employees
WHERE commission_pct IS NOT NULL;
SELECT last_name,salary,commission_pct
FROM employees
WHERE ISNULL(commission_pct); # <=> null \ commission_pct IS NULL
NOT 可以把结果0=》1 1=》0
e.g.
SELECT last_name,salary,commission_pct
FROM employees
WHERE NOT commission_pct <=> null;
# LEAST() \ GREATEST()
# 字典序
# 如果要比字符串的长短 LEAST(LENGTH(字符串),LENGTH(字符串))
# 最后的结果是 字符串的长度
# BETWEEN 条件下界 AND 条件上界 (包含边界)
等价于 >= and <= &&
NOT BETWEEN AND
等级与 >= or <=
# in (set) \ not in (set) 离散的
SELECT last_name,salary,department_id
FROM employees
WHERE department_id = 10 OR 20 OR 30 返回值为1 ,所以将所有的都显示出来了
WHERE department_id = 10 OR department_id = 20 OR department_id = 30;
WHERE department_id IN (10,20,30);
# LIKE :模糊查询
SELECT last_name
FROM employees
WHERE last_name LIKE '%a%';
% 代表 不确定个数的字符 'a%' 代表以a开头的字符串
_ 代表 一个不确定的字符
last_name LIKE '%a%e%' OR last_name last_name '%e%a%'
last_name LIKE '%a%' AND last_name LIKE '%e%'
\_ 转义字符 就是个_
如果让 & 其他符号 充当转义字符前面的标志 可以
'_&_' ESCAPE '&'
# REGEXP \ RLIKE 正则表达式
逻辑运算符
NOT !
AND &&
OR ||
XOR 异或 同为假,异为真
AND 优先级高于 OR
位运算符
& | ^ ~ << >>
排序 分页
ORDED BY
ASC (ascend)
DESC (descend)
若 没有显示指明 ,默认升序
# 可以用列的别名,进行排序
列 的别名,只能在ORDER BY中使用,不能再WHERE 中使用
#
SELECT employee_id,salary //2 //3别名
FROM employees //1
WHERE department_id IN(50,60,70) //1
ORDER BY department_id DESC; //4排序
#二级排序
ORDER BY department_id,salary ASC ; #默认就是升序
分页
LIMIT
SELECT employee_id,salary
FROM employees
LIMIT 0,20; //第一个为 偏移量 ,第二个为 每页有多少条记录
LIMIT (pageNO-1)*pageSize,pageSize;
LIMIT 位置偏移量,条目数
LIMIT 0,条目数 等价于 LIMIT 条目数
声明顺序
WHERE ORDER BY LIMIT
8.0新特性
LIMIT 31 , 2;
LIMIT 2 OFFSET 31 (在OFFSET前后相反)
LIMIT 可以使用在 MySQL pgsql
多表查询
笛卡尔积
缺少了 多表连接的条件
两个表的连接条件
WHERE employees.'department_id=departments.'department_id';
NULL
从sql优化角度,每个字段前都指明其所在的表
WHERE中可以用表的别名 ,表的别名在FROM中声明
表的别名声明后,原先出现表明的地方只能用别名(覆盖)
列 的别名 定义后 也可以使用原名
FROM中的字段最先执行
有n个表至少需要n-1个连接条件
多表查询的分类
1.等价连接 非等价连接
2. 自连接 非自连接
3. 内连接 外连接
#1 非等价连接
SELECT last_name,salary,grade_level
FROM employees e,job_grades j
#WHERE e.`salary` between j.`lowest_sal` AND j.`highest_sal`;
WHERE e.`salary`>=j.`lowest_sal`AND e.`salary`<=j.`highest_sal`;
#自连接
SELECT emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name
FROM employees emp,employees mgr
WHERE emp.`manager_id`=mgr.`employee_id`;
# 内连接
#外连接 合并具有同一列的两个以上的表
# 左外连接 右外连接 满外连接
SQL92
MySQL不支持
内连接:
SELECT emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name
FROM employees emp,employees mgr
WHERE emp.`manager_id`=mgr.`employee_id`;
外连接:
先找到是左外连接 还是 右 连接
SELECT emp.employee_id,emp.last_name,mgr.employee_id,mgr.last_name
FROM employees emp,employees mgr
WHERE emp.`manager_id`=mgr.employee_id(+);
#WHERE mgr.employee_id(+) = emp.`manager_id`;
SQL99
JOIN ON
内连接
SELECT last_name,department_name,city
FROM employees e JOIN departments d #INNER JOIN
ON e.department_id = d.department_id
JOIN locations l
ON d.location_id = l.location_id;
外连接
SELECT last_name,department_name
FROM employees e LEFT JOIN departments #LEFT OUTER JOIN
ON e.department_id = d.department_id
#满外链接 FULL OUTER JOIN 但MySQL不支持
UNION
UNION ALL
能用UNION ALL 不用 UNION
# 中图:内连接
SELECT employee_id,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`
# 左上图:左外连接
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;
# 右上图:右外连接
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
# 左中图:
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL;
# 右中图
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;
# 左下图 满外连接
# UNION ALL 列数要一样 列的类型也要一样
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
UNION ALL
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL;
#右下图
SELECT employee_id,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL;
# SQL99 新特性
# 1.自然连接
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`
AND e.`manager_id` = d.`manager_id`;
# 自动将所有相同的字段,进行 邓加连接
SELECT employee_id,last_name,department_name
FROM employees e NATURAL JOIN departments d;
#2. USING
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id` #这句等价于 USING
#当两个表的连接 的条件 是相同的字段时
USING (department_id);
连接约束
WHERE ON USING
单行函数
MySQL
数值类型
字符串
日期时间
流程控制
加密与解密
信息函数
LENGTH() 与字节数有关 一个汉字占三个字节
INSERT() 字符串索引从1开始
CURDATE(),CURDATE()+0
2022-7-16 20220716
格式化:日期 =》字符串
解析: 字符串=》日期
SELECT *
FROM employees
WHERE hire_date = '2022-7-16';
隐式解析
PASSWORD()
ENCODE()
DECODE
在MySQL8.0中已弃用
AVG=SUM/COUNT
都忽略了NULL