首先这是一张表,有员工编号,姓名,薪资,入职时间,佣金,部门编号等。我们对这个表将进行一些查询,用到from,select,distinct,where,between,order,limit,group by,having等子句。
一、查询语句由子句组成,子句执行有先后顺序,而与子句出现的位置无关。
二、一些常用子句
1.from子句
在查询语句中,from子句是最先被执行的。用于将数据表从硬盘拷到内存中。from后面只跟数据表。数据表可以重命名。
select * from Emp as e;//将数据库Emp重命名为e,这个重命名,只是暂时的,不会永久更改表的名字,而且as可以省略。
1.1select ENAME as 姓名,HIVEDATE 入职时间 from Emp;//将字段名重命名为中文
2.select子句
可以理解为输出,并不是选择
2.1输出指定列
select Emp.ENAME from Emp;//简便写法:select ENAME from Emp;
select Emp.ENAME,Emp.SAL from Emp;
2.2去重,例如可以显示职业一共的种类
select distinct JOB from Emp;//如果后面跟多个字段,只有多个字段都相同才认为重复
3.where子句
用来对记录进行筛选,它的执行顺序在from之后,在select之前。
3.1比较符 >, >=, <, <=, =, != //这里提醒一下,没有==,只有=
select SAL from Emp where SAL>3000;//选择薪资大于3000的员工信息
3.2比较符的组合
select * from Emp where SAL<=3000 and SAL>=1500;//查询薪资中间区域
select * from Emp where SAL>=3000 or SAL<=1500;//查询薪资大于3000或者小于1500
3.3between
select * from Emp where SAL between 1500 and 3000;//薪资在1500-3000
3.4集合判断
select * from Emp where SAL in(1500,1600,3000,800);//选择薪资为1500,1600,3000,800
3.5NULL
NULL不能比较,只能用is null或者is not null
select * from Emp where COMM is NULL;
3.6模糊查询(通配符)
用like,通配符有两种,%和_,前者表示多个字符,后者只有一个字符。
select * from Emp where ENAME like ‘A%’;//查询名字中有A,后面有其他多个字符的员工信息
select * from Emp where like‘%00’;//模糊查询不仅可以查询字符型字段,还可以查整形数等类型
3.7正则表达式
select * from Emp where ENAME regexp ‘^s’;//查询名字以s开头的员工,^想象成蛇头,方便记忆
select * from Emp where ENAME regexp ‘s$’;//查询名字以s结尾的员工,$想象成蛇尾,方便记忆
4.order by子句,用来排序
select * from Emp order by SAL desc; // 降序
//两个字段进行排序
select * from Emp order by DEPNO, SAL;//在一个部门里面进行工资升序排序
5.limit限定
select *from Emp limit 5;select *from Emp limit 5,2;//在5行之后选择两个,排序后再选择
6.group by 子句
select * from Emp group by DEPNO;//每个部门显示第一个人,其他人在其后面,并没有丢弃数据。分组后,同组的数据被压缩到第一条记录里面。
select ENAME, count(JOB) from Emp group by DEPNO;//count是计数函数,计数的字段如果为NULL将不记。相同不影响。使用*可以避免这种情况,去除NULL的影响。
select JOB, count(*) from Emp group by DEPNO;
select JOB, count(*) 部门员工数量 from Emp group by DEPNO;
//除了count函数之外,还有sum avg min max
select DEPNO, sum(SAL)总金额 from Emp group by DEPNO;
select DEPNO, avg(SAL)总数 ,min(SAL) 最小值,max(SAL) 最大值 from Emp group by DEPNO;
7.having 子句
用来对分组之后的结果进行进一步的筛选,就像where一样。
select min(SAL) from Emp group by DEPNO;
//分组之后,进一步筛选,只能用having,这是与where的区别。
select min(SAL) from Emp group by DEPNO having min(SAL) <1000;
//where分组之前的数据,having分组之后的数据
select min(SAL) from Emp where HIREDATE > '1981-6-1' group by DEPNO having min(SAL)>1000;
三、练习题目
1、查询部门编号为20的所有员工信息。
select * from Emp where DEPNO=20;
2、查询1982年1月1日后入职的员工信息。
select * from Emp where HIREDATE>'1982-1-1';//时间需要加单引号
3、查询1981年入职的员工信息。 (用year函数)
select * from Emp where year(HIREDATE)=1981;
4、查询入职时间在2月的员工名字。(用mouth函数)
select Emp.ENAME from Emp wheremonth(HIREDATE)=2;
5、查询部门编号为10,30的员工信息。
select * from Emp where DEPNO!=20;
select * from Emp where DEPNO=10 or DEPNO=30;
6、查询薪水低于2000的员工信息。
select * from Emp where SAL<2000;
7、查询领取佣金的员工姓名和职位。
select Emp.ENAME,Emp.JOB from Emp where COMM >0;
8、查询不领取佣金的员工编号。
select Emp.EMPNO from Emp whereCOMM is null;//用is null 和 is not null 。不要出现= null。
9、查询所有办事员(CLERK)的名字。
select Emp.ENAME from Emp where JOB='CLERK';//字符串也需要单引号
10、查询所有归7839管的员工名字和职位。
select Emp.ENAME,Emp.JOB from Emp where MGR=7839;
11、查询佣金比工资高的员工的入职时间。
select HIREDATE from Emp where COMM > SAL;
12、查询年收入超过40000的员工名字和部门编号和年收入,列名改为’年收入’。
select ENAME,EMPNO,SAL*12 年收入 from Emp whereSAL*12>40000;
13、查询部门编号为10且职位是办事员的信息。
select *from Emp where DEPNO=10 having JOB='CLERK';
13、查询佣金第二高的员工信息。
select * from Emp order by COMM desc limit1,1;//limit 2,2;可以输出3,4名的员工信息。用limit比较简单,要比网上其他思路简单,而且好理解,好记忆。
14、按入职时间降序排序,入职时间相同的按工资升序排序。
select * from Emp order by HIREDATEdesc,SAL asc;
15、列出所有职位的类别。
select distinct JOB from Emp ;
16、查询mgr一列不为空的所有信息。
select * from Emp where MGR is not null;
17、列出所有的mgr编号。
select distinct MGR from Emp ;
18、查询名字中有LL的员工信息。
select * from Emp where ENAME regexp 'LL';
19、查询名字以N结尾的所有员工信息。
select * from Emp where ENAME regexp 'N$';
20、查询工资以3开头的员工信息。
select * from Emp where SAL regexp '^3';
21、查询编号中有9的所有员工信息。
select * from Emp where EMPNO regexp '9';
22、查询名称第二个字母是d的员工信息。
select * from Emp where ENAME like '_d%';
select * from Emp where ENAME like '_M%';