MySQL(九):MySQL语法-高级

亦凉 2024-03-17 19:04 100阅读 0赞

MySQL语法-高级

    • `LIMIT`
    • `LIKE`
    • `AS`
    • `CREATE UNIQUE INDEX`、`DROP INDEX`
    • `CREATE VIEW`、`DROP VIEW`
    • `GROUP BY`
    • `HAVING`
    • `MYSQL` - `JOIN`
      • `INNER JOIN`、`JOIN`
      • `LEFT JOIN`、`LEFT OUTER JOIN`
      • `RIGHT JOIN`、`RIGHT OUTER JOIN`
      • `LEFT JOIN … WHERE …`
      • `RIIGHT JOIN … WHERE …`
    • `TRUNCATE TABLE`
    • `INSERT INTO 表1 (列1, 列2) SELECT (列1, 列2) FROM 表2`
    • `UNION`、`UNION ALL`
    • 日期相关函数
      • `NOW()`、`CURDATE()`、`CURTIME()`、`DATE()`、`DATE_FORMAT()`、`DATEDIFF()`
      • `EXTRACT()`、`DATE_ADD()`、`DATE_SUB()`

LIMIT

用于指定要返回的记录数量

示例:

  1. select *
  2. from employees limit 3;
  3. +--------+------------+------------+-----------+--------+------------+
  4. | emp_no | birth_date | first_name | last_name | gender | hire_date |
  5. +--------+------------+------------+-----------+--------+------------+
  6. | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 |
  7. | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 |
  8. | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 |
  9. +--------+------------+------------+-----------+--------+------------+
  10. 3 rows in set (0.00 sec)

LIKE

使用LIKE运算符来搜索列中的指定模式

  • (百分号表示零个,一个或多个字符)
  • _(下划线表示单个字符)

示例:

  1. select *
  2. from employees
  3. where last_name like '%ce_l_'
  4. AND first_name like 'G_o%g_';
  5. +--------+------------+------------+-----------+--------+------------+
  6. | emp_no | birth_date | first_name | last_name | gender | hire_date |
  7. +--------+------------+------------+-----------+--------+------------+
  8. | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 |
  9. | 55649 | 1956-01-23 | Georgi | Facello | M | 1988-05-04 |
  10. +--------+------------+------------+-----------+--------+------------+
  11. 2 rows in set (0.10 sec)

AS

别名

示例:

  1. select emp.first_name as name
  2. from employees as emp limit 3;
  3. +---------+
  4. | name |
  5. +---------+
  6. | Georgi |
  7. | Bezalel |
  8. | Parto |
  9. +---------+
  10. 3 rows in set (0.01 sec)

CREATE UNIQUE INDEXDROP INDEX

创建唯一索引

示例:

  1. -- 设置id为唯一索引,名称为id_name
  2. create unique index id_name on order_table (id);
  3. -- 删除唯一索引
  4. drop index id_name on order_table;

CREATE VIEWDROP VIEW

创建新视图

视图(View)是一种虚拟存在的表,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。视图中的数据是依赖于真实表中的数据的。一旦真实表中的数据发生改变,显示在视图中的数据也会发生改变

示例:

  1. -- 创建视图
  2. create view order_view as
  3. select date_01
  4. from order_table
  5. where id = 3;
  6. -- 删除视图
  7. drop view order_view;
  8. -- 查询视图数据
  9. select *
  10. from order_view;
  11. +------------+
  12. | date_01 |
  13. +------------+
  14. | 2023-07-03 |
  15. +------------+
  16. 1 row in set (0.00 sec)

GROUP BY

通过…分组

示例:

  1. -- 通过员工编号分组查询员工编号、薪资数、薪资和、薪资平均值、薪资最大值、薪资最小值
  2. select emp_no, count(salary), sum(salary), avg(salary), max(salary), min(salary)
  3. from salaries
  4. group by emp_no;
  5. +--------+---------------+-------------+-------------+-------------+-------------+
  6. | emp_no | count(salary) | sum(salary) | avg(salary) | max(salary) | min(salary) |
  7. +--------+---------------+-------------+-------------+-------------+-------------+
  8. | 10001 | 17 | 1281612 | 75388.9412 | 88958 | 60117 |
  9. | 10002 | 6 | 413127 | 68854.5000 | 72527 | 65828 |
  10. | 10003 | 7 | 301212 | 43030.2857 | 43699 | 40006 |
  11. | 10004 | 16 | 904196 | 56512.2500 | 74057 | 40054 |
  12. | 10005 | 13 | 1134585 | 87275.7692 | 94692 | 78228 |
  13. +--------+---------------+-------------+-------------+-------------+-------------+
  14. 5 rows in set (0.00 sec)

