/*
case 变量语句:搭配select语句,case后的变量是根据筛选的条件case..when..then..else..end as 别名 from标名
*/
case 变量------等价switch
SELECT salary 原始工资,department_id,#select和case之间是有,隔开的
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;
不同于普通查询,select结尾要有“,”
#case后不见变量,则相当于if
SELECT salary,
CASE
WHEN salary > 12000 THEN 'A'
WHEN salary > 9000 THEN 'B'
WHEN salary >8000 THEN 'C'
ELSE 'D'
END AS 工资级别
FROM employees;
#显示系统时间(日期加时间)
SELECT NOW();
#查询员工工资提高20%之后的结果
SELECT
employee_id,
last_name,
salary,
salary * 1.2 newsalary
FROM
employees ;
#按员工姓名首字母排序
SELECT
last_name,
LENGTH(last_name) 姓名长度
FROM
employees
ORDER BY SUBSTR(last_name, 1) DESC ;
#连接操作
SELECT
CONCAT(
last_name,
' earns ',
salary,
' monthiy but wants ',
salary * 3
) AS 'dream salary'
FROM
employees
WHERE salary = 24000;
/*
分组函数
分类:sum 放一个参数,avg,max min count
分组函数都忽略null值
可以和distinct搭配实现去重
count 函数
和分组函数一同查询的字段有限制,要求是group by后的字段
*/
SELECT SUM(salary),AVG(salary) FROM employees;
SELECT SUM( DISTINCT salary),SUM(salary) FROM employees;
SELECT COUNT(1) FROM employees;
SELECT COUNT(*) FROM employees;
SELECT MAX(salary),MIN(salary),AVG(salary),SUM(salary) FROM employees;
SELECT COUNT(*)
FROM employees
WHERE department_id=90;
#查询员工表中最大入职时间和最小入职时间相差的天数
#datediff函数
SELECT DATEDIFF(MAX(hiredate),MIN(hiredate)) AS DAY FROM employees ;
/*
分组查询:select中的列名必须出现在group by后面
order by 放在最后
格式:
select 分组函数,列(要求出现在group by后面)
from 表
【where 筛选条件】
group by 分组的列表
having 条件
【order by 子句】
注意:查询列表比较特殊,要求是分组函数和group by后出现的字段
*/
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
/*
链接查询
笛卡尔积现象
如果为表起了别名,则不能用原名
*/
/*
等值链接
自链接:将一个表看做两个表
*/
#查询员工名称和其上级
SELECT e.`employee_id`,e.`last_name`,m.`employee_id`,m.`last_name`
FROM employees e,employees m
WHERE e.`manager_id`=m.`employee_id`;
/*
sql99语法:
select 查询列表
from 表1 别名 【连接类型】
join 表2 别名
on 链接条件
【where 筛选条件】
【group by 分组】
【having 筛选条件】
【order by 排序列表】
分类: 内连接:inner
外连接:
··左外链接:left 【outer】
··右外链接:right【outer】
··全外链接:full 【outer】
交叉链接:cross
内连接查询
select 查询列表
from 表1 别名
inner join 表2 别名
on 链接条件
*/
SELECT
last_name,
department_name
FROM
employees e
INNER JOIN departments d
ON e.`department_id` = d.`department_id` ;