优快云话题挑战赛第2期
参赛话题:学习笔记
目录
!!!查询之前为大家提供一张员工表,这是我们后续查询所用到的
--设置客户端连接服务器端的编码
set names utf8;
--丢弃数据库如果存在
drop database if exists zyh;
--创建新的数据库,设置存储字符的编码
create database zyh charset=utf8;
--进入创建的数据库
use zyh;
--创建保存部门数据的表
create table dept(
did int primary key auto_increment,
dname varchar(16) unique
);
--插入数据
insert into dept values(10,'研发部');
insert into dept values(20,'运营部');
insert into dept values(30,'市场部');
insert into dept values(40,'测试部');
--创建保存员工数据的表
create table emp(
eid int primary key auto_increment,
ename varchar(16) not null,
sex boolean default 0, #1-男 0-女
birthday date,
salary decimal(8,2), #999999.99
deptid int,
foreign key(deptid) references dept(did)
);
--插入数据
insert into emp values(null,'tao',default,'1973-7-15',50000,20);
INSERT INTO emp VALUES(NULL,'Tom',1,'1990-5-5',6000,20);
INSERT INTO emp VALUES(NULL,'Jerry',0,'1991-8-20',7000,10);
INSERT INTO emp VALUES(NULL,'David',1,'1995-10-20',3000,30);
INSERT INTO emp VALUES(NULL,'Maria',0,'1992-3-20',5000,10);
INSERT INTO emp VALUES(NULL,'Leo',1,'1993-12-3',8000,20);
INSERT INTO emp VALUES(NULL,'Black',1,'1991-1-3',4000,10);
INSERT INTO emp VALUES(NULL,'Peter',1,'1990-12-3',10000,10);
INSERT INTO emp VALUES(NULL,'Franc',1,'1994-12-3',6000,30);
INSERT INTO emp VALUES(NULL,'Tacy',1,'1991-12-3',9000,10);
INSERT INTO emp VALUES(NULL,'Lucy',0,'1995-12-3',10000,20);
INSERT INTO emp VALUES(NULL,'Jone',1,'1993-12-3',8000,30);
INSERT INTO emp VALUES(NULL,'Lily',0,'1992-12-3',12000,10);
INSERT INTO emp VALUES(NULL,'Lisa',0,'1989-12-3',8000,10);
INSERT INTO emp VALUES(NULL,'King',1,'1988-12-3',10000,10);
INSERT INTO emp VALUES(NULL,'Brown',1,'1993-12-3',22000,NULL);
一.简单查询
-
查询特定的列
- 示例: 查询出所有员工的编号和姓名
-
select eid,ename from emp;
- 练习:查询出所有员工的姓名,性别,生日,工资
-
select ename,sex,birthday,salary from emp;
-
查询所有的列
-
select * from emp;
-
-
给列起别名
- as 用于设置别名,as也可以省略,保留空格即可。
- 示例:查询出所有员工编号和姓名,使用一个字母作为别名
-
select eid as a,ename as b from emp;
- 练习:查询出所有员工姓名、生日、工资,使用一个字母作为别名
-
select ename a,birthday b,salary c from emp;
-
显示不同的记录
- distinct 不同的,有区别的,显示不同的记录。
- 示例:查询出员工都分布在哪些部门
-
select distinct deptid from emp;
- 练习:查询出都有哪些性别的员工
-
select distinct sex from emp;
-
查询时执行计算
- 示例:计算2+3+4*5+7*3
-
select 2+3+4*5+7*3;
- 练习:查询出所有员工的姓名及其年薪
-
select ename,salary*12 from emp;
- 练习:假设每个员工的工资增长2000,年终奖30000,查询出所有员工的姓名及其年薪,使用一个字母作为别名
-
select ename a,(salary+2000)*12+30000 b from emp;
-
查询结果排序
- order by(排序) asc(升序) desc(降序)
- 示例:查询出所有的部门,结果按照编号升序排列
-
select * from dept order by did asc;
- 示例:查询出所有的部门,结果按照编号降序排列
-
select * from dept order by did desc;
-
条件查询
- and / && 两个条件都满足 or / || 两个条件满足一个
- 示例:查询出编号为5的员工
-
select * from emp where eid=5;
- 练习:查询出没有明确部门的员工
-
select * from emp where deptid is null;
- 练习:查询出有明确部门的员工
-
select * from emp where deptid is not null;
- 练习:查询出20号部门或者30号部门的员工有哪些
-
select * from emp where deptid=20 or deptid=30; select * from emp where deptid in(20,30);
- 练习:查询出不在20号部门并且不在30号部门的员工有哪些
-
select * from emp where deptid!=20 and deptid!=30; select * from emp where deptid not in(20,30);
-
模糊条件查询
-
- % 匹配任意个字符 >=0
- _ 匹配任意1个字符 =1
- 以上两个匹配符号必须结合like关键字使用
- 示例:查询出姓名中含有字母e的员工有哪些
-
select * from emp where ename like '%e%';
- 练习:查询出姓名中以e结尾的员工有哪些
-
select * from emp where ename like '%e';
- 练习:查询出姓名中倒数第2个字符是e的员工有哪些
-
select * from emp where ename like '%e_';
-
-
分页查询
- 查询的结果有太多的数据,一次显示不完可以做出分页显示
需要两个已知的条件:当前的页码、每页的数据量 - 每页开始查询的值 = (当前的页码 - 1)*每页的数据量
- select * from emp limit 开始查询的值, 每页的数据量
- 查询的结果有太多的数据,一次显示不完可以做出分页显示
二.复杂查询
- 聚合查询
- count()/sum()/avg()/max()/min()
- 示例:查询出所有员工的数量
-
select count(*) from emp;
- .练习:使用员工的编号查询数量
-
select count(eid) from emp; #推荐使用主键列
- 分组查询
- 分组查询通常只是用来查询分组条件和聚合函数
- group by 列名称 按照某一个列进行分组
- 示例:查询出男女员工的数量、平均工资分别是多少
-
select count(eid),avg(salary),sex from emp group by sex;
- 练习:查询出各部门的工资总和,最高工资,最低工资
-
select sum(salary),max(salary),min(salary), deptid from emp group by deptid;
- year() 获取日期中的年份部分
- 示例:查询出所有员工出生的年份
-
select year(birthday) from emp;
- 练习:查询出1993年出生的员工所有的列
-
select * from emp where year(birthday)=1993;
- 子查询
- 是多个查询命令的组合,把其中一个的结果作为另一个的条件来使用
- 示例:查询出工资最高的员工
- 步骤1:查询出工资的最高值 —— 50000
-
select max(salary) from emp;
- 步骤2:查询工资最高值对应的员工.
-
select * from emp where salary=50000;
- 综合:
-
select * from emp where salary=(select max(salary) from emp);
- 多表查询
- 要查询的列分布在多个表中,前提表之间已经建立了关联
- 防止列名称相同,在列名称的前边加上表名称。
- 示例:查询出所有员工的姓名及其部门名称
-
select emp.ename,dept.dname from emp,dept where emp.deptid=dept.did;
- 内连接
-
select ename,dname from emp inner join dept on deptid=did;
- 和之前(1)的查询结果是一样的
-
- 左外连接
-
select ename,dname from emp left outer join dept on deptid=did;
- 显示主表中所有的记录
-
- 右外连接
-
select ename,dname from emp right outer join dept on deptid=did;
- 显示副表中所有的记录
-
- 全连接:full join … on
- mysql不支持全连接
- 解决方法:将左外连接和右外连接进行联合,合并相同记录。
-
(select ename,dname from emp left outer join dept on deptid=did) union (select ename,dname from emp right outer join dept on deptid=did);
- 要查询的列分布在多个表中,前提表之间已经建立了关联