-
简单查询
a) 模糊条件查询
示例:查询员工姓名中含有字母e的员工有哪些
SELECT * FROM emp WHERE ename LIKE ’%e%’ ;
练习:查询姓名中以e结尾的员工有哪些
SELECT * FROM emp WHERE ename LIKE ‘%e’;
练习:查询姓名中倒数第二个字符为e的员工有哪些
SELECT * FROM emp WHERE ename LIKE ‘%e_’;
% 匹配任意0个或者是多个字符,和like才有匹配功能 >=0
_匹配任意一个字符 =1
以上两个匹配的符合只能结合LIKE使用
b) 分页查询
查询的结果集有太多数据,一次显示不完可以做成分页显示
需要有两个已知的条件:当前的页码和每页的数据量
开始查询的值 = (当前的页码-1)* 每页的数据量
语法:
SELECT * FROM emp LIMIT 开始查询的值,每页的数据量;
假设每页显示5条数据
第一页:SELECT * FROM emp LIMIT 0,5;
第二页:SELECT * FROM emp LIMIT 5,5;
第三页:SELECT * FROM emp LIMIT 10,5;
分页查询中的开始查询的值和每页的数据量必须是数值型,不能添加引号。 -
复杂查询
(1)聚合查询和分组查询
示例:查询出所有员工的数量
SELECT count(eid) FROM emp; #推荐使用主键列
练习:通过部门编号这一列查询员工的数量
SELECT count(deptld) FROM emp;
练习通过姓名查询所有男员工的数量
SELECT count(ename) FROM emp WHERE sex=1;
聚合函数,函数是一个功能体,可以接收若干个数据,返回处理的结果-饺子机
count() /sum()/ avg()/ max()/ min()
数量 总和 平均 最大 最小
练习:查询出所有员工工资的总和
SELECT sum(salary) FROM emp;
练习:查询出所有员工的平均工资
SELECT avg(salary) FROM emp;
练习:查询出男员工的最低工资
SELECT min(salary) FROM emp WHERE sex = 1;
练习查询出年龄最小的员工的生日
SELECT max(birthday) FROM emp;
分组查询中只能查询聚合函数和分组条件
示例:查询出每个部门员工的最高工资,最低工资,平均工资
SELECT max(salary),min(salary),avg(salary),deptld FROM emp GROUP BY deptld;
练习:查询出男女员工的数量,工资总和,平均工资
SELECT count(eid),sum(salary),avg(salary),sex FROM emp GROUP BY sex;
(2)子查询
示例:查询研发部的员工有哪些
步骤1:查询出研发部的部门编号是多少
SELECT did FROM dept WHERE dname=’研发部’;
步骤2:查询出部门编号为10的员工有哪些
SELECT * FROM emp WHERE deptld=10;
综合:
SELECT * FROM emp WHERE deptld=( SELECT did FROM dept WHERE dname=’研发部’);
练习:查询出比tom工资高的员工有哪些
SELECT salary FROM emp WHERE ename=’tom’;
SELECT * FROM emp WHERE salary>6000;
综合:
SELECT * FROM emp WHERE salary>( SELECT salary FROM emp WHERE ename=’tom’;);
练习:查询出和tom同一年出生的员工有哪些
- 查询出tom出生的年份
SELECT year(birthday) FROM emp WHERE ename=’tom’;
2.查询出生年份是1990年的
SELECT * FROM emp WHERE year(birthday) = 1990;
综合:
SELECT * FROM emp WHERE year(birthday)=( SELECT year(birthday) FROM emp WHERE ename=’tom’)AND ename!=’tom’;
year() 获取日期中的年份
示例:查询所有员工出生的年份
SELECT year(birthday) FROM emp;
(3)多表查询
示例:查询所有的员工姓名及其部门名称
SELECT ename,dname FROM emp,dept;
产生笛卡尔积,需要添加查询的条件才可以避免
SELECT ename,dname FROM emp,dept WHERE deptld=did;
存在的问题:无法查询出没有部门的员工,也无法查询出没有员工的部门。
新增的多表查询语法
(1) 内连接——inner join,与之前没有变化,是一种新增的语法
SELECT ename,dname FROM emp inner join dept on deptld = did;
(2) 左外连接
先写哪一个表,哪一个就是左,显示里边所有的记录,即使没有对应的
SELECT ename,dname FROM emp left outer join dept on deptld = did;
(3) 右外连接 right outer join
后写哪一个表,哪一个就是右,显示里边所有的记录,即使没有对应的
SELECT ename,dname FROM emp right outer join dept on deptld = did;
左外和右外连接中的outer关键字可以省略
(4) 全连接
full join
mysql不支持这种连接
左外和右外的结果组合起来
union (联合) 合并相同的记录
union all 不合并相同的记录
(SELECT ename,dname FROM emp left outer join dept on deptld = did)
union
(SELECT ename,dname FROM emp right outer join dept on deptld = did);
项目中的日期时间
时间戳:距离计算机元年(1970-1-1)的毫秒数
1秒=1000毫秒
2020-1-1和1970年相差50
50*365*24*60*60*1000 = 1576800000000
使用bigint才可以存下的
性别 1/0 男/女 man/woman 男孩/女孩