-- _ 在mysql中是表示任一字符,下面查的是名字等于 *Aaaa 的
SELECT * FROM USER WHERE NAME = '_Aaaa';
-- 如果就要查名字是 _Aaaa 的人需要使用转移字符,把_当成普通字符
SELECT * FROM USER WHERE NAME = '\_Aaaa';
-- 或者自定义字符
SELECT * FROM USER WHERE NAME = '$_Aaaa' ESCAPE '$';
SELECT NAME, AGE aage -- 3,过滤字段,起别名(这个步骤之后才能使用别名)
FROM USER -- 1,mysql 查询时先查这个表的所有字段
WHERE AGE > 12 -- 2,过滤 age > 12
ORDER BY aage DESC -- 4,根据 AGE(aage) 排序
数据定义语言分类
类型 | 解释 | 备注 |
---|---|---|
DDL | 数据定义语言 | 创建修改库、表、视图、索引、约束等 CREATE、DROP、ALTER 等 |
DML | 数据操作语言 | 数据行的增删改 INSERT 、 DELETE 、 UPDATE 等 |
DQL | 数据查询语言 | SELECT 语句 |
DCL | 数据控制语言 | 安全控制,比如创建用户,给用户分配权限,回滚数据等 GRANT 、 REVOKE 、 COMMIT 、 ROLLBACK 、 SAVEPOINT 等 |
别名
-- USER_AGE 指定别名,要不要 AS 都行
SELECT USER_AGE AS AGE FROM USER;
-- 对运算结果起别名要加双引号
SELECT USER_AGE+10 "AGE" FROM USER;
去重
使用 DISTINCT,只能对行去重
运算符
符号 | 解释 | 备注 |
---|---|---|
算术运算符 | + 、- 、* 、/ 、% = 、< 、> 、>= 、<= |
|
<==> |
安全等于 | 和 = 的区别是可以和 null 做对比效果和 IS NULL 相同 |
<> |
不等于 | 和!= 没区别,不能和 null 做对比 |
IS NULL 、ISNULL |
为空运算符 | |
IS NOT NULL |
不为空运算符 | |
LEAST |
最小值运算符 | SELECT LEAST(1,2,3) |
GREATEST |
最大值运算符 | |
BETWEEN...AND... |
范围运算符 | 包含临界值 |
IN |
属于运算符 | |
NOT IN |
不属于运算符 | |
LIKE |
模糊匹配 | |
REGEXP |
正则运算符 | |
RLIKE |
判断正则是否合法 |
-- _ 在mysql中是表示任一字符,下面查的是名字等于 *Aaaa 的
SELECT * FROM USER WHERE NAME = '_Aaaa';
-- 如果就要查名字是 _Aaaa 的人需要使用转移字符,把_当成普通字符
SELECT * FROM USER WHERE NAME = '\_Aaaa';
-- 或者自定义字符
SELECT * FROM USER WHERE NAME = '$_Aaaa' ESCAPE '$';
排序和分页
ASC:顺序;DESC:倒叙
多列排序:先以第一个字段排序,然后根据排序的结果再次以第二个字段排序
分页:LIMIT [偏移量] 行数,偏移量公式:(pageNum-1)*pageSize。limit 2,10
从下标2开始,查10条
- select...where … group by … having … order by … limit
- GROUP BY 中的字段必须在 SELECT 中
连接查询
联表查询,分为两个版本:sql92 和 sql95。支持的查询方式有内连接,外连接(左右外连接),全连接(MySql 不支持标准的语法,但是有提代方案)
- 内连接:取交集,关联字段的值在主表和从表中都有的才保留
-- sql92(用逗号关联表)
select * from emp,dept where emp.deptno=dept.deptno
-- sql99(inner join 等价于 join)
select * from emp innner join dept on emp.deptno=dept.deptno
- 外连接:取并集,以主表为准,从表中不匹配的数据用 null 代替。MySql 不支持 sql92 外连接,也不支持 sql95 全外连接,即 MySql 只支持 sql95 的左右外连接
-- sql92 左外连接(左表为主,右边不够的补null,所以右表用+号标识)--- Mysql 不支持
select * from emp, dept where emp.deptno=dept.depetno(+)
-- sql95 左外连接(left outer join 等价于 left join)
select * from emp left outer join dept on emp.deptno=dept.deptno
-- sql92 全外连接 --- Mysql 不支持
select * from emp,dept where epm.deptno(+) = dept.dpetno(+)
-- sql95 全外连接 --- Mysql 不支持
select * from emp full outer join dept on emp.deptno=dept.deptno;
- 联合查询:UNION,UNION ALL
- 要联合的结果集必须一样(个数,顺序,类型),不一样也能出结果但是不准确,也不是我们预期的结果
- UNION 会去重,UNION ALL 不会去重(意味着效率会高于 UNION)
- MySQL 不支持 sql95 全外连接(不支持FULL JOIN),可以使用联合查询代替
- 自然连接 和 USING(sql99新特性)
-- sql95 内连接
select * from emp innner join dept on emp.deptno=dept.deptno;
-- sql99 自然连接(效果和上面一致,自动根据两个表相同的字段去关联,不用显示指定字段)
select * from emp NATURAL join dept;
-- sql99 USING 指定字段(效果和上面一样,不用 ON 指定字段,使用 USING)
select * from emp NATURAL join dept USING(dept_code);
子查询
- 单行子查询(单字段):子查询的结果集只有一行数据,主表和子表的某个字段值相等
-- student 表的 u_id 和 user 表的 id 相等
SELECT * FROM user WHERE ID = (
SELECT u_id FROM student WHERE ID = 123
);
- 单行子查询(多字段):子查询的结果集只有一行数据,主表和子表的多个字段值相等
-- sku.item_id 等于 spu.id,并且 sku.code = spu.code
select * from spu where (id,`code`) = (
select item_id, code from sku
where item_id = 1300949751678957570 and code = 'test02'
);
- 多行子查询(多字段):主表和子表都能是多行数据(单字段直接用 in 来匹配)
-- user 表和 stu表中 code 和 name 相等的
select * from user u where EXISTS (
-- 这里 select 什么不重要
-- 只要能匹配上,user表中的记录就保留,跟子查询没关系
select 1
from stu s
where u.code = s.code and u.name = s.name
);
标签:--,SELECT,基础知识,dept,emp,mysql,deptno,select
From: https://www.cnblogs.com/hangychn/p/17407932.html