• 数据库——创建和管理表


    目录

    1.1 一条数据存储的过程

     1.2 标识符命名规则

    1.3 MySQL中的数据类型  

    2. 创建和管理数据库  

    2.2 使用数据库

     2.3 修改数据库

    2.4删除数据库 

    3. 创建表  

    3.3 查看数据表结构

    4.2 修改一个列

    4.3 重命名一个列  

    4.4 删除一个列  

    5.-重命名表

    6. 删除表  

    7. 清空表 

    8. 内容拓展 

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


    1.1 一条数据存储的过程

    • 存储数据是处理数据的第一步 。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则,只
      能是一团乱麻,无从下手。
      那么,怎样才能把用户各种经营相关的、纷繁复杂的数据,有序、高效地存储起来呢? 在 MySQL 中,
      一个完整的数据存储过程总共有 4 步,分别是创建数据库、确认字段、创建数据表、插入数据。

    我们要先创建一个数据库,而不是直接创建数据表呢?
    因为从系统架构的层次上看, MySQL 数据库系统从大到小依次是 数据库服务器 数据库 数据表 、数
    据表的 行与列

     1.2 标识符命名规则

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

    1.3 MySQL中的数据类型  

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

    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 字符集; #比如:gbkutf8 

    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;

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

     

    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;

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

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

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

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

    1. CREATE TABLE emp1 AS SELECT * FROM employees;
    2. CREATE TABLE emp2 AS SELECT * FROM employees WHERE 1=2; -- 创建的emp2是空表
    3. CREATE TABLE dept80
    4. AS
    5. SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
    6. FROM employees
    7. WHERE department_id = 80;
    8. DESCRIBE dept80;

     

    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表:

      

    练习一:

    练习二:

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

    使用 ALTER TABLE 语句可以实现:

    >>>向已有的表中添加列
    >>>>修改现有表中的列
    >>>>>删除现有表中的列
    >>>>>>>重命名现有表中的列

    4.1 追加一个列  

    语法格式如下:

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

    •  举例:
    ALTER TABLE dept80
    ADD job_id varchar ( 15 );

    练习:

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

     

     #查看myemp2表结构:

    DESC myemp2;

    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;

     

    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;

     

    4.4 删除一个列  

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

    ALTER TABLE 表名 DROP COLUMN】字段名  

    • 举例: 
    ALTER TABLE dept80
    DROP COLUMN job_id;
    1. #3-4删除一个字段
    2. #ALTER TABLE 表名 DROPCOLUMN】字段名
    3. ALTER TABLE myemp2
    4. DROP COLUMN age;
    5. DESC myemp2;

    5.-重命名表

    • 方式一:使用RENAME  
    RENAME TABLE emp
    TO myemp;
    • 方式二: 
    ALTER table dept
    RENAME [ TO ] detail_dept; -- [TO] 可以省略
    •  必须是对象的拥有者
    1. #4-重命名表
    2. #方式一:使用RENAME
    3. #RENAME TABLE emp
    4. #TO myemp;
    5. RENAME TABLE myempl
    6. To myemp11;
    7. DESC myemp11;

    6. 删除表  

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

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

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

    DROP TABLE dept80;  

    • DROP TABLE 语句不能回滚  
    1. #5-删除表---DROP TABLE 语句不能回滚(不能撤销,删除了就没了)
    2. #DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];
    3. DROP TABLE IF EXISTS myemp11;
    4. DESC myemp11;

     

    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;

     原来表:

    执行清空操作:

    TRUNCATE TABLE myemp2;

    清空后:

    1. SELECT *
    2. FROM myemp2;

     

    表结构还在:

     

    8. 内容拓展 

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

    表删除 操作将把表的定义和表中的数据一起删除,并且 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'

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

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

    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;加11个月
    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 #结论1select中出现的非组函数的字段必须声明在group BY
    310. #反之,group BY中声明的字段可以不出现在select中。
    311. #结论2GROUP 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为10011002,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. # 当过滤条件中没有聚合函数时,则此过滤条件声明在WHEREHAVING中都可以。但是,建议声明在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_id,manager_id,department_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 EXISTSNOT 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 表名 ADDCOLUMN】 字段名 字段类型 【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 表名 DROPCOLUMN】字段名
    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;

  • 相关阅读:
    Bootstrap5 网格系统
    01-为什么 switch case 语句需要加入 break
    软件测试——自动化测试框架有哪些?
    【Java面试小短文】HashMap是如何解决Hash冲突的?
    java多线程面试题目
    语义召回进阶之路:从传统到深度学习的搜索革新
    Java配置47-Spring Eureka 未授权访问漏洞修复
    LabVIEW项目中实时目标出现黄色感叹号
    黑马JVM总结(六)
    Android Studio(列表视图ListView)
  • 原文地址:https://blog.csdn.net/m0_63064861/article/details/127458581