HAVING

筛选分组后的各组数据

示例:

  1. -- 按员工编号分组查询薪资总和大于2300000的数据
  2. select emp_no, sum(salary)
  3. from salaries
  4. group by emp_no
  5. having sum(salary) > 2300000;
  6. +--------+-------------+
  7. | emp_no | sum(salary) |
  8. +--------+-------------+
  9. | 43624 | 2492873 |
  10. | 47978 | 2374024 |
  11. | 66793 | 2383923 |
  12. | 68086 | 2305351 |
  13. | 80823 | 2368170 |
  14. | 109334 | 2553036 |
  15. | 237542 | 2381119 |
  16. +--------+-------------+
  17. 7 rows in set (0.77 sec)

MYSQL - JOIN

在这里插入图片描述

示例表(table_01table_02):

  1. select *
  2. from table_01;
  3. select *
  4. from table_02;
  5. +----+
  6. | id |
  7. +----+
  8. | 1 |
  9. | 2 |
  10. | 3 |
  11. | 4 |
  12. | 5 |
  13. | 6 |
  14. +----+
  15. 6 rows in set (0.00 sec)
  16. +----+
  17. | id |
  18. +----+
  19. | 4 |
  20. | 5 |
  21. | 6 |
  22. | 7 |
  23. | 8 |
  24. | 9 |
  25. | 0 |
  26. +----+
  27. 7 rows in set (0.00 sec)

INNER JOINJOIN

可以简写为JOIN

示例:

  1. select *
  2. from table_01
  3. join table_02 on table_01.id = table_02.id;
  4. select *
  5. from table_01
  6. inner join table_02 on table_01.id = table_02.id;
  7. +----+----+
  8. | id | id |
  9. +----+----+
  10. | 4 | 4 |
  11. | 5 | 5 |
  12. | 6 | 6 |
  13. +----+----+
  14. 3 rows in set (0.00 sec)

示例:

  1. -- 查询管理员所在部门和姓名等信息
  2. select employees.emp_no,
  3. employees.first_name,
  4. employees.last_name,
  5. employees.gender,
  6. departments.dept_no,
  7. departments.dept_name
  8. from dept_manager
  9. join departments on dept_manager.dept_no = departments.dept_no
  10. join employees on employees.emp_no = dept_manager.emp_no;
  11. +--------+-------------+--------------+--------+---------+-----------+
  12. | emp_no | first_name | last_name | gender | dept_no | dept_name |
  13. +--------+-------------+--------------+--------+---------+-----------+
  14. | 111692 | Tonny | Butterworth | F | d009 | ???? |
  15. | 111784 | Marjo | Giarratana | F | d009 | ???? |
  16. | 111877 | Xiaobin | Spinelli | F | d009 | ???? |
  17. | 111939 | Yuchang | Weedman | M | d009 | ???? |
  18. | 110511 | DeForest | Hagimont | M | d005 | ???? |
  19. | 110567 | Leon | DasSarma | F | d005 | ???? |
  20. | 110183 | Shirish | Ossenbruggen | F | d003 | ?? |
  21. | 110228 | Karsten | Sigstam | F | d003 | ?? |
  22. | 110303 | Krassimir | Wegerle | F | d004 | ?? |
  23. | 110344 | Rosine | Cools | F | d004 | ?? |
  24. | 110386 | Shem | Kieras | M | d004 | ?? |
  25. | 110420 | Oscar | Ghazalie | M | d004 | ?? |
  26. | 111035 | Przemyslawa | Kaelbling | M | d007 | ?? |
  27. | 111133 | Hauke | Zhang | M | d007 | ?? |
  28. | 110725 | Peternela | Onuegbe | F | d006 | ?? |
  29. | 110765 | Rutger | Hofmeyr | F | d006 | ?? |
  30. | 110800 | Sanjoy | Quadeer | F | d006 | ?? |
  31. | 110854 | Dung | Pesch | M | d006 | ?? |
  32. | 110085 | Ebru | Alpin | M | d002 | ?? |
  33. | 110114 | Isamu | Legleitner | F | d002 | ?? |
  34. | 111400 | Arie | Staelin | M | d008 | ???? |
  35. | 111534 | Hilary | Kambil | F | d008 | ???? |
  36. | 110022 | Margareta | Markovitch | M | d001 | ?? |
  37. | 110039 | Vishwani | Minakawa | M | d001 | ?? |
  38. +--------+-------------+--------------+--------+---------+-----------+
  39. 24 rows in set (0.00 sec)

