3 普通查询
3.1 简单查询
3.1.1查询一个字段
select 字段名 from 表名;
其中要注意: select和from都是关键字。 字段名和表名都是标识符。
? 强调: ? 对于SQL语句来说,是通用的, ? 所有的SQL语句以“;”结尾。 ? 另外SQL语句不区分大小写,都行。
例如查询部门名字?
mysql> select dname from dept;
3.1.2 查询多个字段
使用逗号隔开 “,” 如:查询部门编号和部门名
select deptno,dname from dept;
3.1.3 查询所有字段
第一种方式:可以把每个字段都写上
select a,b,c,d,e,f... from tablename;
第二种方式:可以使用*
select * from dept;
? 这种方式的缺点: ? 1、效率低 ? 2、可读性差。 ? 在实际开发中不建议,可以自己玩没问题。 ? 你可以在DOS命令窗口中想快速的看一看全表数据可以采用这种方式。
3.2 给列起别名
可以对查询出来的数据其别名。
mysql> select deptno,dname as deptname from dept;
使用as关键字起别名。 注意:只是将显示的查询结果列名显示为deptname,原表列名还是叫:dname 记住:select语句是永远都不会进行修改操作的。(因为只负责查询)
as关键字可以省略吗?可以的
mysql> select deptno,dname deptname from dept;
假设起别名的时候,别名里面有空格,怎么办?
错误示例
mysql> select deptno,dname dept name from dept;
正确示例
select deptno,dname 'dept name' from dept;
select deptno,dname "dept name" from dept;
注意:在所有的数据库当中,字符串统一使用单引号括起来, 单引号是标准,双引号在oracle数据库中用不了。但是在mysql 中可以使用。
? 再次强调:数据库中的字符串都是采用单引号括起来。这是标准的。 ? 双引号不标准。
3.3 查询时进行简单计算
计算员工年薪?sal * 12
mysql> select ename,sal*12 from emp;
也可以对计算后的字段起别名
mysql> select ename,sal*12 as yearsal from emp;
mysql> select ename,sal*12 as '年薪' from emp;
3.4 条件查询
3.4.1 什么是条件查询?
不是将表中所有数据都查出来。是查询出来符合条件的。
? 语法格式如下:
select
字段1,字段2,字段3....
from
表名
where
条件;
3.4.2 条件查询语句
= :等于
select empno,ename from emp where sal = 800;
select empno,sal from emp where ename = 'SMITH';
<>或!= :不等于
select empno,ename from emp where sal != 800;
select empno,ename from emp where sal <> 800;
< :小于
mysql> select empno,ename,sal from emp where sal < 2000;
<= :小于等于
select empno,ename,sal from emp where sal <= 3000;
> :大于
select empno,ename,sal from emp where sal > 3000;
>= :大于等于
select empno,ename,sal from emp where sal >= 3000;
between … and …. 两个值之间, 等同于 >= and <=
select empno,ename,sal from emp where sal >= 2450 and sal <= 3000;
select
empno,ename,sal
from
emp
where
sal between 2450 and 3000;
? 注意: ? 使用between and的时候,必须遵循左小右大。 ? between and是闭区间,包括两端的值。
is null 为 null(is not null 不为空)
mysql> select empno,ename,sal,comm from emp where comm = null;
Empty set (0.00 sec)
mysql> select empno,ename,sal,comm from emp where comm is null;
注意:在数据库当中null不能使用等号进行衡量。需要使用is null 因为数据库中的null代表什么也没有,它不是一个值,所以不能使用 等号衡量。
select empno,ename,sal,comm from emp where comm is not null;
and 并且
select
empno,ename,job,sal
from
emp
where
job = 'MANAGER' and sal > 2500;
or 或者
select
empno,ename,job
from
emp
where
job = 'MANAGER' or job = 'SALESMAN';
and和or同时出现的优先级问题
select
*
from
emp
where
sal > 2500 and deptno = 10 or deptno = 20;
分析以上语句的问题? and优先级比or高。 以上语句会先执行and,然后执行or。 以上这个语句表示什么含义? :找出工资大于2500并且部门编号为10的员工,或者20部门所有员工找出来。
select
*
from
emp
where
sal > 2500 and (deptno = 10 or deptno = 20);
? and和or同时出现,and优先级较高。如果想让or先执行,需要加“小括号” ? 以后在开发中,如果不确定优先级,就加小括号就行了。
in 包含,相当于多个 or (not in 不在这个范围中)
select empno,ename,job from emp where job = 'MANAGER' or job = 'SALESMAN';
select empno,ename,job from emp where job in('MANAGER', 'SALESMAN');
注意:in不是一个区间。in后面跟的是具体的值。
select ename,sal from emp where sal = 800 or sal = 5000;
select ename,sal from emp where sal in(800, 5000);
select ename,sal from emp where sal not in(800, 5000, 3000);
? not in在使用的时候,后面小括号中记得排除为NULL的值。
not 可以取非,主要用在 is 或 in 中
is null
is not null
in
not in
3.5 模糊查询
like 称为模糊查询,支持%或下划线匹配 %匹配任意多个字符 下划线:任意一个字符。 (%是一个特殊的符号,_ 也是一个特殊符号)
记忆如下例子:
mysql> select ename from emp where ename like '%O%';
select ename from emp where ename like '%T';
select ename from emp where ename like 'K%';
select ename from emp where ename like '_A%';
select ename from emp where ename like '__R%';
转义字符
select name from t_student where name like '%_%';
mysql> select name from t_student where name like '%\_%';
4 排序
4.1 升降排序
如何查询所有员工薪资,排序?
select
ename,sal
from
emp
order by
sal;
指定升降排序
升:asc
降:desc
select
ename,sal
from
emp
order by
sal asc;
select
ename,sal
from
emp
order by
sal desc;
4.2 多字段排序
查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,再按照名字升序排列。
select
ename,sal
from
emp
order by
sal asc, ename asc;
4.3 综合案例
了解:根据字段的位置也可以排序
select ename,sal from emp order by 2;
了解一下,不建议在开发中这样写,因为不健壮。 因为列的顺序很容易发生改变,列顺序修改之后,2就废了。
综合一点的案例: 找出工资在1250到3000之间的员工信息,要求按照薪资降序排列。
select
ename,sal
from
emp
where
sal between 1250 and 3000
order by
sal desc;
关键字顺序不能变: select … from … where … order by …
? 以上语句的执行顺序必须掌握: ? 第一步:from ? 第二步:where ? 第三步:select ? 第四步:order by(排序总是在最后执行!)
5 数据处理函数
5.1 数据处理函数定义
数据处理函数又被称为单行处理函数
单行处理函数的特点:一个输入对应一个输出。
和单行处理函数相对的是:多行处理函数。(多行处理函数特点:多个输入,对应1个输出!)
5.2 常见的单行处理函数
lower 转换小写
mysql> select lower(ename) as ename from emp;
upper 转换大写
select * from t_student;
select upper(name) as name from t_student;
substr 取子串
substr( 被截取的字符串, 起始下标,截取的长度)
select substr(ename, 1, 1) as ename from emp;
注意:起始下标从1开始,没有0。
如何找出员工名字第一个字母是A的员工信息?
第一种方式:模糊查询
select ename from emp where ename like 'A%';
第二种方式:substr函数
select
ename
from
emp
where
substr(ename,1,1) = 'A';
首字母大写?
select concat(upper(substr(name,1,1)),substr(name,2,length(name) - 1)) as result from t_student;
concat函数 字符串的拼接
select concat(empno,ename) from emp;
length 取长度
select length(ename) enamelength from emp;
trim 去空格
mysql> select * from emp where ename = trim(' KING');
case…when…then…when…then…else…end
可以不用两个when
select
ename,job,
sal as oldsal,
(case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal
from
emp;
round 四舍五入
select 字段/字面值 from 表名; select后面直接跟“字面量/字面值”。
select 'abc' as bieming from emp;
结论:select后面可以跟某个表的字段名(可以等同看做变量名),也可以跟字面量/字面值(数据)。
select round(1236.567, 0) as result from emp;
select round(1236.567, 1) as result from emp;
select round(1236.567, 2) as result from emp;
select round(1236.567, -1) as result from emp;
rand() 生成随机数
mysql> select round(rand()*100,0) from emp;
ifnull 可以将 null 转换成一个具体值 ifnull是空处理函数。专门处理空的。 在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL。
为了避免这个现象,需要使用ifnull函数。 ifnull函数用法:ifnull(数据, 被当做哪个值) 如果“数据”为NULL的时候,把这个数据结构当做哪个值。
select ename, (sal + ifnull(comm, 0)) * 12 as yearsal from emp;
6 分组函数与分组查询
6.1 分组函数
6.1.1 多行处理函数的定义
分组函数也叫多行处理函数。
多行处理函数的特点:输入多行,最终输出一行。
常见的有5个:
count 计数 sum 求和 avg 平均值 max 最大值 min 最小值
注意: 分组函数在使用的时候必须先进行分组,然后才能用。 如果你没有对数据进行分组,整张表默认为一组。
6.1.2 多行处理函数举例
找出最高工资?
mysql> select max(sal) from emp;
找出最低工资?
mysql> select min(sal) from emp;
计算工资和:
mysql> select sum(sal) from emp;
计算平均工资:
mysql> select avg(sal) from emp;
计算员工数量?
mysql> select count(ename) from emp;
6.1.3 分组函数注意要点
第一点:分组函数自动忽略NULL,你不需要提前对NULL进行处理。
第二点:分组函数中count(*)和count(具体字段)有什么区别?
? count(具体字段):表示统计该字段下所有不为NULL的元素的总数。 ? count(*):统计表当中的总行数。(只要有一行数据count则++) ? 因为每一行记录不可能都为NULL,一行数据中有一列不为NULL,则这行数据就是有效的。
mysql> select count(*) from emp;
mysql> select count(comm) from emp;
第三点:分组函数不能够直接使用在where子句中。
? 因为是先执行where再执行group by,分组函数必须使用于group by后面。
第四点:所有的分组函数可以组合起来一起用。
select sum(sal),min(sal),max(sal),avg(sal),count(*) from emp;
6.2 分组查询
6.2.1 分组查询的定义
在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。 这个时候我们需要使用分组查询,怎么进行分组查询呢?
select
...
from
...
group by
...
需要用到分组查询的举例:
- 计算每个部门的工资和?
- 计算每个工作岗位的平均薪资?
- 找出每个工作岗位的最高薪资?
6.2.2 执行顺序问题
select
...
from
...
where
...
group by
...
order by
...
以上关键字的顺序不能颠倒,需要记忆。 执行顺序是什么?
1. from
2. where
3. group by
4. select
5. order by
? 为什么分组函数不能直接使用在where后面?
select ename,sal from emp where sal > min(sal);
? 因为分组函数在使用的时候必须先分组之后才能使用。 ? where执行的时候,还没有分组。所以where后面不能出现分组函数。
select sum(sal) from emp;
? 这个没有分组,为啥sum()函数可以用呢? ? 因为select在group by之后执行。
6.2.3 分组查询举例
- 找出每个工作岗位的工资和?
select
job,sum(sal)
from
emp
group by
job;
以上这个语句的执行顺序? 先从emp表中查询数据。 根据job字段进行分组。 然后对每一组的数据进行sum(sal)
分组查询时,对selcet后面字段的限制
select ename,job,sum(sal) from emp group by job;
以上语句在mysql中可以执行,但是毫无意义。 以上语句在oracle中执行报错。 oracle的语法比mysql的语法严格。(mysql的语法相对来说松散一些!)
重点结论: 在一条select语句当中,如果有group by语句的话, select后面只能跟:参加分组的字段,以及分组函数。 其它的一律不能跟。
- 找出每个部门的最高薪资
实现思路:按照部门编号分组,求每一组的最大值。
mysql> select deptno,max(sal) from emp group by deptno;
- 找出“每个部门,不同工作岗位”的最高薪资?
技巧:两个字段联合成1个字段看。(两个字段联合分组)
select
deptno, job, max(sal)
from
emp
group by
deptno, job;
6.2.4 使用having进行再次筛选
having不能单独使用,having不能代替where,having必须和group by联合使用。
找出每个部门最高薪资,要求显示最高薪资大于3000的?
select
deptno,max(sal)
from
emp
group by
deptno
having
max(sal) > 3000;
思考一个问题:以上的sql语句执行效率是不是低? 比较低,实际上可以这样考虑:先将大于3000的都找出来,然后再分组。
select
deptno,max(sal)
from
emp
where
sal > 3000
group by
deptno;
优化策略: where和having,优先选择where,where实在完成不了了,再选择having。
where没办法的????
找出每个部门平均薪资,要求显示平均薪资高于2500的。
select
deptno,avg(sal)
from
emp
group by
deptno
having
avg(sal) > 2500;
6.3 总结
语句顺序
select
...
from
...
where
...
group by
...
having
...
order by
...
执行顺序
- from
- where
- group by
- having
- select
- order by
从某张表中查询数据: 先经过where条件筛选出有价值的数据。对这些有价值的数据进行分组。分组之后可以使用having继续筛选。 select查询出来。最后排序输出!
找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER岗位之外,要求按照平均薪资降序排。
select
job, avg(sal) as avgsal
from
emp
where
job <> 'MANAGER'
group by
job
having
avg(sal) > 1500
order by
avgsal desc;
|