mysql的单行函数
-- 1. 日期函数
SELECT NOW();
-- 2. 字符函数
SELECT LOWER('HelloWorld'), UPPER('HelloWorld');
SELECT LOWER(last_name), UPPER(last_name)
FROM employees;
/*CONCAT('Hello', 'World')
SUBSTR('HelloWorld',1,5)
LENGTH('HelloWorld')
INSTR('HelloWorld', 'W')
LPAD(salary,10,'*')
RPAD(salary, 10, '*')
TRIM('H' FROM 'HelloWorld')
REPLACE('abcd','b','m')*/
SELECT REPLACE('abcdabababab','b','m');
SELECT TRIM(' ' FROM ' HelloWorldHHH ');
SELECT LPAD(salary,10,' '), RPAD(salary, 10, ' ')
FROM employees;
SELECT INSTR('HelloWorld', 'p');
SELECT LENGTH('HelloWorld');
-- SQL中索引值从 1 开始。从第几个索引位置开始,截取几个
SELECT SUBSTR('HelloWorld',2,5);
SELECT CONCAT('Hello', 'World');
-- 3. 数值函数
-- 四舍五入,保留小数点后xx位
SELECT ROUND(123.456, 2), ROUND(123.556, 0), ROUND(153.456, -2);
-- 截取,保留小数点后xx位
SELECT TRUNCATE(123.456, 2), TRUNCATE(123.556, 0), TRUNCATE(153.456, -2);
SELECT MOD(1500, 8);
SELECT MOD(salary, 3)
FROM employees;
-- 4. 条件表达式
/*练习:查询部门号为 10, 20, 30 的员工信息, 若部门号为 10,
则打印其工资的 1.1 倍, 20 号部门, 则打印其工资的 1.2 倍,
30 号部门打印其工资的 1.3 倍数*/
SELECT last_name, salary, department_id, CASE department_id WHEN 10 THEN salary * 1.1
WHEN 20 THEN salary * 1.2
WHEN 30 THEN salary * 1.3
END "new_salary"
FROM employees
WHERE department_id IN (10, 20, 30);
/*练习:查询所有的员工信息, 若部门号为 10,
则打印其工资的 1.1 倍, 20 号部门, 则打印其工资的 1.2 倍,
30 号部门打印其工资的 1.3 倍数,其他打印工资的 1.4 倍*/
SELECT last_name, salary, department_id, CASE department_id WHEN 10 THEN salary * 1.1
WHEN 20 THEN salary * 1.2
WHEN 30 THEN salary * 1.3
ELSE salary * 1.4
END "new_salary"
FROM employees;
#1.显示系统时间(注:日期+时间)
SELECT NOW();
#2.查询工号,姓名,工资,以及工资提高百分之20%后的结果(new salary)
SELECT employee_id, last_name, salary, salary * 1.2 AS "new salary"
FROM employees;
#3.将员工的姓名按首字母排序,并写出姓名的长度(length)
SELECT last_name, LENGTH(last_name)
FROM employees
ORDER BY last_name;
#4.做一个查询,产生下面的结果
#<last_name> earns <salary> monthly but wants <salary*3>
SELECT CONCAT(last_name, ' earns ', ROUND(salary), ' monthly but wants ', ROUND(salary * 3)) "Dream Salary"
FROM employees;
5.使用CASE-WHEN,按照下面的条件:
job grade
AD_PRES A
ST_MAN B
IT_PROG C
SA_REP D
ST_CLERK E
产生下面的结果
Last_name Job_id Grade
king AD_PRES A
SELECT last_name "Last_name", job_id "Job_id", CASE job_id WHEN 'AD_PRES' THEN 'A'
WHEN 'ST_MAN' THEN 'B'
WHEN 'IT_PROG' THEN 'C'
WHEN 'SA_REP' THEN 'D'
WHEN 'ST_CLERK' THEN 'E'
ELSE 'F'
END "Grade"
FROM employees;
mysql的分组函数
#分组函数 MAX() MIN() AVG() COUNT() SUM()
SELECT MAX(salary), MIN(salary), AVG(salary), COUNT(salary), SUM(salary)
FROM employees;
SELECT MAX(last_name), MIN(last_name), MAX(LENGTH(last_name))
FROM employees;
SELECT COUNT(employee_id)
FROM employees;
-- 组函数不计算空值
SELECT COUNT(commission_pct)
FROM employees;
SELECT COUNT(*)
FROM employees;
SELECT AVG(commission_pct), SUM(commission_pct) / COUNT(commission_pct)
FROM employees;
-- GROUP BY 分组(重点、难点)
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
-- 出现在 SELECT 子句中的非分组函数,一定出现在 GROUP BY 子句后
SELECT employee_id, department_id, AVG(salary)
FROM employees
GROUP BY department_id, employee_id; -- 多列分组
-- 求出各个部门中每个工种(job_id)的平均工资是多少
SELECT department_id, job_id, AVG(salary)
FROM employees
GROUP BY department_id, job_id;
-- WHERE 不能过滤组函数,若过滤组函数需要使用 HAVING
SELECT department_id, AVG(salary) "avg_sal"
FROM employees
-- where avg(salary) >= 8000
GROUP BY department_id
HAVING avg_sal >= 8000;
-- MYSQL 中组函数不能嵌套,但是 Oracle 中可以
SELECT department_id, MAX(AVG(salary))
FROM employees
GROUP BY department_id;
SELECT department_id, avg_sal
FROM (
SELECT department_id, AVG(salary) avg_sal
FROM employees
GROUP BY department_id
) emp
#1.where子句可否使用组函数进行过滤?
#2.查询公司员工工资的最大值,最小值,平均值,总和
SELECT MAX(salary), MIN(salary), AVG(salary), SUM(salary)
FROM employees;
#3.查询各job_id的员工工资的最大值,最小值,平均值,总和
SELECT job_id, MAX(salary), MIN(salary), AVG(salary), SUM(salary)
FROM employees
GROUP BY job_id;
#4.选择具有各个job_id的员工人数
SELECT job_id, COUNT(*)
FROM employees
GROUP BY job_id;
#5.查询员工最高工资和最低工资的差距(DIFFERENCE)
SELECT MAX(salary) - MIN(salary) "DIFFERENCE"
FROM employees;
#6.查询各个管理者手下员工的最低工资,其中最低工资不能低于6000,没有管理者的员工不计算在内
SELECT manager_id, MIN(salary) "min_sal"
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING min_sal >= 6000;
#7.查询所有部门的名字,location_id,员工数量和工资平均值
SELECT d.department_name, d.location_id, COUNT(*), AVG(salary)
FROM employees e
JOIN departments d
ON d.`department_id` = e.`department_id`
GROUP BY d.`department_name`, d.`location_id`;
mysql中的子查询
#子查询
-- 谁的工资比 Abel 高?
SELECT salary
FROM employees
WHERE last_name = 'Abel';
SELECT *
FROM employees
WHERE salary > 11000.00;
-- 主查询(外查询)
SELECT *
FROM employees
WHERE salary > (
-- 子查询(内查询)
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);
-- 题目:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id 和工资
SELECT e.last_name, job_id, salary
FROM employees e
WHERE job_id = (
SELECT job_id
FROM employees
WHERE employee_id = 141
) AND salary > (
SELECT salary
FROM employees
WHERE employee_id = 143
);
-- 题目:返回公司工资最少的员工的last_name,job_id和salary
SELECT last_name, job_id, salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);
-- 题目:查询最低工资大于50号部门最低工资的部门id和其最低工资
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) > (
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
);
-- 非法子查询
SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);
-- 空值问题
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = 'Haas');
SELECT employee_id, last_name
FROM employees
WHERE salary IN
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);
-- 题目:返回其它部门中比job_id为‘IT_PROG’部门 任一 工资低的员工的员工号、姓名、job_id 以及salary
-- any :若列表中有一个条件满足,则结果为满足条件
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ANY(
SELECT salary
FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id <> 'IT_PROG';
-- 题目:返回其它部门中比job_id为‘IT_PROG’部门 所有 工资都低的员工的员工号、姓名、job_id 以及salary
-- all : 若列表中所有条件都满足,则结果为满足条件
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ALL(
SELECT salary
FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id <> 'IT_PROG';
-- 42. 查询工资最低的员工信息: last_name, salary
SELECT last_name, salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);
-- 43. 查询平均工资最低的部门信息
SELECT *
FROM departments
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (
SELECT MIN(avg_sal)
FROM (
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY department_id
) e
)
)
-- 查询平均工资最低的部门信息和该部门的平均工资
SELECT d.*, (SELECT AVG(salary) FROM employees WHERE department_id = d.department_id)
FROM departments d
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (
SELECT MIN(avg_sal)
FROM (
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY department_id
) e
)
)
-- 44. 查询平均工资最高的 job 信息
SELECT *
FROM jobs
WHERE job_id = (
SELECT job_id
FROM employees
GROUP BY job_id
HAVING AVG(salary) = (
SELECT MAX(avg_sal)
FROM (
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY job_id
) e
)
)
-- 45. 查询平均工资高于公司平均工资的部门有哪些?
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (
SELECT AVG(salary)
FROM employees
);
-- 46. 查询出公司中所有 manager 的详细信息.
SELECT *
FROM employees
WHERE employee_id IN (
SELECT DISTINCT manager_id
FROM employees
)
-- 47. 各个部门中 最高工资中最低的那个部门的 详细信息
-- ①各个部门中最高工资是多少
SELECT MAX(salary) max_sal
FROM employees
GROUP BY department_id
-- ②最高工资最低的那个部门是什么
SELECT MIN(max_sal)
FROM (
SELECT MAX(salary) max_sal
FROM employees
GROUP BY department_id
) e
SELECT department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary) = (
SELECT MIN(max_sal)
FROM (
SELECT MAX(salary) max_sal
FROM employees
GROUP BY department_id
) e
)
-- ③上述部门中的最低工资是多少
SELECT MIN(salary)
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary) = (
SELECT MIN(max_sal)
FROM (
SELECT MAX(salary) max_sal
FROM employees
GROUP BY department_id
) e
)
)
SELECT * FROM employees WHERE department_id = 10;
-- 48. 查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
SELECT last_name, department_id, email, salary
FROM employees
WHERE employee_id IN (
SELECT manager_id
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (
SELECT MAX(avg_sal)
FROM (
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY department_id
) e
)
)
)
-- 1.查询和Zlotkey相同部门的员工姓名
SELECT last_name
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
WHERE last_name = 'Zlotkey'
);
-- 2.查询工资比公司平均工资高的员工的员工号,姓名和工资。
SELECT employee_id, last_name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
-- 3.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
SELECT employee_id, last_name, salary
FROM employees e1
WHERE salary > (
SELECT AVG(salary)
FROM employees e2
WHERE e2.`department_id` = e1.`department_id` -- 相关子查询
);
SELECT employee_id, last_name, salary
FROM employees e1, (
SELECT AVG(salary) avg_sal, department_id
FROM employees
GROUP BY department_id
) e2
WHERE e1.`department_id` = e2.department_id
AND e1.salary > e2.avg_sal;
-- 4.查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
SELECT employee_id, last_name
FROM employees
WHERE department_id = ANY (
SELECT department_id
FROM employees
WHERE last_name LIKE '%u%'
);
-- 5.查询在部门的location_id为1700的部门工作的员工的员工号
SELECT employee_id
FROM employees e
WHERE e.`department_id` IN (
SELECT department_id
FROM departments
WHERE location_id = 1700
);
-- 6.查询管理者是King的员工姓名和工资
SELECT last_name, salary
FROM employees
WHERE manager_id IN (
SELECT employee_id
FROM employees
WHERE last_name = 'King'
);
mysql中表的创建与管理
#创建和管理表
-- DDL :数据定义语言
CREATE DATABASE atguigu;
USE atguigu;
-- 1. 新建表
-- 方式一:
CREATE TABLE emp(
emp_id INT(10),
emp_name VARCHAR(30),
hire_date DATE,
salary DOUBLE(10, 2)
);
CREATE TABLE emp1(
emp_id INT(10) AUTO_INCREMENT,
emp_name VARCHAR(30),
hire_date DATE,
salary DOUBLE(10, 2),
PRIMARY KEY(emp_id)
);
SELECT * FROM emp1;
DESC emp1;
-- 方式二:基于现有表创建新表(相当于表的复制)
CREATE TABLE emp2
AS
SELECT *
FROM employees;
SELECT * FROM emp2;
CREATE TABLE emp3
AS
SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = 90;
SELECT * FROM emp3;
-- 基于现有表创建新表,但不导入数据
CREATE TABLE emp4
AS
SELECT *
FROM employees
WHERE 1 = 2;
CREATE TABLE emp5
LIKE employees;
SELECT * FROM emp5;
-- 2. 修改表 ALTER TABLE
SELECT * FROM emp3;
-- ①添加列
ALTER TABLE emp3
ADD age INT(10);
ALTER TABLE emp3
ADD gender VARCHAR(10) DEFAULT '0';
-- ②修改列
DESC emp3;
ALTER TABLE emp3
MODIFY gender VARCHAR(5);
-- ③重命名列
ALTER TABLE emp3
CHANGE age email VARCHAR(5);
-- ④删除列
ALTER TABLE emp3
DROP COLUMN gender;
-- 3. 重命名表
ALTER TABLE employees3
RENAME TO emp3;
SELECT * FROM emp3;
-- 4. 清空表
TRUNCATE TABLE emp3;
-- DML : 数据操纵语言
DELETE FROM emp3;
-- 注意:DDL 是不可回滚的,因此 DDL 默认自动 commit;
-- 5. 删除表
DROP TABLE emp3;
-- DCL : 数据控制语言
COMMIT; -- 提交。
ROLLBACK; -- 回滚,默认回滚到上一次 COMMIT;
SET autocommit = FALSE;