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
相关推荐
小高Baby@3 小时前
CGO_ENABLED=0 导致 SQLite 驱动初始化失败
数据库·sql·golang·ai编程
数厘3 小时前
2.19 sql限制查询(LIMIT、分页查询实现)
数据库·sql·oracle
数厘3 小时前
2.17 sql条件筛选(WHERE、比较运算符、逻辑运算符、BETWEEN、IN、LIKE模糊查询、IS NULL)
数据库·sql
数厘13 小时前
2.1SQL 学习:先懂数据库概念再学 SQL
数据库·sql·学习
spencer_tseng16 小时前
dameng CREATE USER
sql·dameng
数厘17 小时前
2.15 sql基础查询(SELECT、FROM、字段别名、常量与表达式)
数据库·sql·oracle
若阳安好19 小时前
【提效小工具】IN SQL、UPDATE SQL、INSERT SQL
java·数据库·sql
Trouvaille ~1 天前
【MySQL篇】复合查询:多表数据的整合
数据库·sql·mysql·面试·复合查询·基础入门·多表连接
cyber_两只龙宝1 天前
【Oracle】Oracle之SQL中的单行函数
linux·运维·数据库·sql·云原生·oracle