= 的使用
sql
"字符串存在隐式转换,如果无法转换数值,则看作0"
"数值 与 字符串比较,字符串自动转数值;无法转数字的字符串,一律按 0 处理"
# 1、
SELECT
1 = 2,
1 != 2,
1 = '1', # 数值和字符串比较,字符串'1' 能转为数值 1
1 = 'a', # 字符串'a' 无法转为有效数字,隐式转换为 0
0 = 'a' # 字符串'a' 转为 0
FROM
DUAL
#2、只要有 null 参与,结果就为 null
SELECT 1 = NULL, NULL = NULL
from DUAL

<=> 的使用
sql
"为 null 而生,只有两边都为 NULL 时,结果才为 true"
SELECT 1 <=> NULL, NULL <=> NULL
from DUAL
"查询表中commission_pct为null的数据,
会查出所有commission_pct值为null的数据行"
SELECT last_name, salary, commission_pct
from employees
WHERE commission_pct <=> NULL

IS NULL 、IS NOT NULL 、ISNULL
sql
"询表中 commission_pct 为 null 的数据"
SELECT last_name, salary, commission_pct
from employees
WHERE commission_pct IS NULL
或者
SELECT last_name, salary, commission_pct
from employees
WHERE ISNULL(commission_pct);
"查询表中 commission_pct 不为 null 的数据"
SELECT last_name, salary, commission_pct
from employees
WHERE commission_pct IS NOT NULL
或者
SELECT last_name, salary, commission_pct
from employees
WHERE NOT commission_pct <=> NULL
least最小 、 greatest最大
sql
SELECT LEAST('g', 'a', 'p', 'z'), GREATEST('w', 'd', 'a', 'z')
FROM DUAL
between and
sql
"查询工资,在6000 ~ 8000范围内的,包含6000 和 8000"
SELECT last_name, salary, commission_pct
FROM employees
WHERE salary BETWEEN 6000 AND 8000
# WHERE salary >= 6000 && salary <= 8000
"查询工资,不在6000 ~ 8000范围内的"
SELECT last_name, salary, commission_pct
FROM employees
WHERE salary NOT BETWEEN 6000 AND 8000
# WHERE salary < 6000 OR salary > 8000
in 、not in
sql
"查询部门为10、20、30部门的员工"
SELECT last_name, department_id
from employees
# WHERE department_id = 10 or department_id = 20 or department_id = 30
WHERE department_id IN (10, 20, 30)
"查询工资不是6000、7000、8000的员工"
SELECT last_name, department_id
from employees
WHERE salary NOT IN (6000, 7000, 8000)
like、%、_
like 模糊查询,
%:代表不确定个数的字符(0个、1个、2个...多个)
_:代表一个不确定的字符
sql
"查询 last_name 中包含 字符a 的员工"
SELECT last_name, department_id
from employees
WHERE last_name LIKE '%a%'
"查询 last_name 中以 字符a 开头的员工"
SELECT last_name, department_id
from employees
WHERE last_name LIKE 'a%'
"查询 last_name 中包含字符a 且 包含字符b 的员工"
SELECT last_name, department_id
from employees
# WHERE last_name LIKE '%a%' AND last_name LIKE '%b%'
WHERE last_name LIKE '%a%b%' OR last_name LIKE '%b%a%'
"查询 last_name 中第三个字符是'a'的员工"
SELECT last_name, department_id
from employees
WHERE last_name LIKE '__a%'
"查询 last_name 中,第二个字符是_ 且 第三个字符是'a'的员工(用到了:【转义字符\】)"
SELECT last_name, department_id
from employees
WHERE last_name LIKE '_\_a%'
或者
SELECT last_name, department_id
from employees
WHERE last_name LIKE '_$_a%' ESCAPE '$' 解释:"【将 '$' 设置为转义字符】"
order by(升序、降序)
asc:升序,desc:降序
sql
SELECT last_name, department_id, salary
from employees
ORDER BY salary DESC
"使用列的别名进行排序"
SELECT last_name, department_id, salary * 12 as annual_sal #年工资
from employees
ORDER BY annual_sal
"查询员工信息,按照 department_id降序,salary升序 排列"
SELECT last_name, department_id, salary
from employees
ORDER BY department_id DESC, salary ASC
分页 limit
分页公式:limit (pageNo - 1) * pageSize, pageSize
sql
"每页显示10条记录,此时显示第1页"
SELECT employee_id, last_name, department_id, salary
from employees
LIMIT 0, 10
"每页显示10条记录,此时显示第2页"
SELECT employee_id, last_name, department_id, salary
from employees
LIMIT 10, 10
SELECT employee_id, last_name, department_id, salary
from employees
WHERE salary > 6000
ORDER BY salary DESC
LIMIT 0, 10
"表里有107条数据,我只要第 32、33 条数据,怎么办"
SELECT employee_id, last_name, department_id, salary
from employees
LIMIT 31, 2
"表里有107条数据,我只要第 32、33 条数据,怎么办"
# MySQL 8.0 新特性:limit ... offset ...
SELECT employee_id, last_name, department_id, salary
from employees
LIMIT 2 OFFSET 31
自连接
sql
"查询 员工id、员工姓名、及其管理者的id和姓名
在 employees 表中,a员工是员工,同时,a员工也是其他员工的管理者
管理者的employee_id 是 员工的manager_id "
SELECT e.employee_id, e.last_name, m.employee_id, m.last_name
FROM employees e, employees m
WHERE e.manager_id = m.employee_id

内外连接
sql
#【内连接】
SELECT e.last_name, d.department_name, l.city
from employees e
JOIN departments d
ON e.department_id = d.department_id
JOIN locations l
on d.location_id = l.location_id
解释:"只保留三张表都能匹配上的数据,无匹配则直接过滤。"
# -----------------------------------------------------------------------
#【外连接】
# 查询,所有员工,的laset_name、department_name 的信息
SELECT e.last_name, d.department_name
from employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
解释:"所有员工,一定都会显示出来,有部门 → 显示部门名,没部门 → 部门名显示 NULL"
SELECT e.last_name, d.department_name
from employees e
RIGHT JOIN departments d
ON e.department_id = d.department_id
解释:"所有部门,一定都会显示出来,部门里有人 → 显示员工名,部门里没人 → 员工名显示 NULL"
# -----------------------------------------------------------------------
# employees:代表A,departments:代表B
#【中图】内连接
SELECT e.employee_id, d.department_name
from employees e
JOIN departments d
ON e.department_id = d.department_id
#【左上图】左外连接
SELECT e.employee_id, d.department_name
from employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
#【右上图】右外连接
SELECT e.employee_id, d.department_name
from employees e
RIGHT JOIN departments d
ON e.department_id = d.department_id
#【左中图】
SELECT e.employee_id, d.department_name
from employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_id IS NULL
#【右中图】
SELECT e.employee_id, d.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 e.employee_id, d.department_name
from employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
UNION ALL
SELECT e.employee_id, d.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 e.employee_id, d.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 e.employee_id, d.department_name
from employees e
RIGHT JOIN departments d
ON e.department_id = d.department_id
#【右下图】:左中图 UNION ALL 右中图
SELECT e.employee_id, d.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 e.employee_id, d.department_name
from employees e
RIGHT JOIN departments d
ON e.department_id = d.department_id
WHERE e.department_id IS NULL