LEFT JOINLEFT OUTER JOIN

示例:

  1. select *
  2. from table_01
  3. left join table_02 on table_01.id = table_02.id;
  4. +----+------+
  5. | id | id |
  6. +----+------+
  7. | 1 | NULL |
  8. | 2 | NULL |
  9. | 3 | NULL |
  10. | 4 | 4 |
  11. | 5 | 5 |
  12. | 6 | 6 |
  13. +----+------+
  14. 6 rows in set (0.00 sec)

RIGHT JOINRIGHT OUTER JOIN

示例:

  1. select *
  2. from table_01
  3. right join table_02 on table_01.id = table_02.id;
  4. +------+----+
  5. | id | id |
  6. +------+----+
  7. | 4 | 4 |
  8. | 5 | 5 |
  9. | 6 | 6 |
  10. | NULL | 7 |
  11. | NULL | 8 |
  12. | NULL | 9 |
  13. | NULL | 0 |
  14. +------+----+
  15. 7 rows in set (0.00 sec)

LEFT JOIN ... WHERE ...

示例:

  1. select *
  2. from table_01
  3. left join table_02 on table_01.id = table_02.id
  4. where table_02.id is null;
  5. +----+------+
  6. | id | id |
  7. +----+------+
  8. | 1 | NULL |
  9. | 2 | NULL |
  10. | 3 | NULL |
  11. +----+------+
  12. 3 rows in set (0.00 sec)

RIIGHT JOIN ... WHERE ...

示例:

  1. select *
  2. from table_01
  3. right join table_02 on table_01.id = table_02.id
  4. where table_01.id is null;
  5. +------+----+
  6. | id | id |
  7. +------+----+
  8. | NULL | 7 |
  9. | NULL | 8 |
  10. | NULL | 9 |
  11. | NULL | 0 |
  12. +------+----+
  13. 4 rows in set (0.00 sec)

TRUNCATE TABLE

删除表中的所有数据

示例:

  1. truncate table table_name;

INSERT INTO 表1 (列1, 列2) SELECT (列1, 列2) FROM 表2

把表2数据复制到表1中

示例:

  1. insert into table_02 (id) (select * from table_01);
  2. +----+
  3. | id |
  4. +----+
  5. | 4 |
  6. | 5 |
  7. | 6 |
  8. | 7 |
  9. | 8 |
  10. | 9 |
  11. | 0 |
  12. | 1 |
  13. | 2 |
  14. | 3 |
  15. | 4 |
  16. | 5 |
  17. | 6 |
  18. +----+
  19. 13 rows in set (0.00 sec)

UNIONUNION ALL

组合两个或更多SELECT语句的结果集

UNION 不返回任何重复的行

UNION ALL 返回重复的行

要求:

  • UNION中的每个SELECT语句必须具有相同的列数
  • 这些列也必须具有相似的数据类型
  • 每个SELECT语句中的列也必须以相同的顺序排列
  • 每个SELECT语句必须有相同数目的列表达式
  • 但是每个SELECT语句的长度不必相同

示例(UNION):

  1. select dept_no
  2. from dept_manager
  3. union
  4. select dept_no
  5. from departments;
  6. +---------+
  7. | dept_no |
  8. +---------+
  9. | d001 |
  10. | d002 |
  11. | d003 |
  12. | d004 |
  13. | d005 |
  14. | d006 |
  15. | d007 |
  16. | d008 |
  17. | d009 |
  18. +---------+
  19. 9 rows in set (0.00 sec)

