java学习笔记——mysql的单行函数、分组函数、子查询、表的创建与管理

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;

猜你喜欢

转载自blog.csdn.net/qq_25106373/article/details/80905316
今日推荐