简单查询
语法格式
select [distinct] * | {colum1 , colum2...} from table_name
: SQL关键字
和字段或表名称
之间采用空格分开
-
select
指定查询哪些列的数据 ,*
号代表要查询所有的列(效率不高) , colum指定要查询的具体列 , 默认是面向整张表查询 -
当查询的多个记录的每个字段的值都相同时可以使用
distinct(可选)
去掉重复的数据 -
查询结果集中显示的字段名以
select
关键字后面的字段名为准, 如果起别名就以别名为准
简单查询
查询一个字段
: select
关键字指定查询的字段名称,from
关键字指定要查询的表
# 查询员工的姓名
select ename from emp;
查询多个字段
: 查询的多个字段之间采用逗号间隔,最后一个字段后面不能使用逗号
# 查询员工的姓名和编号
select empno, ename from emp;
查询所有字段
: 将查询的所有的字段放到select关键字的后面可读性强效率高(推荐),采用*
代表要查询所有的列但是读性差效率低(不建议)
# 每个字段都写上
select a,b,c,d,e,f... from tablename;
# 使用 * 号
select * from emp;
对查询的列进行运算
在select语句中的字段名与数字或者其他字段名
三者可以一起混合运算,先执行的用括号括起来
- 在SQL语句当中
若有NULL值参与数学运算计算结果一定是NULL
, 运算前建议使用ifnull空值处理函数
预先处理
# 列出员工的编号,姓名和年薪
select empno, ename, sal*12 from emp;
给查询的列起别名
采用as
关键字可以重新命名查询的表字段名,as也可以省略
但是要求查询字段名和字段别名
之间需要使用空格分开,别名如果是字符串必须添加单引号或者双引号
- 别名只是将显示的查询结果的列名更改,
不会更改数据库中原表的列名
,select语句只负责查询不会进行修改操作
# 将查询出来的字段显示为中文
select empno as '员工编号', ename as '员工姓名', sal*12 as '年薪' from emp;
# as可以省略
select empno "员工编号", ename "员工姓名", sal*12 "年薪" from emp;
# dept和name之间有空格
select deptno,dname 'dept name' from dept; //加单引号
select deptno,dname "dept name" from dept; //加双引号
where条件查询
条件运算符
条件查询需要用到where
关键字且必须放到from
关键字的后面,默认是先面向整张表查询到所有,然后以查询到的记录中的一些字段作为判断条件进行筛选
- 在select语句中
AND的优先级默认比OR高
, 如果想让OR先执行就需要加小括号
, 开发中如果不确定优先级就加小括号就行了
运算符 | 说明 |
---|---|
= | 等于 |
<>或!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
between …and …. | 必须遵循左小右大且是闭区间即包括两端的值,等同于>= and <= |
is null/is not null | 判断字段的值是否为空,数据库中的null 代表字段不填值即没有值,使用等号表示判断字段值是否为null 这个具体的值 |
and | 表示并且的含义,表示所有的条件必须满足 |
or | 或者 |
in/not in | 是否包含的意思,相当于多个 or, in(字符串或数字,......) 括号里面是具体的值不是一个区间 |
not | not 可以取非,主要用在is或in 中 |
like | 模糊查询,支持"%(匹配任意个字符)" 或 "_(匹配一个字符)" , like中的表达式必须放到单引号中或者双引号中如果要匹配 %和_ 需要使用\ 进行转义为普通的%和_ |
=,<>,!=操作符
=
: 查询薪水为5000的员工,查询职位为MANAGER的员工,job
字段是字符串类型所以字段值必须使用引号
# 查询薪水为5000的员工
select empno, ename, sal from emp where sal=5000;
# 查询职位为MANAGER的员工, 使用双引号
select empno, ename from emp where job="manager";
# 查询职位为MANAGER的员工, 使用单引号
select empno, ename from emp where job='manager';
# Mysql默认情况下大小写是不敏感的
select empno, ename from emp where job='MANAGER';
<>(推荐)和!=
: 查询薪水不等于5000的员工,查询职位不是MANAGER的员工
# 查询薪水不等于5000的员工
select empno, ename, sal from emp where sal <> 5000;
select empno, ename, sal from emp where sal != 5000;
# 数值也可以采用单引号引起来,mysql默认会自动进行类型转换但是不建议这么写
select empno, ename, sal from emp where sal <> '5000';
# 查询职位不是MANAGER的员工
select empno, ename from emp where job <> 'MANAGER';
between..and,>=和<=操作符
采用>=和<=
: 查询薪水为1600到3000的员工
select empno, ename, sal from emp where sal >= 1600 and sal <= 3000
采用between…and…
: 查询薪水为1600到3000的员工
select empno, ename, sal from emp where sal between 1600 and 3000;
and,or,in,not,is null
AND
: 查询职位为MANAGER并且薪水大于2500的员工
select * from emp where job='MANAGER' and sal > 2500;
OR
: 查询出职位为manager或者为salesman的员工
select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
IN
: 查询出job为manager或者为salesman的员工,查询出薪水是1600或3000的员工
select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');
select ename,sal from emp where sal = 800 or sal = 5000;
# in(800, 5000)不是表示800到5000都找出来
select ename,sal from emp where sal in(800, 5000);
NOT
: 查询出薪水不是1600或3000的员工, 查询出津贴不为null的所有员工
# 薪水不是1600或3000的员工
select * from emp where sal <> 1600 or sal <> 3000;
select * from emp where not (sal = 1600 or sal = 3000);
select * from emp where sal not in (1600, 3000);
# 津贴不为 null 的所有员工
select * from emp where comm is not null;
IS NULl
: 查询津贴为空的员工
# 无法查询出符合条件的数据
select * from emp where comm=null;
# 因为null类型比较特殊,必须使用is来比较
select * from emp where comm is null;
like模块查询
like
可以实现模糊查询,支持"%(匹配任意个字符)"
和"_(匹配一个字符)"
, like中的表达式必须放到单引号中或者双引号中
# 错误的写法
select * from emp where ename like _A%
查询姓名以M开头所有的员工
select * from emp where ename like 'M%';
查询姓名以N结尾的所有的员工
select * from emp where ename like '%N';
查询姓名中包含O的所有的员工
select * from emp where ename like '%O%';
查询姓名中第二个字符为A的所有员工
select * from emp where ename like '_A%';
查询出名字中有_
的,需要利用\
转义字符
# 错误写法
select name from t_student where name like '%_%';
# 需要利用\转义字符,将_转化为普通的下划线
select name from t_student where name like '%\_%';
表达式的优先级
在select语句中AND的优先级默认比OR高, 如果想让OR先执行就需要加小括号
, 开发中如果不确定优先级就加小括号就行了
查询薪水大于1800并且部门代码为20或30的员工
# 实际含义是工资大于1800并且部门编号为20的员工 或者部门编号是30的所有的员工
select * from emp where sal > 1800 and deptno = 20 or deptno = 30;
# 实际含义是查询工资大于1800,并且部门编号为20或30部门的员工
select * from emp where sal > 1800 and (deptno = 20 or deptno = 30);
查询结果排序
order by
关键字后面可以跟上排序字段,如果有多个排序字段采用逗号间隔
,原理是先根据第一个字段排序,如果重复了再根据第二个字段排序,以此类推
desc
表示按照排序字段降序排序,asc
表示按照排序字段升序排序,由于MySQL默认按照升序排序,所以排序时asc
可以省略不写- 如果select语句中包含
where
关键字,order by
关键字必须放到where
关键字后面,如果没有则放到from
关键字后面 - 按照查询结果集中某列的序号也可以进行排序,但是使用
序号
排序含义不明确并且列的顺序一但发生改变就无效了(不推荐)
排序总是在最后执行
: 先查询到结果集,然后按照结果集中的某个字段名或者字段的位置
进行升序或降序排序
select
字段1,字段2
from
表名
where
条件
order by
要排序的字段名/字段在表中的索引 desc/asc;
单一字段排序
ASC
: 查询所有员工并按照薪水由小到大排序,查询职位为MANAGER的所有员工并按照薪水由小到大排序
# 查询所有员工并按照薪水由小到大排序
select * from emp order by sal;
# 省略asc关键字
select * from emp order by sal asc;
# 查询职位为MANAGER的所有员工并按照薪水由小到大排序
select * from emp where job='MANAGER' order by sal;
DESC
: 查询所有员工并按照薪水由大到小排序
select * from emp order by sal desc;
按照多个字段排序
查询所有员工按照职位和薪水升序排序
# job在前起主导只有job相等的时候才会考虑启用sal排序
select * from emp order by job,sal;
查询所有员工按照职位和薪水倒序排序
# job在前起主导,只有job相等的时候才会考虑启用sal排序
select * from emp order by job desc, sal desc;