示例(UNION ALL):

  1. select dept_no
  2. from dept_manager
  3. union all
  4. select dept_no
  5. from departments;
  6. +---------+
  7. | dept_no |
  8. +---------+
  9. | d001 |
  10. | d001 |
  11. | d002 |
  12. | d002 |
  13. | d003 |
  14. | d003 |
  15. | d004 |
  16. | d004 |
  17. | d004 |
  18. | d004 |
  19. | d005 |
  20. | d005 |
  21. | d006 |
  22. | d006 |
  23. | d006 |
  24. | d006 |
  25. | d007 |
  26. | d007 |
  27. | d008 |
  28. | d008 |
  29. | d009 |
  30. | d009 |
  31. | d009 |
  32. | d009 |
  33. | d009 |
  34. | d005 |
  35. | d003 |
  36. | d004 |
  37. | d007 |
  38. | d006 |
  39. | d002 |
  40. | d008 |
  41. | d001 |
  42. +---------+
  43. 33 rows in set (0.00 sec)

日期相关函数

NOW()CURDATE()CURTIME()DATE()DATE_FORMAT()DATEDIFF()

示例:

  1. -- NOW() 返回当前的日期和时间
  2. -- CURDATE() 返回当前的日期
  3. -- CURTIME() 返回当前的时间
  4. -- DATE('2023-07-12 08:00:09') 提取日期或日期/时间表达式的日期部分
  5. -- DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p') 用不同的格式显示日期/时间
  6. -- DATEDIFF('2023-07-12 08:00:09','2008-11-29') 返回两个日期之间的天数
  7. select NOW(),
  8. CURDATE(),
  9. CURTIME(), DATE ('2023-07-12 08:00:09'), DATE_FORMAT(NOW(), '%b %d %Y %h:%i %p'), DATEDIFF('2023-07-12 08:00:09', '2008-11-29');
  10. +---------------------+------------+-----------+-----------------------------+-----------------------------------------+-----------------------------------------------+
  11. | NOW() | CURDATE() | CURTIME() | DATE('2023-07-12 08:00:09') | DATE_FORMAT(NOW(), '%b %d %Y %h:%i %p') | DATEDIFF('2023-07-12 08:00:09', '2008-11-29') |
  12. +---------------------+------------+-----------+-----------------------------+-----------------------------------------+-----------------------------------------------+
  13. | 2023-07-12 08:06:49 | 2023-07-12 | 08:06:49 | 2023-07-12 | Jul 12 2023 08:06 AM | 5338 |
  14. +---------------------+------------+-----------+-----------------------------+-----------------------------------------+-----------------------------------------------+
  15. 1 row in set (0.00 sec)

EXTRACT()DATE_ADD()DATE_SUB()

示例:

  1. -- EXTRACT() 返回日期/时间的单独部分
  2. -- DATE_ADD() 向日期添加指定的时间间隔
  3. -- DATE_SUB() 从日期减去指定的时间间隔
  4. select EXTRACT(YEAR from NOW()), DATE_ADD(NOW(), interval 5 day), DATE_SUB(NOW(), interval 15 day);
  5. +--------------------------+---------------------------------+----------------------------------+
  6. | EXTRACT(YEAR from NOW()) | DATE_ADD(NOW(), interval 5 day) | DATE_SUB(NOW(), interval 15 day) |
  7. +--------------------------+---------------------------------+----------------------------------+
  8. | 2023 | 2023-07-17 08:11:06 | 2023-06-27 08:11:06 |
  9. +--------------------------+---------------------------------+----------------------------------+
  10. 1 row in set (0.00 sec)

发表评论

表情:
评论列表 (有 0 条评论,100人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MySQL高级

    一、基础环境搭建 -------------------- > 环境准备:CentOS7.6(系统内核要求是3.10以上的)、FinalShell 1. 安装Doc

    相关 MySQL高级

    1 mysql隔离级别 读未提交:一个事务可以读取到另一个事务未提交的修改。这会带来脏读、幻读、不可重复读问题。(基本没用) 读已提交:一个事务只能读取另一个事务已经提

    相关 MySQL高级

    MySQL逻辑架构 > mysql分层思想 和其他数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上。