文章目录
- 一、select语句
- 1、作用
- 2、语法
- 3、空值处理
- 4、反引号、单引号、双引号
- 5、列和表的别名
- 6、distinct去重
- 7、查询表结构
- 8、条件查询
- (1).限定条件
- (2).常用比较运算符
- (3).特殊比较运算符
- (4).逻辑运算符
- 9、order by 子句
- 10、limit
一、select语句
1、作用
select语句具备以下功能:
- 选择
- 投影
- 连接
2、语法
select语句格式如下:
select [distinct] * from 表名;
select [distinct] 列名列表 from 表名;
select [distinct] 表达式 [from 表名];
注:select * from 表名
和select 所有列 from 表名
结果虽然一样,但是从性能上讲select * from 表名
的性能要差一点。因此在数据量很大的时候,如果要查询所有值,还是建议用select 所有列 from 表名
进行查询
3、空值处理
任何直接包含null
值的算术表达式运算后的结果仍然为空值
select null + 100; -- 结果仍为null
ifnull(表达式1, 表达式2)
在计算时对null
值进行替换处理:当表达式1为null
时,整个式子值为表达式1,否则值为表达式2
注:MySQL中的ifnull
函数,可以相当于Oracle中的nvl
函数
select ifnull(1, 2); -- 结果为1
select ifnull(null, 2); -- 结果为2
4、反引号、单引号、双引号
反引号
反引号用于区分保留字、关键字与其他内容,通常用于列名或者表名。
select `name` from `use`;
单引号
表达某个字符串的值。
select * from emp where ename = 'smith';
如果值中包含单引号,可以在单引号字符串内用两个单引号转义,也可以用在双引号字符串内直接用一个单引号(推荐用法)
select * from emp where ename = 'smi''th';
select * from emp where ename = "smi'th"; -- 推荐写法
双引号
通常用于列的别名,也可以用于表达字符串的值
select * from emp where ename = "smith";
如果值中包含双引号,可以在双引号字符串内用两个双引号转义,也可以用在单引号字符串内直接用一个双引号(推荐用法)
select * from emp where ename = "smi""th";
select * from emp where ename = 'smi"th'; -- 推荐写法
5、列和表的别名
列的别名
- 用法
列名 新列名 -- 写法1
列名 as 新列名 -- 写法2
- 注意事项
当新列名中包含空格、大小写、特殊字符时,新列名可以使用反引号、单引号、双引号 - 英文转中文的常用场景
- 查询中SQL语句别名
- 视图中SQL语句别名
- 前端页面展示页面处理 - 使用示例
select ename as 姓名, sal as 工资
from emp;
select enmae as `NAME`, sal*12 as "年 薪"
from emp;
6、distinct去重
使用distinct
关键字消除查询结果的重复行
select job from emp;
select distinct job from emp;
7、查询表结构
使用desc
关键字查询表结构
desc 表名;
8、条件查询
(1).限定条件
使用where
子句增加查询限定条件
select [distinct] 列名列表
from 表名
where 条件表达式;
(2).常用比较运算符
运算符 | 含义 |
= | 等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
<> | 不等于 |
注意:日期一般不建议使用比较运算符,统一使用日期函数
(3).特殊比较运算符
between ... and ...
between A and B
判断要比较的值是否在范围内
注意:
- 若,则
between A and B
表达式值为false
- 也可以用于日期的范围
in
in
的功能类似于or
,判断某个/某些字段是否落在某个集合中
注意:
in
支持多列同时判断,但是仅支持子查询使用示例:
-- 单列判断
select from emp where mgr in(7902, 7566);
-- 多列同时判断
select from emp where (job, mgr) in ('CLERK', 7902); -- 错误写法
select from emp where (job, mgr) in (select 'CLERK', 7902); -- 正确写法
like
like
运算符用于模糊查询。
注意:
- 支持通配符——
%
匹配任意个字符、_
匹配单个字符- 通常与函数
concat(str1, str2, ...)
配合使用,这一点主要是便于配合后端程序的使用,比如Java- SQL Server中大量存在类似正则表达式书写方式来表示范围的
[]
运算符,但是MySQL不支持。使用示例:
-- 查询姓名以S开头的员工
select * from emp where ename like 'S%';
-- 查询姓名包含S的员工
select * from emp where ename like '%S%';
select * from emp where ename like concat('%', 'S', '%'); -- Java中写法
is null
is null
用于空值判断,与其相反的是is not null
(4).逻辑运算符
逻辑运算符包括not
、and
、or
注意:
not
常常和其他运算符组合使用,如not in
、not between
、not like
、is not null
- 使用逻辑运算符要勤加括号,避免优先级问题
9、order by 子句
使用order by
子句对查询结果进行排序
- 在日常使用中,所有语句都应该提供order by
- 排序规则:
数值(大小)、字符串(字典序)、日期(越近越大)、空值null(最小) - 升序/降序:
升序:asc
(默认)
降序:desc
- 排序方式:
可以根据列名、列别名、列的顺序编号进行排序
可以设置多列排序,效果就相当于第一关键字、第二关键字…… - 注意:
order by
的列,建议使用列索引提高查询效率
对于计算列、函数表达式……不建议使用order by
- 使用示例
/* 根据某列进行排序 */
select empno, ename, sal * 12 salOfYear
from emp
order by sal * 12;
select empno, ename, sal * 12 salOfYear
from emp
order by salOfYear;
select empno, ename, sal * 12 salOfYear
from emp
order by 3;
/* 根据多列进行排序 */
select empno, ename, hiredate, sal * 12 salOfYear
from emp
order by hiredate asc, salOfYear asc;
10、limit
使用limit
关键字对查询结果进行分页
- 格式
select 字段列表
from 表名
limit [start_val, ]length;
-- 从第start_val条记录开始,
- 注意:
start_val从0开始标记,可以缺省、默认值也为0
分页时,多次查询的数据可能不一致,所以在使用limit
的时候一定要使用order by
- 使用示例
-- 查询年薪(不带奖金)前三的相关员工信息
select empno, ename, hiredate, sal*12 salOfYear
from emp
order by salOfYear desc
limit 0, 3;