MySQL之数据库查询语言(DQL)
数据库执行DQL语句不会对数据进行改变,而是让数据库发送结果给客户端,查询返回的结果是一张虚拟表 。
select selection_list //要查询的列名称
from table_list //要查询的表名称
where condition //行条件
group by grouping_columns //对结果分组
having condition //分组后的行条件
order by sorting_columns //对结果排序
limit offset_start, row_count //结果限定
-
基础查询
查询所有列:
select * from table_name;
查询指定列
select 列名1,列名2,...from table_name;
-
条件查询
条件查询就是在查询时给出where子句,在where子句中可以使用如下运算符及关键字:
=, != , <>, < ,<= ,> ,>=;
between…and;
in(set); //括号中可以放多个值,用逗号隔开
is null; //判断是否为空
and, or , not , is not null例子:
1)查询性别为女,年龄大于等于50的记录
select * from stu where gender = ‘femal’ and age>=50;
2)查询学号为s_1001,或者姓名为lisi的记录
select * from stu where sid = ‘s_1001’ or name = ‘lisi’;
3)查询学号为s_1001,s_1002,s_1003的记录
select * from stu where sid = ‘s_1001’ or sid = ‘s_1002’ or sid = ‘s_1003’;
select * from stu where sid in( ‘s_1001’ , ‘s_1002’ , ‘s_1003’);
4)查询学号不是s_1001,s_1002,s_1003的记录
select * from stu where sid not in( ‘s_1001’ , ‘s_1002’ , ‘s_1003’);
5)查询年龄为null的记录
select * from stu where age is null;
6)查询年龄在20和40之间的记录
select * from stu where age between 20 and 40; -
模糊查询
通配符:_ 任意字符 % 任意0~n个字符
例子:
1)查询姓名有5个字母组成的记录
select * from stu where name like ‘_ _ _ _ _ ';
2)查询姓名有5个字母组成且第5个字母为i的记录
select * from stu where name like ’ _ _ _ _ i’;
3)查询姓名以‘z’开头的记录
select * from stu where name like ‘z%’;
4)查询姓名第二个字母为‘’i’的记录
select * from stu where name like ‘_i%’;
5)查询姓名中包含‘a’的记录
select * from stu where name like ‘%a%’; -
字段控制查询
1)去除重复记录需要使用distinct
例子:
select distinct sal from emp; //在emp表中查询sal列,并去除重复记录2)查询两列之和
例如sal和comn两列都是数值类型,可以进行运算。但是,如果sal或comn中有一个字段不是数值,那么会出错。
select sal + if null(comn,0) from emp; // if null(comn,0),如果为null,则返回0;否则,不变
3)给列名添加别名
select sal + if null(comn,0) as total from emp; //别名为total,而且as可以省略
-
排序
order by 列名 [asc|desc]
例子:
select * from emp order by age asc; //查询所有记录,并按年龄升序排列
select * from emp order by sal asc, empno desc; //查询所有记录,并按月薪升序排列,月薪相同时,按编号降序排列 -
聚合函数
聚合函数适用于纵向运算的函数。
count():统计指定列不为null的记录数;
max():计算指定列的最大值,如果执行列是字符串,使用字符串排序规则得到最大值
min():计算指定列的最小值
sum():计算指定列的数值和,如果指定列不是数值类型,返回值为0
avg():计算指定列的平均值,如果指定列不是数值类型,返回值为0例子:
select avg(age) from stu; //查找年龄的平均值
select max(age) from stu; //查找年龄的最大值
select sum(sal)+sum(comn) from emp; //查询所有雇员月薪+佣金和
select count( * ) from emp; //查询表中所有记录数
select count(comn) from emp; //查询有佣金的人数
select count( * ) from emp where sal >5000; //查询工资大于5000的人数 -
分组查询 group by
select count( * ) from emp group by deptno; //查询各部门的人数
select deptno ,sum(sal) from emp group by deptno; //查询各部门的部门编号和工资和
select deptno ,count( * ) from emp group by deptno; //查询各部门的部门编号和人数
select deptno ,count( * ) from emp where sal >5000 group by deptno; //查询各部门的部门编号和工资大于5000的人数having子句用于分组之后再筛选
select deptno ,sum(sal) from emp group by deptno having sum(sal)>9000; 查询工资总和大于9000的部门编号和该部门人数
having是对分组后数据进行过滤,where是在分组前对数据进行过滤
having后面可以使用聚合函数,where后不可以使用聚合函数 -
limit 方言
limit用来限定查询结果的起始行以及总行数。
select * from emp limit 0,5; //查询5行记录,从第 0 行开始
书写顺序:select —— from —— where —— group by —— having —— order by —— limit
执行顺序:from —— where —— group by —— having —— select —— order by ——limit