题目一:如果工资大于20000,就显示A,如果工资大于15000,显示级别为B,工资大于10000,就显示C,否则显示D
使用Case函数来解决:
Case
When 条件1 then 结果1
When 条件2 then 结果2
…
Else 结果n
END
Select Salary,
Case Salary>20000 then ‘A’
Case Salary>15000 then ‘B’
Case Salary>10000 then ‘C’
Else ‘D’ //sql中的常量都需要加上单引号。
from employees;
Now():显示时间,既有日期,又有时间。这里的新列中含有关键字,所以我们的别名需要含有双引号。
Select salary ,employee_id,last_name,salary*1.2 as “new Salary”
from employees;
将员工的姓名按首字母进行排序,而且写出姓名的长度:
select leng(last_name) form employee order by substr(last_name,1,1),
substr(last_name,2,1)
ASC
;
Select concat(last_name ,’ earn ’ ,salary,’ but wants ', salary*3 ) "Dream Salary " From employees;
Case 函数有两种,一种是等值判断,一种多重if.
Case job_id
when AP THEN ‘A’
when IT THEN ‘B’
end
MYSQL中的函数分为两大类,单列函数,对单个列的值进行操作,将每一列的每一行记录都当做函数的参数。
第二类是分组函数,也叫做聚合函数,这个函数是将多个记录作为参数。
1.统计结果集
count():计算非空的()的个数。
count的补充:
count():用于查询总记录数,只有有值就有会加一。(针对结果集的)
count(常量):
count(1)相当于在我们的表中新增了一个常量列,这个列中的值都是1.所以和count() 的效果相同。
搭配distinct进行去重处理:
查询有员工的部门个数:
在计算数据之前去重。
select count( distinct department_id) from employees ;
分组查询
将原来的表在逻辑上拆分成几张虚拟表,在使用组函数进行计算。为了我们查询的函数有意义,我们和分组函数联合查询的字段就是我们用来分组的字段。
案列1:查询每个工种员工的平均工资:
Select avg(salary) from employees group by job_id;
案列2:查询每个领导的手下的字段:
Select last_name ,manage_id from employees where manage_id is not null group by manage_id;
案列3:邮箱中包含a字符的每个部门的最高工资。
Select max(salary) department_id from employees where email like %a%
group by department_id ;
案列4 :查询那个部门的员工数量大于5
Select depart_id from employees group by department_id having sum(employee_id) > 5;
或者:
select depart_id from (select count(employ_id) 员工数量, department_id from employees ) where 员工数量大于5.
where 对于当前表来说不能使用分组函数!!!。
分组前查询和分组后查询:
分组前查询前:where只能根据原始的列筛选,
而having关键字可以根据我们分组后构建的新表进行筛选。
案列2:每个工种有奖金的员工的最高工资>12000的工种编号和最高工资:
select job_id, max(salary) from employees where lv is not null group by job_id having max(salary) >12000
案列3:领导编号>102的每个领导手下的最低工资大于5000的领导编号和最低工资。
select manage_id ,min(salary) from employees where manage_id>102 group by mange_id having min(salary)>5000.
这里可以where,也可以使用having.来对领导编号进行处理,但是工资不行,工资需要使用分组函数。这里推荐先使用where,因为where的执行效率更高。
案列4:查询有奖金的员工的最高工资>6000的工种编号和最高工资,按最高工资升序。
select job_id ,max(salary) from employee where lv is not null group by department_id having max(salary)>6000
order by max(salary) ASC;
案例5:按多个字段分组:查询每个工种每个部门的最低工资。
select job_id ,department_id,min(salary) from employees group by (department_id,job_id)
sql语句的执行顺序:
1.from子句
2.where子句
3.group by 子句
4.having 子句
5.select 子句
6. order by 子句
SQL 92语法:涉及多张表的操作
1.等值连接: 为了解决多表中字段重名的问题
案例:查询员工名和部门名:
select a.last_name,b.name from employees a,department b where a.department_id=b.id;
2.查询部门编号大于100的部门名和所在的城市名称
select d.name,c.name from department d, city c where d.id=c.id and d.编号>100;
当我们在form子表的时候,实际上就构建一个大的笛卡尔积。
3.查询有奖金的员工名和部门名:
select last_name,department_id from employees ,deparment where employees.department_id=department.id;
and e.lv is not null;
4.查询每个城市中的部门个数
select count(department_id) from d
where d.localid=l.id
group by l.city;
2.非等值连接:
select salary ,grade_level form job_grades, salary where job.salary> min and job.salary <max ;
3.自连接:只涉及到自己这一张表
查询员工姓名和员工的领导姓名:
select e1.last_name,e2.last_name from e e1 ,e e2 where e1.manage_id =e2.id;
sql 99
一.内连接:
1).等值连接
查询员工名和部门名:
select e.name d.name from e join d on d.id =e.id
查询部门编号>100的部门名和所在的城市名
select d.name, c.city from d join c where e.id>100;
查询每个城市的部门个数
select count(*) from e jon l on e.cityid=l.id group l.city;
查询部门中员工个数大于10,并按照部名进行降序:
select d.name from e join d on e.did=d.id group d.name having count(*)>10
order by d.name;
2).非等值连接
3).自然连接
二.外连接:
1.查询编号大于三的男朋友信息,如果没有,用null填充。有就详细列出
select b.name from girl join boy left on g.boyid=b.id where id >3 ;
2.查询那个城市没有部门
select city from location left join department on department.cityid = location.id
where department.cityid is null;
3.查询部门名为SAL或IT的员工信息:
select e.* from e left join department on e.department_id=d.id where d.name in('SAL','IT');