-- 1.查询特定的列
-- 实例:查询出所有员工的编号和姓名
select eid,ename from emp;
-- 练习:
select ename,sex,birthday,salary from emp;
--2.查询所有的列
select * from emp;
select eid,ename,sex,birthday,salary,deptid from emp;
-- 3.给列起别名名:使用as设置别名,as关键字可以省略
-- 实例:查询出所有员工的编号,姓名,使用一个字母作别名
select eid as a,ename as b from emp;
-- 练习
select ename as 姓名,sex as 性别,salary as 工资 from emp;
-- 简写:删除as
select ename 姓名,sex 性别,salary 工资 from emp;
--4. 显示不同的记录
-- 示例:查询出员工都分布在那些部门
select distinct deptid from emp;
-- 练习:查询出都有那些性别的员工
select distinct sex from emp;
--5.查询时执行计算
--示例: 查询出所有员工的姓名及其年薪
select ename,salary*12 as 年薪 from emp;
-- 练习:
select ename 姓名,(salary+2000)*12+30000 年薪 from emp;
-- 6.查询的结果排序
-- 默认排序规则是升序,如果按照字符串排序,是按照字符编码排列
-- asc->ascendant 升序的 默认就是升序排列
-- 示例:查询出所有的部门,结果按照部门编号升序排列
select * from dept order by did asc;
-- 示例:查询出所有的部门,结果按照部门编号升序排列
-- desc->descendant 降序的
-- desc->describe 描述
select * from dept order by did desc;
-- 练习:查询出所有的员工,结果按照工资的降序排列
select * from emp order by salary desc;
-- 练习 查询出所有的员工结果按照年龄从大到小排列
select * from emp order by birthday asc;
-- 练习: 查询出所有的员工,结果按照姓名的升序排列
select * from emp order by ename; -- 升序可以省略asc
-- 示例:查询出所有的员工,结果按照工资降序排列,如果工资相同按照姓名排列
select * from emp order by salary desc,ename;
-- 练习:查询出所有的员工,要求结果按照性别的升序排列,如果性别相同按照年龄从大到小排列
select * from emp order by sex,birthday;
-- 7.条件查询
-- 示例:查询出编号为5的员工
select * from emp where eid=5;
-- 练习:查询姓名为King的员工
select * from emp where ename='King';
-- 练习:
select * from emp where sex=0;
select * from emp where deptid=20;
select * from emp where salary>=8000 order by salary asc;
-- 比较运算符:> < >= <= = !=(不等于)
-- 练习:查询出不在20号部门的员工
select * from emp where deptid!=20; -- 没有找到为null的
-- 练习:查询出没有明确出部门的员工
select * from emp where deptid is null;
-- 练习:查询出有明确部门的员工
select * from emp where deptid is not null;
-- is null 查找值为null的
-- is not null 查找值不为null的
-- 练习 查询出工资在8000~10000之间的员工有哪些
select * from emp where salary>=8000 && salary<=10000;
-- 练习:8000以下男员工
select * from emp where sex=1 && salary<8000;
select * from emp where sex=1 and salary<8000; -- 另一种写法
-- 练习: 查询出10000以上或者8000以下的员工有哪些
select * from emp where salary>10000 || salary<8000;
-- 练习:查询出20号部门或者30号部门的员工有哪些
select * from emp where deptid=20 || deptid=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 not in(20,30);
-- 练习
select * from emp where salary>=6000 && salary<=10000 && sex=1 order by salary desc;
-- 8.模糊条件查询
-- 示例:查询出姓名中含有字母e的员工
-- % 匹配符号,匹配任意个字符 >=0
select * from emp where ename like '%e%';
-- 练习:查询出姓名中以e结尾的员工
select * from emp where ename like '%e';
-- _ 匹配符号,匹配任意一个字符
select * from emp where ename like '%e_';
-- 9.分页查询
/*
因为查询的结果有太多,一次显示不完
需要有两个已知的条件:当前页码,每页的数据量
每页开始查询的值=(当前的页码-1)*每页的数据量
语法:
select * from emp limit 开始查询的值,每页的数据量;
*/
-- 练习 :假设每页显示5条数据,查询前4页
-- 第一页
select * from emp limit 0,5;
-- 第二页
select * from emp limit 5,5;
-- 第三页
select * from emp limit 10,5;
-- 第四页
select * from emp limit 15,5;
-- 注意事项 limit后不能写运算,必须是数字,不能加引号。
-- 1.聚合查询,需要一组聚合函数
-- count() sum() avg() max() min()
-- 数量 总和 平均 最大 最小
-- 示例: 查询出所有员工的数量
select count(*) from emp;
select count(eid) from emp; -- 结果16
select count(deptid) from emp; -- 结果15 null 统计不了,推荐使用主键列 主键列不允许为空
select distinct deptid from emp;
-- 统计有几个部门
select count(distinct deptid) from emp;
-- 查询出所有女员工的工资总和
select sum(salary) from emp where sex=0;
-- 练习:查询出20号部门的平均工资
select avg(salary) from emp where deptid=20;
-- 练习: 查询出10号部门的最高工资
select max(salary) from emp where deptid=10;
-- 练习:查询出年龄最大的女员工
select min(birthday) from emp where sex=0;
-- 分组查询
-- 通常查询聚合函数和分组条件
-- 示例:查询出男女员工的数量,工资总和分别是多少
select sex,count(eid),sum(salary) from emp group by sex;
-- 练习:查询出各部门的平均工资,最高工资,最低工资
select deptid,avg(salary),max(salary),min(salary),sum(salary) from emp group by deptid;
-- 函数:year() 获取日期中的年份部分
select year('2022-9-1'); -- 2022
-- 示例:查询出1990年出生的员工
select * from emp where year(birthday)=1990;
--练习:查询出每个员工的姓名及出生年份
select ename,year(birthday) from emp;
-- 2.子查询:多个查询命令的组合,把一个查询结果作为另一个的查询条件
-- 示例:查询出年龄最大的女员工是谁
select min(birthday) from emp where sex=0;
select * from emp where birthday=(select min(birthday) from emp where sex=0);
-- 练习:查询高于平均工资的员工有哪些
select avg(salary) from emp;
select * from emp where salary>(select avg(salary) from emp);
-- 练习:查询和xin同部门的员工
select deptid from emp where ename='xin';
select * from emp where deptid=(select deptid from emp where ename='xin') && ename !='xin';
-- 练习:查询和tom同一天出生的员工
select year(birthday) from emp where ename='tom';
select * from emp where year(birthday)=(select year(birthday) from emp where ename='tom') && ename!='tom';
-- 3.多表查询:要查询的列分布在多个表中
-- 前提:表之间已经建立了关联
-- 示例:查询出所有员工的姓名及其部门名称
select ename,dname from emp,dept where deptid=did;
select emp.ename,dept.dname,emp.salary from emp,dept where emp.deptid=dept.did;
-- 内连接
select ename,dname from emp inner join dept on deptid=did;*