数据库——创建和管理表

古城微笑少年丶 2024-04-01 09:28 201阅读 0赞

目录

1.1 一条数据存储的过程

1.2 标识符命名规则

1.3 MySQL中的数据类型

  1. 创建和管理数据库

2.2 使用数据库

2.3 修改数据库

2.4删除数据库

  1. 创建表

3.3 查看数据表结构

4.2 修改一个列

4.3 重命名一个列

4.4 删除一个列

5.-重命名表

  1. 删除表

  2. 清空表

  3. 内容拓展

数据库学习记录——-代码


1.1 一条数据存储的过程

  • 存储数据是处理数据的第一步 。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只

    能是一团乱麻,无从下手。

    那么,怎样才能把用户各种经营相关的、纷繁复杂的数据,有序、高效地存储起来呢? 在 MySQL 中,

    一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据。

76b2c4eb45e847ceb8c5b3708b7395d2.png

我们要先创建一个数据库,而不是直接创建数据表呢?

因为从系统架构的层次上看, MySQL 数据库系统从大到小依次是 数据库服务器 、 数据库 、 数据表 、数

据表的 行与列 。

1.2 标识符命名规则

  • 数据库名、表名不得超过30个字符,变量名限制为29个
  • 数据库名、表名不得超过 30 个字符,变量名限制为 29 个
  • 数据库名、表名、字段名等对象名中间不要包含空格
  • 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
  • 必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在 SQL 语句中使 用` (着重号)引起来
  • 保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据 类型在一个表里是整数,那在另一个表里可就别变成字符型了

1.3 MySQL**中的数据类型**

f55fcf72fd7e4d0f841dde4358ac0341.png

其中,常用的几类类型介绍如下:

f9959d59f75c412bb11fd815ea16bcf1.png

2. 创建和管理数据库

  • 方式1:创建数据库

CREATE DATABASE 数据库名;

  • 方式2:创建数据库并指定字符集

CREATE DATABASE 数据库名 CHARACTER SET 字符集;

  • 方式3:判断数据库是否已经存在,不存在则创建数据库( 推荐 )

CREATE DATABASE IF NOT EXISTS 数据库名;

最好也加上字符集

CREATE DATABASE IF NOT EXISTS 数据库名 CHARACTER SET 字符集;( 推荐 )

字符集:utf8—-gbk

  • 如果MySQL中已经存在相关的数据库,则忽略创建语句,不再创建数据库。
  • 注意:DATABASE 不能改名。一些可视化工具可以改名,它是建新库,把所有表复制到新库,再删 旧库完成的。

#1-2管理数据库
#查看当前连接中的数据库都有哪些:
SHOW DATABASES;

2.2 使用数据库

  • 查看当前所有的数据库

SHOW DATABASES; #有一个S,代表多个数据库

  • 查看当前正在使用的数据库

SELECT DATABASE(); #使用的一个 mysql 中的全局函数

  • 查看指定库下所有的表

SHOW TABLES FROM 数据库名;

  • 查看数据库的创建信息

SHOW CREATE DATABASE 数据库名 ;

或者:

SHOW CREATE DATABASE 数据库名 \G

  • 使用/切换数据库

USE 数据库名;

  • 注意:要操作表格和数据之前必须先说明是对哪个数据库进行操作,否则就要对所有对象加上“数 据库名.”。

2.3 修改数据库

  • 更改数据库字符集

ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:gbk、utf8等

  1. #2.3修改数据库
  2. #更改数据库字符集
  3. #ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:gbk、utf8等
  4. SHOW CREATE DATABASE dbtest;#CREATE DATABASE `dbtest` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */
  5. ALTER DATABASE dbtest CHARACTER SET 'gbk';
  6. SHOW CREATE DATABASE dbtest;#CREATE DATABASE `dbtest` /*!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION='N' */

#2.3修改数据库
#更改数据库字符集
#ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:gbk、utf8等
SHOW CREATE DATABASE dbtest;#CREATE DATABASE `dbtest` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION=’N’ */

ALTER DATABASE dbtest CHARACTER SET ‘gbk’**; SHOW CREATE DATABASE dbtest;*#CREATE DATABASE `dbtest` /\!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION=’N’ */

2.4删除数据库

  • 方式1:删除指定的数据库

DROP DATABASE 数据库名;

  • 方式2:删除指定的数据库( 推荐 )

DROP DATABASE IF EXISTS 数据库名;

  1. #1.4删除数据库
  2. #方式一:
  3. DROP DATABASE dbtext01;
  4. #方式二:
  5. DROP DATABASE IF EXISTS dbtext01;
  6. #DDL数据定义语言:CREATE \ALTER\ DROP \RENAME \TRUNCATE
  7. #1. 创建和管理数据库
  8. #如何创建数据库?
  9. #方式一:
  10. CREATE DATABASE dbtest; #创建此数据库使用的是默认的字符集utf8mb4
  11. SHOW DATABASES;
  12. #方式二:CREATE DATABASE 数据库名 CHARACTER SET 字符集;
  13. # 显式了指明了要哦创建的数据库的字符集
  14. CREATE DATABASE dbtest CHARACTER SET 'gbk';
  15. #方式三::判断数据库是否已经存在,不存在则创建数据库( 推荐 )
  16. #如果已经存在,则创建不成功,但是不会报错。
  17. #CREATE DATABASE IF NOT EXISTS 数据库名;
  18. CREATE DATABASE IF NOT EXISTS dbtest CHARACTER SET 'utf8';
  19. #1-2管理数据库
  20. #查看当前连接中的数据库都有哪些
  21. SHOW DATABASES;
  22. #2.2 使用数据库
  23. #切换数据库
  24. USE dbtest;
  25. #查看当前数据库中都有哪些数据表
  26. SHOW TABLES;
  27. #查看当前使用的数据库
  28. SELECT DATABASE()
  29. FROM DUAL;
  30. #查看指定数据库下保存的数据表
  31. SHOW TABLES FROM dbtest;
  32. #2.3修改数据库
  33. #更改数据库字符集
  34. #ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:gbk、utf8等
  35. SHOW CREATE DATABASE dbtest;#CREATE DATABASE `dbtest` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */
  36. ALTER DATABASE dbtest CHARACTER SET 'gbk';
  37. SHOW CREATE DATABASE dbtest;#CREATE DATABASE `dbtest` /*!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION='N' */
  38. #1.4删除数据库
  39. #方式一:
  40. DROP DATABASE dbtext01;
  41. #方式二:
  42. DROP DATABASE IF EXISTS dbtext01;

3. 创建表

3.1 创建方式 1(白手起家型)

  • 必须具备:
  • —-CREATE TABLE权限

    —-存储空间

  • 语法格式:

CREATE TABLE [ IF NOT EXISTS ] 表名 (

字段 1, 数据类型 [ 约束条件 ] [ 默认值 ],

字段 2, 数据类型 [ 约束条件 ] [ 默认值 ],

字段 3, 数据类型 [ 约束条件 ] [ 默认值 ],

……

[ 表约束条件 ]

);

加上了IF NOT EXISTS关键字,则表示:如果当前数据库中不存在要创建的数据表,则创建数据表; 如果当前数据库中已经存在要创建的数据表,则忽略建表语句,不再创建数据表。

  • 必须指定:
  • 表名

    列名(或字段名) ,数据类型长度

  • 可选指定:

    • 约束条件

      默认值

  • 创建表举例1:

创建表

CREATE TABLE emp (

-- int 类型

emp_id INT ,

-- 最多保存 20 个中英文字符

emp_name VARCHAR ( 20 ),

-- 总位数不超过 15 位

salary DOUBLE ,

-- 日期类型

birthday DATE

);

DESC emp;

65612c4e16644c0a936cebb9c6f43071.png

MySQL 在执行建表语句时,将 id 字段的类型设置为 int(11) ,这里的 11 实际上是 int 类型指定的显示宽度,默 认的显示宽度为11 。也可以在创建数据表的时候指定数据的显示宽度。

  • 创建表举例2:

CREATE TABLE dept(

-- int 类型,自增

deptno INT ( 2 ) AUTO_INCREMENT ,

dname VARCHAR ( 14 ),

loc VARCHAR ( 13 ),

-- 主键

PRIMARY KEY (deptno)

);

DESCRIBE dept;

7a3932ffdc8745fea168630df86bede3.png

在MySQL 8.x版本中,不再推荐为INT类型指定显示长度,并在未来的版本中可能去掉这样的语法。

3.2 创建方式2(基于现有的表创建,同时导入数据)

  • 使用 AS subquery 选项, 将创建表和插入数据结合起来

e1eb95285f48490c9b15e9dd837406af.png

  • 指定的列和子查询中的列要一一对应
  • 通过列名和默认值定义列

    CREATE TABLE emp1 AS SELECT FROM employees;
    CREATE TABLE emp2 AS SELECT
    FROM employees WHERE 1=2; — 创建的emp2是空表
    CREATE TABLE dept80
    AS
    SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
    FROM employees
    WHERE department_id = 80;

  1. DESCRIBE dept80;

87b899fe701146bd807a22addf9afab3.png

3.3 查看数据表结构

  • 在 MySQL 中创建好数据表之后,可以查看数据表的结构。 MySQL 支持使用 DESCRIBE/DESC 语句查看数据 表结构,也支持使用 SHOW CREATE TABLE 语句查看数据表结构。

语法格式如下:

SHOW CREATE TABLE 表名\G

使用 SHOW CREATE TABLE 语句不仅可以查看表创建时的详细语句,还可以查看存储引擎和字符编码。

  1. #3. 创建表
  2. USE dbtest;
  3. SHOW CREATE DATABASE dbtest;
  4. #CREATE DATABASE `dbtest` /*!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION='N' */
  5. ALTER DATABASE dbtest CHARACTER SET 'utf8';
  6. SHOW TABLES;
  7. #方式一:
  8. CREATE TABLE IF NOT EXISTS myempl(
  9. id INT,
  10. emp_name VARCHAR(15),
  11. hire_date DATE
  12. );
  13. #查看表结构
  14. DESC myempl;
  15. #或者
  16. #查看创建表的语句结构
  17. SHOW CREATE TABLE myempl;
  18. SELECT * FROM myempl;
  19. #方式二:基于现有的表创建,同时导入数据
  20. CREATE TABLE myemp2
  21. AS
  22. SELECT *
  23. FROM employees;
  24. DESC myemp2;
  25. SELECT *
  26. FROM myemp2;

小练习:

  1. #练习一:创建一表 employees_copy,实现对 employees表的复制,包括表的数据
  2. CREATE TABLE employees_copy
  3. AS
  4. SELECT *
  5. FROM employees;
  6. SELECT *
  7. FROM employees_copy;
  8. #练习一:创建一表 employees_blank,实现对 employees表的复制,不包括表的数据
  9. CREATE TABLE employees_blank
  10. AS
  11. SELECT*
  12. FROM employees
  13. WHERE 1=2;
  14. SELECT*
  15. FROM employees_blank;

employees表:

423f0cda8ae743d490408e24216e4def.png

练习一:

9b7ae3d944cd44f4938a7ae15d5fdea6.png

练习二:

75c1ec091e634bfcb43f347ab9060008.png

4. 修改表

  • 修改表指的是修改数据库中已经存在的数据表的结构。

使用 ALTER TABLE 语句可以实现:

向已有的表中添加列

修改现有表中的列

删除现有表中的列

重命名现有表中的列

4.1 追加一个列

语法格式如下:

ALTER TABLE 表名 ADD 【COLUMN】 字段名 字段类型 【FIRST|AFTER 字段名】;

  • 举例:

ALTER TABLE dept80

ADD job_id varchar ( 15 );

2a2e32deaa7e4dc9a6488d84170bfb26.png

练习:

  1. #3-1添加一个字段
  2. #ALTER TABLE 表名 ADD 【COLUMN】 字段名 字段类型 【FIRST|AFTER 字段名】;
  3. //把age放在name后面,如果放第一个用 FIRST
  4. ALTER TABLE myemp2
  5. ADD age INT AFTER name;

4837f9a051a14e8ba886f74c528c37ad.png

#查看myemp2表结构:

DESC myemp2;

f4015e6aae1f4de6a03517f3517de5b8.png

4.2 修改一个列

  • 可以修改列的数据类型,长度、默认值和位置
  • 修改字段数据类型、长度、默认值、位置的语法格式如下:

ALTER TABLE 表名 MODIFY 【 COLUMN 】 字段名 1 字段类型 【 DEFAULT 默认值】【 FIRST| AFTER 字段名 2】 ;

  • 举例:

ALTER TABLE dept80

MODIFY last_name VARCHAR ( 30 );

ALTER TABLE dept80

MODIFY salary double ( 9 , 2 ) default 1000 ;

  • 对默认值的修改只影响今后对表的修改
  • 此外,还可以通过此种方式修改列的约束。

小练习:

  1. #3-2修改一个字段:数据类型-长度-默认值(略)
  2. #ALTER TABLE 表名 MODIFY 【COLUMN】 字段名1 字段类型 【DEFAULT 默认值】【FIRST|AFTER 字段名2】;
  3. ALTER TABLE myemp2
  4. MODIFY name VARCHAR(25);
  5. ALTER TABLE myemp2
  6. MODIFY name VARCHAR(25) DEFAULT 'ddd';
  7. DESC myemp2;

5f2ab07b35874153b35c0d97da3fe68e.png

4.3 重命名一个列

  • 使用 CHANGE old_column new_column dataType子句重命名列。语法格式如下:

ALTER TABLE 表名 CHANGE 【column】 列名 新列名 新数据类型;

  • 举例:

ALTER TABLE dept80

CHANGE department_name dept_name varchar ( 15 );

小练习:

  1. #3-3重命名一个字段
  2. #ALTER TABLE 表名 CHANGE 【column】 列名 新列名 新数据类型;
  3. ALTER TABLE myemp2
  4. CHANGE name emp_name VARCHAR(20);
  5. DESC myemp2;

981698afd8d94cb1b459a9ccbcafd72f.png

4.4 删除一个列

  • 删除表中某个字段的语法格式如下:

ALTER TABLE 表名 DROP 【COLUMN】字段名

  • 举例:

ALTER TABLE dept80

DROP COLUMN job_id;

  1. #3-4删除一个字段
  2. #ALTER TABLE 表名 DROP 【COLUMN】字段名
  3. ALTER TABLE myemp2
  4. DROP COLUMN age;
  5. DESC myemp2;

fe5e13bca75a4dd2ab3d72f1a310047e.png

5.-重命名表

  • 方式一:使用RENAME

RENAME TABLE emp

TO myemp;

  • 方式二:

ALTER table dept

RENAME [ TO ] detail_dept; -- [TO] 可以省略

  • 必须是对象的拥有者

    4-重命名表

    方式一:使用RENAME

    1. #RENAME TABLE emp
    2. #TO myemp;

    RENAME TABLE myempl
    To myemp11;

    DESC myemp11;

cb3d8a0cde6541c79295d531c8625257.png

6. 删除表

  • 在MySQL中,当一张数据表 没有与其他任何数据表形成关联关系 时,可以将当前数据表直接删除。
  • 数据和结构都被删除
  • 所有正在运行的相关事务被提交
  • 所有相关索引被删除
  • 语法格式:

DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];

IF EXISTS 的含义为:如果当前数据库中存在相应的数据表,则删除数据表;如果当前数据库中不存 在相应的数据表,则忽略删除语句,不再执行删除数据表的操作。

  • 举例:

DROP TABLE dept80;

  • DROP TABLE 语句不能回滚

    5-删除表—-DROP TABLE 语句不能回滚(不能撤销,删除了就没了)

    DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];

    DROP TABLE IF EXISTS myemp11;

    DESC myemp11;

97aff0ecc3ed44deb974c0cac690248d.png

7. 清空表

  • TRUNCATE TABLE语句:

    • 删除表中所有的数据
    • 释放表的存储空间
  • 举例:

TRUNCATE TABLE detail_dept;

TRUNCATE语句不能回滚,而使用 DELETE 语句删除数据,可以回滚

对比:

DELETE FROM emp2;

#TRUNCATE TABLE emp2;

SELECT * FROM emp2;

ROLLBACK ;

SELECT * FROM emp2;

阿里开发规范:

【参考】 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无

事务且不触发 TRIGGER ,有可能造成事故,故不建议在开发代码中使用此语句。

说明: TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。

  1. SELECT *
  2. FROM myemp2;

原来表:

a6ca9634fb994746bfa296570930c8d9.png

执行清空操作:

  1. TRUNCATE TABLE myemp2;

清空后:

  1. SELECT *
  2. FROM myemp2;

b0966410420342158164ef1ddaecc11a.png

表结构还在:

46304813e9a24ae98aa8dc341e5e476e.png

8. 内容拓展

  • 拓展 1 :阿里巴巴《 Java 开发手册》之 MySQL 字段命名

3ed10e33fe1d41449e8bbc5af54e6ae2.png

表删除 操作将把表的定义和表中的数据一起删除,并且 MySQL 在执行删除操作时,不会有任何的确认信 息提示,因此执行删除操时应当慎重。在删除表前,最好对表中的数据进行 备份 ,这样当操作失误时可 以对数据进行恢复,以免造成无法挽回的后果。

同样的,在使用 ALTER TABLE 进行表的基本修改操作时,在执行操作过程之前,也应该确保对数据进 行完整的 备份 ,因为数据库的改变是 无法撤销 的,如果添加了一个不需要的字段,可以将其删除;相 同的,如果删除了一个需要的列,该列下面的所有数据都将会丢失。

拓展**3MySQL8新特性—DDL**的原子化

  • 在 MySQL 8.0 版本中, InnoDB 表的 DDL 支持事务完整性,即 DDL 操作要么成功要么回滚 。 DDL 操作回滚日志 写入到data dictionary 数据字典表 mysql.innodb_ddl_log (该表是隐藏的表,通过 show tables 无法看到) 中,用于回滚操作。通过设置参数,可将DDL 操作日志打印输出到 MySQL 错误日志中。

分别在MySQL 5.7版本和MySQL 8.0版本中创建数据库和数据表,结果如下:

CREATE DATABASE mytest;

USE mytest;

CREATE TABLE book1(

book_id INT ,

book_name VARCHAR ( 255 )

);

SHOW TABLES ;

(1)在 MySQL 5.7 版本中,测试步骤如下: 删除数据表 book1 和数据表 book2 ,结果如下:

mysql> DROP TABLE book1,book2;

ERROR 1051 ( 42 S02): Unknown table ‘mytest.book2’

再次查询数据库中的数据表名称,结果如下:

mysql> SHOW TABLES ;

Empty set ( 0.00 sec)

从结果可以看出,虽然删除操作时报错了,但是仍然删除了数据表book1。

(2)在 MySQL 8.0 版本中,测试步骤如下: 删除数据表 book1 和数据表 book2 ,结果如下:

mysql> DROP TABLE book1,book2;

ERROR 1051 ( 42 S02): Unknown table ‘mytest.book2’

再次查询数据库中的数据表名称,结果如下:

1215b46b4252451dabbb70c99ebe3b81.png

数据库学习记录——-代码

  1. #字符串函数
  2. SELECT
  3. ASCII('abcdf'),
  4. CHAR_LENGTH('hello'),
  5. CHAR_LENGTH('诗栋'),
  6. LENGTH('helllo'),
  7. LENGTH('我嗯')
  8. FROM
  9. DUAL;
  10. SELECT
  11. CONCAT(NAME, '-work for-', id) "details"
  12. FROM
  13. students;
  14. #日期和时间函数
  15. #获取日期,时间
  16. SELECT
  17. CURDATE(),
  18. CURRENT_DATE (),
  19. CURTIME(),
  20. NOW(),
  21. SYSDATE(),
  22. #2022-09-24 -2022-09-24- 09:42:57 -2022-09-24 09:42:57- 2022-09-24 09:42:57
  23. UTC_DATE(),
  24. UTC_TIME() #-2022-09-24-01:42:57
  25. FROM
  26. DUAL;
  27. #日期与时间的转换
  28. SELECT
  29. UNIX_TIMESTAMP(),
  30. FROM_UNIXTIME(1663984252),
  31. UNIX_TIMESTAMP('2022-09-24 09:50:52'),
  32. FROM_UNIXTIME(1663984252)
  33. FROM
  34. DUAL;
  35. SELECT
  36. YEAR (CURDATE()),
  37. MONTH (CURDATE()),
  38. DAY (CURDATE()),
  39. WEEKDAY('2022-09-25'),
  40. HOUR (CURTIME()),
  41. MINUTE (NOW()),
  42. SECOND (SYSDATE())
  43. FROM
  44. DUAL;
  45. #日期的操作函数----》》extract(type FROM data)type指定返回的值
  46. SELECT
  47. EXTRACT(YEAR FROM NOW()),
  48. EXTRACT(MONTH FROM NOW()),
  49. EXTRACT(DAY FROM NOW()),
  50. EXTRACT(HOUR FROM NOW()),
  51. EXTRACT(MINUTE FROM NOW()),
  52. EXTRACT(SECOND FROM NOW()),
  53. EXTRACT(QUARTER FROM NOW())
  54. FROM
  55. DUAL;
  56. #时间和秒钟的转换函数 TIME_TO_SEC(time)将time转化为秒返回结果值;
  57. #SEC_TO_TIME(seconds)TIME(second) 将second描述转化为包含小时、分钟、秒的时间
  58. SELECT
  59. TIME_TO_SEC(CURTIME()),
  60. SEC_TO_TIME(9000)
  61. FROM
  62. DUAL;
  63. #计算日期和时间的函数
  64. # DATE_ADD(date,INTERVAL expr unit)或ADDDATE(date,INTERVAL expr unit)返回与给定时间相差INTERVAL时间段的日期时间
  65. #DATE_SUB(date,INTERVAL expr unit)返回与data相差INTERVAL时间间隔的日期
  66. SELECT
  67. NOW(),
  68. DATE_ADD(NOW(), INTERVAL 1 YEAR),
  69. #2022-09-26 00:48:01;2023-09-26 00:48:01
  70. DATE_SUB(NOW(), INTERVAL 1 YEAR),
  71. #2021-09-26 00:53:59
  72. DATE_ADD(
  73. NOW(),
  74. INTERVAL '1_1' YEAR_MONTH
  75. ) #2023-10-26 00:58:14;加1年1个月
  76. FROM
  77. DUAL;
  78. #日期的格式化与解析,格式化:日期---》字符串,解析:字符串————》日期
  79. #DATE_FORMAT(date,format)按照字符串format格式转化日期date值
  80. SELECT
  81. DATE_FORMAT(CURDATE(), '%Y-%M-%d'),
  82. #2022-September-26
  83. DATE_FORMAT(NOW(), '%Y-%M-%d'),
  84. #2022-September-26
  85. TIME_FORMAT(CURDATE(), '%H:%i:%s'),
  86. #00:00:00
  87. DATE_FORMAT(
  88. CURDATE(),
  89. '%Y-%M-%d %h:%i:%s %W %T %r'
  90. ) #2022-September-26 12:00:00 Monday 00:00:00 12:00:00 AM
  91. FROM
  92. DUAL;
  93. #解析:格式化的逆过程·
  94. SELECT
  95. STR_TO_DATE(
  96. '2022-October-26 12:30:20 Monday 1',
  97. '%Y-%M-%d %h:%i:%s %W'
  98. ) #2022-10-26 00:30:20
  99. FROM
  100. DUAL;
  101. SELECT
  102. GET_FORMAT(DATE, 'USA') #%m.%d.%Y
  103. SELECT
  104. GET_FORMAT(
  105. CURDATE(),
  106. GET_FORMAT(DATE, 'USA')
  107. )
  108. FROM
  109. DUAL;
  110. #流程控制函数
  111. #IF(VALUE,VALUE1,VALUE2)
  112. SELECT
  113. NAME,
  114. salary,
  115. IF (
  116. salary >= 6000,
  117. '高工资',
  118. '低工资'
  119. )
  120. FROM
  121. employees;
  122. #IFNULL(expr1,expr2)如果expr1是null则输出expr2否则输出本身
  123. #CASE
  124. #相当于java的if....else
  125. SELECT
  126. last_name,
  127. CASE
  128. WHEN salary >= 2000 THEN
  129. '孙悟空'
  130. WHEN salary >= 5000 THEN
  131. '孙悟净'
  132. WHEN salary >= 9000 THEN
  133. '孙悟能' ELT '曹耿'
  134. END "details"
  135. FROM
  136. employees;
  137. #相当于java的switch
  138. #CASE....WHEN.......THEN........WHEN....THEN...ELSE....end
  139. SELECT
  140. employee_id,
  141. last_name,
  142. department_id,
  143. salary,
  144. CASE department - id
  145. WHEN 10 THEN
  146. salary * 1.1
  147. WHEN 20 THEN
  148. salary * 1.2
  149. WHEN 20 THEN
  150. salary * 1.3
  151. ELSE
  152. salary * 1.4
  153. END "details"
  154. FROM
  155. employees;
  156. #相当于java的switch
  157. #CASE....WHEN.......THEN........WHEN....THEN...ELSE....end
  158. SELECT
  159. employee_id,
  160. last_name,
  161. department_id,
  162. salary,
  163. CASE department - id
  164. WHEN 10 THEN
  165. salary * 1.1
  166. WHEN 20 THEN
  167. salary * 1.2
  168. WHEN 20 THEN
  169. salary * 1.3
  170. END "details"
  171. FROM
  172. employees;
  173. WHERE
  174. department_id IN (10, 20, 30);
  175. #5-加密与解密函数
  176. #PASSWORD()在mysql8.0被弃用
  177. #加密
  178. SELECT
  179. MD5('mysql'),
  180. SHA('mysql') #81c3b080dad537de7e10e0987a4bf52e
  181. FROM
  182. DUAL;
  183. #f460c882a18c1304d88854e902e11b85d71e7e1b
  184. #加密:
  185. #ENCODE(str,,)/DECODE(crypt_str,pass_str):返回pass_str作为加密密码加密value在mysql8.0被弃用
  186. #解密:
  187. #DECODE(crypt_str,pass_str):返回pass_str作为解密密码解密value 在mysql8.0被弃用
  188. SELECT
  189. ENCODE('shenlidong', 'mysql'),
  190. ENCODE(
  191. 'shenlidong',
  192. 'mysql',
  193. 'mysql'
  194. )
  195. FROM
  196. DUAL;
  197. #在mysql8.0被弃用,5.7可以
  198. #[SQL]SELECT ENCODE('shenlidong','mysql'),ENCODE('shenlidong','mysql','mysql')
  199. #FROM DUAL;
  200. #[Err] 1305 - FUNCTION dbtest.ENCODE does not exist
  201. #mysql信息函数
  202. SELECT
  203. VERSION(),
  204. CONNECTION_ID(),
  205. DATABASE (),
  206. SCHEMA (),
  207. USER (),
  208. CURRENT_USER (),
  209. CHARSET('shenlidong'),
  210. COLLATION ('shenlidong')
  211. FROM
  212. DUAL;
  213. #其他函数
  214. SELECT
  215. FORMAT(123.123, 2),
  216. FORMAT(123.125, 0),
  217. FORMAT(123.125, 2)
  218. FROM
  219. DUAL;
  220. SELECT
  221. CONV(16, 10, 2),
  222. CONV(8888, 10, 16),
  223. CONV(NULL, 10, 2)
  224. FROM
  225. DUAL;
  226. #BENCHMARK(count,expr):用于测试表达式的执行效率(时间)
  227. SELECT
  228. INET_ATON('192.168.10.1')
  229. FROM
  230. DUAL;
  231. SELECT
  232. INET_ATON('192.168.10.1'),
  233. CHARSET(
  234. CONVERT ('shenlidong' USING 'utf8') }
  235. FROM
  236. DUAL;
  237. #3232238081
  238. /*
  239. SELECT employees
  240. INSERT INTO employees VALUES(1002,'wangwu',1500);
  241. INSERT INTO employees VALUES(1003,'likui',2300);
  242. INSERT INTO employees VALUES(1004,'shimin',3000);
  243. INSERT INTO employees VALUES(1005,'liyuan',3500);
  244. FROM employees;*/
  245. #8-1聚合函数
  246. #8-1-1AVG() SUM()
  247. SELECT
  248. id,
  249. NAME,
  250. salary,
  251. AVG(salary),
  252. SUM(salary),
  253. SUM(id)
  254. FROM
  255. employees;
  256. #8-1-2 MAx() MIN()
  257. SELECT
  258. MAX(salary),
  259. MIN(salary)
  260. FROM
  261. employees;
  262. SELECT
  263. MAX(NAME),
  264. MIN(NAME) #wangwu lisi
  265. FROM
  266. employees;
  267. #8-1-3 COUNT()
  268. #1.计算指定字段在查询结构中出现的个数(不包含有Null值的)
  269. SELECT
  270. COUNT(id),
  271. COUNT(salary),
  272. COUNT(salary * 3),
  273. COUNT(1),
  274. COUNT(*) #4 4 4 4 4
  275. FROM
  276. employees;
  277. #如果计算表中有多少条记录,如何实现?
  278. #方式一:COUNT(*)
  279. #方式二:COUNT(1)‘
  280. #方式三:COUNT(具体字段):不一定对!
  281. #2-注意:计算指定字段出现的个数时,是不计算有null值的。
  282. #3-
  283. SELECT
  284. AVG(salary),
  285. SUM(salary) / COUNT(salary) aver #2550.0000 2550.0000
  286. FROM
  287. employees;
  288. #。。。。。。。。。。。。。。。。。
  289. SELECT
  290. AVG(IFNULL(salary, 1)) aver1,
  291. SUM(salary) / COUNT(IFNULL(salary, 1)) aver2 #2550.0000 2550.0000
  292. FROM
  293. employees;
  294. #
  295. SELECT
  296. *
  297. FROM
  298. employees;
  299. #方差 标准差 中位数等
  300. #8-2 GROUP BY 的使用
  301. #需求:查询各个部门的平均工资、最高工资
  302. SELECT
  303. id,
  304. AVG(salary),
  305. SUM(salary)
  306. FROM
  307. employees
  308. GROUP BY
  309. id #结论1:select中出现的非组函数的字段必须声明在group BY中
  310. #反之,group BY中声明的字段可以不出现在select中。
  311. #结论2:GROUP BY 声明在from后面、where后面,Order BY前面、limit前面
  312. #结论3:MySql中GROUP BY使用with ROLLUP
  313. SELECT
  314. id,
  315. AVG(salary),
  316. SUM(salary)
  317. FROM
  318. employees
  319. GROUP BY
  320. id WITH ROLLUP #计算整体的平均 : AVG(salary): 2550.0000 SUM(salary):10200
  321. #需求:查询各个部门的平均工资,按照低到高排列
  322. SELECT
  323. id,
  324. AVG(salary) aver_sal
  325. FROM
  326. employees
  327. GROUP BY
  328. id
  329. ORDER BY
  330. aver_sal ASC;
  331. SELECT
  332. id,
  333. AVG(salary) aver_sal
  334. FROM
  335. employees
  336. GROUP BY
  337. id WITH ROLLUP
  338. ORDER BY
  339. aver_sal;
  340. #8-3 HAVING 的使用(作用:用来过滤数据的)
  341. SELECT
  342. id,
  343. MAX(salary)
  344. FROM
  345. employees #WHERE MAX(salary)>1000 #错误方式过滤
  346. GROUP BY
  347. id;
  348. #要求1:如果过滤条件中使用了聚合函数,则必须使用HAVING来替换where。否则,报错
  349. #要求2:HAVING必须声明在GROUP BY 后面
  350. SELECT
  351. id,
  352. MAX(salary)
  353. FROM
  354. employees
  355. GROUP BY
  356. id
  357. HAVING
  358. MAX(salary) > 2000;
  359. #开发中,我们使用HAVING的前提是SQL中使用了GROUP BY
  360. #需求:查employees中id为1001,1002,1004中的比2000的最高工资
  361. #方式一:(推荐使用,执行效率高于方式二)
  362. SELECT
  363. id,
  364. MAX(salary)
  365. FROM
  366. employees
  367. WHERE
  368. id IN (1001, 1002, 1004)
  369. GROUP BY
  370. id
  371. HAVING
  372. MAX(salary) > 2000;
  373. #方式二:
  374. SELECT
  375. id,
  376. MAX(salary)
  377. FROM
  378. employees
  379. WHERE
  380. id IN (1001, 1002, 1004)
  381. GROUP BY
  382. id
  383. HAVING
  384. MAX(salary) > 2000
  385. AND id IN (1001, 1002, 1004);
  386. #结论:当过滤条件中有聚合函数时,则此过滤条件必须声明在HAVING
  387. # 当过滤条件中没有聚合函数时,则此过滤条件声明在WHERE或HAVING中都可以。但是,建议声明在WHERE中
  388. /*
  389. WHERE和HAVING的对比:
  390. 1-从适用范围上:HAVING适用范围更广
  391. HAVING 可以完成 WHERE 不能完成的任务。这是因为,
  392. 在查询语法结构中,WHERE 在 GROUP BY 之前,所以无法对分组结果进行筛选。
  393. HAVING 在 GROUP BY 之后,可以使用分组字段和分组中的计算函数,
  394. 对分组的结果集进行筛选,这个功能是 WHERE 无法完成
  395. 的。另外,WHERE排除的记录不再包括在分组中。
  396. 2-如果过滤条件中没有聚合函数:这种情况下,WHERE的执行效率要高于HAVING
  397. 如果需要通过连接从关联表中获取需要的数据,WHERE 是先筛选后连接,而 HAVING 是先连接
  398. 后筛选。
  399. */
  400. #4. SQL底层执行原理
  401. #SELECT语句的完整结构
  402. /*sql92语法:
  403. SELECT ...,...,...(存在聚合函数)
  404. FROM ...,...,...,...
  405. WHERE 多表连接条件 AND 不包含组(聚合函数)函数的过滤条件
  406. GROUP BY 包含组函数的过滤条件
  407. ORDER BY ... (ASC/DESC)
  408. LIMIT ...,...(分页操作)
  409. #sql99语法:
  410. SELECT ...,...,...(存在聚合函数)
  411. FROM ...(LEFT/RIGHT)JOIN...ON 多表连接条件
  412. ...(LEFT/RIGHT)JOIN...ON
  413. WHERE 不包含组(聚合函数)函数的过滤条件
  414. GROUP BY 包含组函数的过滤条件
  415. ORDER BY ... (ASC/DESC)
  416. LIMIT ...,...(分页操作)
  417. */
  418. #4.SQL语句的执行过程:
  419. #FROM...,...-->ON-->(LEFT/RIGHT JOIN)-->WHERE-->GROUP BY-->HAVING-->SELECT-->DISTINCT(去重)-->ORDER BY-->LIMIT
  420. #第09章_子查询
  421. #子查询指一个查询语句嵌套在另一个查询语句内部的查询。
  422. #需求:谁的工资比lidong高
  423. SELECT
  424. id,
  425. salary
  426. FROM
  427. employees
  428. WHERE
  429. salary > (
  430. SELECT
  431. salary
  432. FROM
  433. employees
  434. WHERE
  435. id = 1002
  436. );
  437. #称谓的规范:外查询(或主查询)、内查询(子查询)
  438. /*
  439. 子查询(内查询)在主查询之前一次执行完成。
  440. 子查询的结果被主查询(外查询)使用 。
  441. 注意事项
  442. 子查询要包含在括号内
  443. 将子查询放在比较条件的右侧
  444. 单行操作符对应单行子查询,多行操作符对应多行子查询
  445. */
  446. /*
  447. 3 子查询的分类:
  448. 角度一:
  449. 按内查询的结果返回一条还是多条记录,将子查询分为 单行子查询 -多行子查询 。
  450. 角度二:
  451. 我们按内查询是否被执行多次,将子查询划分为 相关(或关联)子查询 和
  452. 不相关(或非关联)子查询 (如上例)。
  453. 相关(或关联)子查询:比如:查询工资大于本部门平均工资的员工信息
  454. */
  455. #4. 单行子查询
  456. #4.1 单行比较操作符
  457. #题目:查询工资大于1002号员工工资的员工的信息
  458. #子查询的编写技巧(或步骤):1-从里往外写;2-从外往里写
  459. SELECT
  460. salary
  461. FROM
  462. employees
  463. WHERE
  464. id = 1002;
  465. #工资:2500
  466. SELECT
  467. id,
  468. employees.`name`,
  469. salary
  470. FROM
  471. employees
  472. WHERE
  473. salary > 2500;
  474. # id :1003 name: shangsan salary:2700
  475. #子查询方式:
  476. SELECT
  477. id,
  478. employees.`name`,
  479. salary
  480. FROM
  481. employees
  482. WHERE
  483. salary > (
  484. SELECT
  485. salary
  486. FROM
  487. employees
  488. WHERE
  489. id = 1002
  490. );
  491. # id :1003 name: shangsan salary:2700
  492. #题目:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资
  493. SELECT
  494. last_name,
  495. job_id,
  496. salary
  497. FROM
  498. employees
  499. WHERE
  500. job_id = (
  501. SELECT
  502. job_id
  503. FROM
  504. employees
  505. WHERE
  506. employee_id = 141
  507. )
  508. AND salary > (
  509. SELECT
  510. salary
  511. FROM
  512. employees
  513. WHERE
  514. employee_id = 143
  515. );
  516. #题目:返回公司工资最少的员工的last_name,job_id和salary
  517. SELECT
  518. last_name,
  519. job_id,
  520. salary
  521. FROM
  522. employees
  523. WHERE
  524. salary = (
  525. SELECT
  526. MIN(salary)
  527. FROM
  528. employees
  529. );
  530. #题目:查询与141号员工的manager_id和department_id相同的其他员工的employee_id,manager_id,department_id
  531. #方式一:
  532. SELECT
  533. employee_idmanager_iddepartment_id
  534. FROM
  535. employees
  536. WHERE
  537. manager_id = (
  538. SELECT
  539. manager_id
  540. FROM
  541. employees
  542. WHERE
  543. employee_id = 141
  544. )
  545. AND department_id = (
  546. SELECT
  547. department_id
  548. FROM
  549. employees
  550. WHERE
  551. employee_id = 141
  552. )
  553. AND employee_id <> 141;
  554. #方式二(了解)
  555. SELECT
  556. employee_id,
  557. manager_id,
  558. department_id
  559. FROM
  560. employees
  561. WHERE
  562. (manager_id, department_id) = (
  563. SELECT
  564. manager_id,
  565. department_id
  566. FROM
  567. employees
  568. WHERE
  569. employee_id = 141
  570. )
  571. AND employee_id <> 141;
  572. #题目:查询最低工资大于50号部门最低工资的部门id和其最低工资
  573. SELECT
  574. department_id ,, MIN(salary)
  575. FROM
  576. employees
  577. WHERE
  578. department_id IS NOT NULL
  579. GROUP BY
  580. department_id
  581. HAVING
  582. MIN(salary) > (
  583. SELECT
  584. MIN(salary)
  585. FROM
  586. employees
  587. WHERE
  588. department_id = 50
  589. );
  590. #题目:显式员工的employee_id,last_name,location。
  591. # 其中,若员工department_id与location_id为1800
  592. # 的department_id相同,则location为’Canada’,其余则为’USA’。
  593. SELECT
  594. employee_id,
  595. last_name,
  596. CASE department_id
  597. WHEN (
  598. SELECT
  599. department_id
  600. FROM
  601. department
  602. WHERE
  603. location_id = 1800
  604. ) THEN
  605. Canada
  606. ELSE
  607. USA
  608. END "location"
  609. FROM
  610. employees #2.5 子查询中的空值问题
  611. SELECT
  612. last_name,
  613. job_id
  614. FROM
  615. employees
  616. WHERE
  617. job_id = (
  618. SELECT
  619. job_id
  620. FROM
  621. employees
  622. WHERE
  623. last_name = 'Haas'
  624. );
  625. #非法使用子查询
  626. #Subquery returns more than 1 row
  627. SELECT
  628. employee_id,
  629. last_name
  630. FROM
  631. employees
  632. WHERE
  633. salary = (
  634. SELECT
  635. MIN(salary)
  636. FROM
  637. employees
  638. GROUP BY
  639. department_id
  640. );
  641. #3. 多行子查询
  642. #IN
  643. SELECT
  644. employee_id,
  645. last_name
  646. FROM
  647. employees
  648. WHERE
  649. salary IN (
  650. SELECT
  651. MIN(salary)
  652. FROM
  653. employees
  654. GROUP BY
  655. department_id
  656. );
  657. #ANY
  658. #题目:返回其它job_id中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、
  659. #姓名、job_id 以及salary
  660. SELECT
  661. employee_id,
  662. job_id,
  663. salary
  664. FROM
  665. employees
  666. WHERE
  667. job_id <> IT_PROG
  668. AND salary < ANY (
  669. SELECT
  670. salary
  671. FROM
  672. employees
  673. WHERE
  674. job_id = IT_PROG
  675. );
  676. #ALL
  677. #题目:返回其它job_id中比job_id为‘IT_PROG’部门所有工资低的员工的员工号、
  678. #姓名、job_id 以及salary
  679. SELECT
  680. employee_id,
  681. job_id,
  682. salary
  683. FROM
  684. employees
  685. WHERE
  686. job_id <> IT_PROG
  687. AND salary < ALL (
  688. SELECT
  689. salary
  690. FROM
  691. employees
  692. WHERE
  693. job_id = IT_PROG
  694. );
  695. #题目:查询平均工资最低的部门id
  696. #方式一:
  697. SELECT
  698. department_id
  699. FROM
  700. employees
  701. GROUP BY
  702. department_id
  703. HAVING
  704. AVG(salary) = (
  705. SELECT
  706. MIN(avg_sal)
  707. FROM
  708. (
  709. SELECT
  710. AVG(salary) avg_sal
  711. FROM
  712. employees
  713. GROUP BY
  714. department_id
  715. ) dept_avg_sal
  716. ) #方式二:
  717. SELECT
  718. department_id
  719. FROM
  720. employees
  721. GROUP BY
  722. department_id
  723. HAVING
  724. AVG(salary) <= ALL (
  725. SELECT
  726. AVG(salary) avg_sal
  727. FROM
  728. employees
  729. GROUP BY
  730. department_id
  731. ) #3.3 空值问题 解决
  732. SELECT
  733. last_name
  734. FROM
  735. employees
  736. WHERE
  737. employee_id NOT IN (
  738. SELECT
  739. manager_id
  740. FROM
  741. employees
  742. WHERE
  743. manager_id IS NOT NULL
  744. );
  745. #4. 相关子查询
  746. /*
  747. 如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件
  748. 关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询 。
  749. */
  750. #题目:查询员工中工资大于本部门平均工资的员工的last_name,salary和其department_id
  751. #方式一:
  752. SELECT
  753. last_name,
  754. salary,
  755. department_id
  756. FROM
  757. employees e1
  758. WHERE
  759. salary > (
  760. SELECT
  761. AVG(salary)
  762. FROM
  763. employees e2
  764. WHERE
  765. department_id = e1.`department_id`
  766. );
  767. #方式二:(在from中声明子查询)
  768. SELECT
  769. e1.last_name,
  770. e1.salary,
  771. e1.department_id
  772. FROM
  773. employees e1,
  774. (
  775. SELECT
  776. department_id,
  777. AVG(salary) dept_avg_sal
  778. FROM
  779. employees
  780. GROUP BY
  781. department_id
  782. ) e2
  783. WHERE
  784. e1.`department_id` = e2.department_id
  785. AND e1.`salary` > e2.dept_avg_sal;
  786. #在ORDER BY 中使用子查询:
  787. #题目:查询员工的id,salary,按照department_name 排序
  788. SELECT
  789. employee_id,
  790. salary
  791. FROM
  792. employees e
  793. ORDER BY
  794. (
  795. SELECT
  796. department_name
  797. FROM
  798. departments d
  799. WHERE
  800. e.`department_id` = d.`department_id`
  801. );
  802. #结论:在 SELECT中,出除了 GROUP BY和 LIMIT之外,其他位置都可以声明子查询
  803. #题目:若employees表中employee_id与job_history表中employee_id相同的数目不小于2,输出这些相同
  804. #id的员工的employee_id,last_name和其job_id
  805. SELECT
  806. e.employee_id,
  807. last_name,
  808. e.job_id
  809. FROM
  810. employees e
  811. WHERE
  812. 2 <= (
  813. SELECT
  814. COUNT(*)
  815. FROM
  816. job_history
  817. WHERE
  818. employee_id = e.employee_id
  819. );
  820. #4.3 EXISTS 与 NOT EXISTS关键字
  821. #题目:查询公司管理者的employee_id,last_name,job_id,department_id信息
  822. #方式一:
  823. SELECT
  824. employee_id,
  825. last_name,
  826. job_id,
  827. department_id
  828. FROM
  829. employees e1
  830. WHERE
  831. EXISTS (
  832. SELECT
  833. *
  834. FROM
  835. employees e2
  836. WHERE
  837. e2.manager_id = e1.employee_id
  838. );
  839. #方式二:(自连接)
  840. SELECT DISTINCT
  841. e1.employee_id,
  842. e1.last_name,
  843. e1.job_id,
  844. e1.department_id
  845. FROM
  846. employees e1
  847. JOIN employees e2
  848. WHERE
  849. e1.employee_id = e2.manager_id;
  850. #方式三:(子查询)
  851. SELECT
  852. employee_id,
  853. last_name,
  854. job_id,
  855. department_id
  856. FROM
  857. employees
  858. WHERE
  859. employee_id IN (
  860. SELECT DISTINCT
  861. manager_id
  862. FROM
  863. employees
  864. );
  865. #题目:查询departments表中,不存在于employees表中的部门的department_id和department_name
  866. #方式一:
  867. SELECT
  868. d.department_id,
  869. d.department_name
  870. FROM
  871. employees e
  872. RIGHT JOIN departments d ON e.`department_id` = d.`department_id`
  873. WHERE
  874. e.`department_id` IS NULL;
  875. #方式二:
  876. SELECT
  877. department_id,
  878. department_name
  879. FROM
  880. departments d
  881. WHERE
  882. NOT EXISTS (
  883. SELECT
  884. 'X'
  885. FROM
  886. employees e
  887. WHERE
  888. d.department_id = e.department_id
  889. );
  890. #4.4 相关更新
  891. UPDATE table1 alias1
  892. SET COLUMN = (
  893. SELECT
  894. expression
  895. FROM
  896. table2 alias2
  897. WHERE
  898. alias1. COLUMN = alias2. COLUMN
  899. );
  900. #题目:在employees中增加一个department_name字段,数据为员工对应的部门名称
  901. # 1)
  902. ALTER TABLE employees ADD (
  903. department_name VARCHAR2 (14)
  904. );
  905. # 2)
  906. UPDATE employees e
  907. SET department_name = (
  908. SELECT
  909. department_name
  910. FROM
  911. departments d
  912. WHERE
  913. e.department_id = d.department_id
  914. );
  915. #4.4 相关删除
  916. DELETE
  917. FROM
  918. table1 alias1
  919. WHERE
  920. COLUMN operator (
  921. SELECT
  922. expression
  923. FROM
  924. table2 alias2
  925. WHERE
  926. alias1. COLUMN = alias2. COLUMN
  927. );
  928. #题目:删除表employees中,其与emp_history表皆有的数据
  929. DELETE
  930. FROM
  931. employees e
  932. WHERE
  933. employee_id IN (
  934. SELECT
  935. employee_id
  936. FROM
  937. emp_history
  938. WHERE
  939. employee_id = e.employee_id
  940. );
  941. #问题:谁的工资比Abel的高?
  942. #方式1:自连接
  943. SELECT
  944. e2.last_name,
  945. e2.salary
  946. FROM
  947. employees e1,
  948. employees e2
  949. WHERE
  950. e1.last_name = 'Abel'
  951. AND e1.`salary` < e2.`salary` #方式2:子查询
  952. SELECT
  953. last_name,
  954. salary
  955. FROM
  956. employees
  957. WHERE
  958. salary > (
  959. SELECT
  960. salary
  961. FROM
  962. employees
  963. WHERE
  964. last_name = 'Abel'
  965. );
  966. #DDL数据定义语言:CREATE \ALTER\ DROP \RENAME \TRUNCATE
  967. #1. 创建和管理数据库
  968. #如何创建数据库?
  969. #方式一:
  970. CREATE DATABASE dbtest;
  971. #创建此数据库使用的是默认的字符集utf8mb4
  972. SHOW DATABASES;
  973. #方式二:CREATE DATABASE 数据库名 CHARACTER SET 字符集;
  974. # 显式了指明了要哦创建的数据库的字符集
  975. CREATE DATABASE dbtest CHARACTER
  976. SET 'gbk';
  977. #方式三::判断数据库是否已经存在,不存在则创建数据库( 推荐 )
  978. #如果已经存在,则创建不成功,但是不会报错。
  979. #CREATE DATABASE IF NOT EXISTS 数据库名;
  980. CREATE DATABASE
  981. IF NOT EXISTS dbtest CHARACTER
  982. SET 'utf8';
  983. #1-2管理数据库
  984. #查看当前连接中的数据库都有哪些
  985. SHOW DATABASES;
  986. #2.2 使用数据库
  987. #切换数据库
  988. USE dbtest;
  989. #查看当前数据库中都有哪些数据表
  990. SHOW TABLES;
  991. #查看当前使用的数据库
  992. SELECT
  993. DATABASE ()
  994. FROM
  995. DUAL;
  996. #查看指定数据库下保存的数据表
  997. SHOW TABLES
  998. FROM
  999. dbtest;
  1000. #2.3修改数据库
  1001. #更改数据库字符集
  1002. #ALTER DATABASE 数据库名 CHARACTER SET 字符集; #比如:gbk、utf8等
  1003. SHOW CREATE DATABASE dbtest;
  1004. #CREATE DATABASE `dbtest` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */
  1005. ALTER DATABASE dbtest CHARACTER
  1006. SET 'gbk';
  1007. SHOW CREATE DATABASE dbtest;
  1008. #CREATE DATABASE `dbtest` /*!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION='N' */
  1009. #1.4删除数据库
  1010. #方式一:
  1011. DROP DATABASE dbtext01;
  1012. #方式二:
  1013. DROP DATABASE
  1014. IF EXISTS dbtext01;
  1015. #3. 创建表
  1016. USE dbtest;
  1017. SHOW CREATE DATABASE dbtest;
  1018. #CREATE DATABASE `dbtest` /*!40100 DEFAULT CHARACTER SET gbk */ /*!80016 DEFAULT ENCRYPTION='N' */
  1019. ALTER DATABASE dbtest CHARACTER
  1020. SET 'utf8';
  1021. SHOW TABLES;
  1022. #方式一:
  1023. CREATE TABLE
  1024. IF NOT EXISTS myempl (
  1025. id INT,
  1026. emp_name VARCHAR (15),
  1027. hire_date DATE
  1028. );
  1029. #查看表结构
  1030. DESC myempl;
  1031. #或者
  1032. #查看创建表的语句结构
  1033. SHOW CREATE TABLE myempl;
  1034. SELECT
  1035. *
  1036. FROM
  1037. myempl;
  1038. #方式二:基于现有的表创建,同时导入数据
  1039. CREATE TABLE myemp2 AS SELECT
  1040. *
  1041. FROM
  1042. employees;
  1043. DESC myemp2;
  1044. SELECT
  1045. *
  1046. FROM
  1047. myemp2;
  1048. #练习一:创建一表 employees_copy,实现对 employees表的复制,包括表的数据
  1049. CREATE TABLE employees_copy AS SELECT
  1050. *
  1051. FROM
  1052. employees;
  1053. SELECT
  1054. *
  1055. FROM
  1056. employees_copy;
  1057. #练习一:创建一表 employees_blank,实现对 employees表的复制,不包括表的数据
  1058. CREATE TABLE employees_blank AS SELECT
  1059. *
  1060. FROM
  1061. employees
  1062. WHERE
  1063. 1 = 2;
  1064. SELECT
  1065. *
  1066. FROM
  1067. employees_blank;
  1068. #3-修改表-----ALTER TABLE
  1069. DESC myemp2;
  1070. #3-1添加一个字段
  1071. #ALTER TABLE 表名 ADD 【COLUMN】 字段名 字段类型 【FIRST|AFTER 字段名】;
  1072. // 把age放在name后面,
  1073. 如果放第一个用 FIRST ALTER TABLE myemp2 ADD age INT AFTER NAME;
  1074. DESC myemp2;
  1075. #3-2修改一个字段:数据类型-长度-默认值(略)
  1076. #ALTER TABLE 表名 MODIFY 【COLUMN】 字段名1 字段类型 【DEFAULT 默认值】【FIRST|AFTER 字段名2】;
  1077. ALTER TABLE myemp2 MODIFY NAME VARCHAR (25);
  1078. ALTER TABLE myemp2 MODIFY NAME VARCHAR (25) DEFAULT 'ddd';
  1079. DESC myemp2;
  1080. #3-3重命名一个字段
  1081. #ALTER TABLE 表名 CHANGE 【column】 列名 新列名 新数据类型;
  1082. ALTER TABLE myemp2 CHANGE NAME emp_name VARCHAR (20);
  1083. DESC myemp2;
  1084. #3-4删除一个字段
  1085. #ALTER TABLE 表名 DROP 【COLUMN】字段名
  1086. ALTER TABLE myemp2 DROP COLUMN age;
  1087. DESC myemp2;
  1088. #4-重命名表
  1089. #方式一:使用RENAME
  1090. #RENAME TABLE emp
  1091. #TO myemp;
  1092. RENAME TABLE myempl TO myemp11;
  1093. DESC myemp11;
  1094. #5-删除表---DROP TABLE 语句不能回滚
  1095. #DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];
  1096. DROP TABLE
  1097. IF EXISTS myemp11;
  1098. DESC myemp11;
  1099. #6-清空表--表结构还在,数据没了
  1100. #TRUNCATE TABLE detail_dept;
  1101. SELECT
  1102. *
  1103. FROM
  1104. myemp2;
  1105. TRUNCATE TABLE myemp2;
  1106. SELECT
  1107. *
  1108. FROM
  1109. myemp2;
  1110. DESC myemp2;

发表评论

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

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

相关阅读