sql 语法

= 的使用

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
相关推荐
学网安的肆伍8 小时前
【043-WEB攻防篇】PHP应用&SQL注入&符号拼接&请求方法&HTTP头&JSON&编码类
sql·安全·php
Shan120512 小时前
站在计算机领域视角看:SQL注入攻击
网络·数据库·sql
轻刀快马12 小时前
别干背八股文了:从一场“双十一秒杀”惨案,看懂 InnoDB 事务、锁与索引的底层齿轮
数据库·sql
山峰哥16 小时前
SQL性能提升20倍的秘密:这些优化技巧让DBA都惊叹
开发语言·数据库·sql·编辑器·深度优先·宽度优先
kumat1 天前
分享-搭建个人系统 MySelfSys
sql·系统
星马梦缘1 天前
数据库作战记录 实验7、8
数据库·sql·oracle
weoptions1 天前
简单sql注入中如何通过简单语句判断注入类型&注入方法
数据库·sql
小短腿的代码世界1 天前
Qt数据库编程深度解析:从SQL基础到ORM架构设计
数据库·sql·qt
红云梦2 天前
官方 Anthropic Postgres MCP Server 存在 SQL 注入漏洞 -- SafeDB 是如何做到 4 层防御的
数据库·sql
消失的旧时光-19432 天前
SQL 第一篇:CRUD 实战,从 user 表开始写接口
数据库·sql·mysql