是记录,我不会记录的特别详细
第10章 创建和管理表
标识符命名规则
- 数据库名、表名不得超过
30个字符,变量名限制为29个 - 只能包含 A--Z, a--z, 0--9, _共63个字符
 - 数据库名、表名、字段名等对象名中间不要包含空格
 - 同一个MySQL软件中,数据库不能同名;同一个库中,表不能重名;同一个表中,字段不能重名
必须保证你的字段没有和保留字、数据库系统或常用方法冲突。如果坚持使用,请在SQL语句中使
用`(着重号)引起来 - 保持字段名和类型的一致性:在命名字段并为其指定数据类型的时候一定要保证一致性,假如数据
类型在一个表里是整数,那在另一个表里可就别变成字符型了 
数据类型
| 类型 | 类型举例 | 
|---|---|
| 整数类型 | TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT | 
| 浮点类型 | FLOAT,DOUBLE | 
| 定点数类型 | DECIMAL | 
| 位类型 | BIT | 
| 日期时间类型 | YEAR、TIME、DATE、DATETIME、TIMESTAMP | 
| 文本字符串类型 | CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT | 
| 枚举类型 | ENUM | 
| 集合类型 | SET | 
| 二进制字符串类型 | BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB | 
| JSON类型 | JSON对象、JSON数组 | 
| 空间数据类型 | 单值:GEOMETRY、POINT、LINESTRING、POLYGON; | 
| 空间数据类型 | 集合:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION | 
常用的
| 数据类型 | 描述 | 
|---|---|
| INT | 从-231到231-1的整型数据。存储大小为 4个字节 | 
| CHAR(size) | 定长字符数据。若未指定,默认为1个字符,最大长度255 | 
| VARCHAR(size) | 可变长字符数据,根据字符串实际长度保存,必须指定长度 | 
| FLOAT(M,D) | 单精度,占用4个字节,M=整数位+小数位,D=小数位。 D<=M<=255,0<=D<=30,默认M+D<=6 | 
| DOUBLE(M,D) | 双精度,占用8个字节,D<=M<=255,0<=D<=30,默认M+D<=15 | 
| DECIMAL(M,D) | 高精度小数,占用M+2个字节,D<=M<=65,0<=D<=30,最大取值范围与DOUBLE相同。 | 
| DATE | 日期型数据,格式'YYYY-MM-DD' | 
| BLOB | 二进制形式的长文本数据,最大可达4G | 
| TEXT | 长文本数据,最大可达4G | 
创建和管理数据库
创建数据库
            
            
              sql
              
              
            
          
          //方式1:创建数据库
CREATE DATABASE 数据库名;
//方式2:创建数据库并指定字符集合
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
//方式3:判断数据库是否已经存在,不存在则创建数据库
CREATE DATABASE IF NOT EXISTS 数据库名;
        tips:数据库不能改名,一些工具可以改名,它是先建库,再复制所有表到新库,删除旧库.
使用数据库
- 查看当前所有数据库
 
            
            
              sql
              
              
            
          
          SHOW DATABASES;
        - 查看当前正在使用的数据库
 
            
            
              sql
              
              
            
          
          SELECT DATABASE();
        - 查看指定库下所有的表
 
            
            
              sql
              
              
            
          
          SHOW TABLES FROM 数据库名;
        - 查看数据库的创建信息
 
            
            
              sql
              
              
            
          
          SHOW CREATE DATABASE 数据库名;
SHOW CREATE DATABASE 数据库名\G;//这种在不使用可视化工具的前提下能好看点
        - 使用/切换数据库
 
            
            
              sql
              
              
            
          
          USE 数据库名;
        修改数据库
- 更改数据库字符集
乱码的时候需要用到这条命令 
            
            
              sql
              
              
            
          
          ALTER DATABASE 数据库名 CHARACTER SET 字符集; //字符集就比如utf8,gbk等等
        删除数据库
            
            
              sql
              
              
            
          
          DROP DATABASE 数据库名;
DROP DATABASE IF EXISTS 数据库名;//存在就删,不存在就不执行操作
        创建表
- 方式1
 
            
            
              sql
              
              
            
          
          CREATE TABLE [IF NOT EXISTS] 表名(
字段1, 数据类型 [约束条件] [默认值],
字段2, 数据类型 [约束条件] [默认值],
字段3, 数据类型 [约束条件] [默认值],
......
[表约束条件]
);
//IF NOT EXISTS:若存在该表那么就不创建,反之就创建
CREATE TABLE emp (
-- int类型
emp_id INT(8) AUTO_INCREMENT primary key,
-- 最多保存20个中英文字符
emp_name VARCHAR(20),
-- 总位数不超过15位
salary DOUBLE,
-- 日期类型
birthday DATE
);
        - 方式2
使用AS subquery选项,将创建表和插入数据结合起来 
            
            
              sql
              
              
            
          
          CREATE TABLE table [(column1,column2,...)] AS subquery;
CREATE TABLE e1 AS SELECT * FROM employees;
CREATE TABLE e2 AS SELECT * FROM employeees WHERE 1=2;//创建的emp2是空表
CREATE TABLE dept1
AS
SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
FROM employees
WHERE department_id = 80;
        查看数据表结构
            
            
              sql
              
              
            
          
          SHOW CREATE TABLE 表名\G
        修改表
这里是指修改表的结构,比如添加/删除/重命名列
添加列
            
            
              sql
              
              
            
          
          ALTER TABLE 表名 ADD [COLUMN] 字段名 字段类型 [FIRST | AFTER 字段名];
        修改列
修改数据类型,长度,默认值和位置
            
            
              sql
              
              
            
          
          ALTER TABLE 表名 MODIFY [COLUMN] 字段名1 字段类型 [DEFAULT 默认值] [FIRST | AFTER 字段名2]
ALTER TABLE dept MODIFY last_name VARCHAR(30);//把last_name列的数据类型改为varchar(30)
ALTER TABLE dept MODIFY salary double(6,2) default 1000;//把salary的默认值改为1000
--重命名列
ALTER TABLE 表名 CHANGE [COLUMN] 列名 新列名 新数据类型;
ALTER TABLE dept CHANGE department_name dept_name varchar(15);//把department_name列改为 dept_name varchar(15)
ALTER TABLE 表名 DROP [COLUMN] 字段名;
ALTER TABLE dept DROP COLUMN job_id;
        重命名表
- RENAME
 
            
            
              sql
              
              
            
          
          RENAME TABLE emp TO emp1;
        - ALTER TABLE
 
            
            
              sql
              
              
            
          
          ALTER TABLE dept RENAME [TO] dept1;
        删除表
            
            
              sql
              
              
            
          
          DROP TABLE [IF EXISTS] 数据表1 [,数据表2,..,数据表n];
        这玩意不能回滚
清空表
删除表中的所有数据,释放表的存储空间
            
            
              sql
              
              
            
          
          TRUNCATE TABLE test;
        不能回滚
扩展
- 阿里巴巴 《Java开发手册》之MySQL字段命名
 
- 表名,字段名必须使用小写字母或数字。
 
如:xiyi_user,xiyi_config,xiyi3_username- 表必备字段:id,gmt_create,gmt_modified
 
id自增,bigint unsigned,gmt_create表示主动式创建,或者过去分词表示被动更新- 表的命名最好遵循"业务名称_表的作用"
 
如admin_config- 库名尽量与应用名称保持一致
 
合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
正例:无符号值可以避免误存负数,且扩大了表示范围。

- 如何理解清空表、删除表等操作需要谨慎?
 
因为MySQL在执行清空表、删除表操作时候不会有任何的确认提示,万一是误删除怎么办?所以在删除之前需要做一个备份
ALTER TABLE同理,表结构是无法撤销的,如果你添加了一个无关紧要的字段那删除了也不碍事,但是如果删除了一个需要的列,那该列的数据全部丢失,数据无价啊!!!
- MySQL8新特性---DDL的原子化
就是DDL操作要么成功要么回滚,并且回滚日志写入到data dictionary数据字典表mysql.innodb_ddl_log(这玩意还是隐藏的,可以通过设置参数,将DDL操作日志打印输出到MySQL错误日志中) 
            
            
              sql
              
              
            
          
          DROP TABLE a,b;//b不存在
        然后a,b两个表都没有删除.
第11章 表数据操作之增删改
这个我不会记录的详细
插入数据
- VALUES的方式添加
 
            
            
              sql
              
              
            
          
          INSERT INTO 表名 [(COLUMN1,COLUMN2,...,COLUMNN)]
	VALUES (VALUE1,VALUE2,...,VALUEN)
	[,(VALUE1,VALUE2,...,VALUEN)];
INSERT INTO 表名
SET 列名 = 值,列名 = 值 ....
        插入多条记录的时候最好选择使用单条INSERT语句的方式插入,如我有一张用户表,username,password,若是大量用户注册会产生如下语句
            
            
              sql
              
              
            
          
          INSERT INTO `User` VALUES('ABC','ABC'),('ABCD','ABCD'),('ABCDE','ABCED');//这样效率高
INSERT INTO `User` VALUES('ABC','ABC');INSERT INSERT INTO `User` VALUES ('ABCD','ABCD');
INSERT INTO `User` VALUES ('ABCDE','ABCED');
        - 将查询结果插入到表中
把表A的查询结果插入到表B中,前提是结果集的列与表B的列保持一致(列名,数据类型相同)
结果集的意思是: 
source表有a,b,c,d,e,f,g列,target表有a,b,c列,现在把source表的a,b,c列插入到target表的a,b,c列
从source表中查出来a,b,c三列就是结果集
            
            
              sql
              
              
            
          
          INSERT INTO target 
SELECT a,b,c
FROM source;
        语法格式
            
            
              sql
              
              
            
          
          INSERT INTO TargetTableName
(tar_column1 [,tar_column2,...,tar_columnn])
SELECT 
(src_column1 [,src_column2,...,src_columnn])
FROM SourceTableName
[WHERE condition];
        
            
            
              sql
              
              
            
          
          INSERT INTO emp3
SELECT *
FROM employees
WHERE department_id = 100;
INSERT INTO emp4(id,name,salary,commission_pct)
SELECT employee_id,last_name,salary,commission_pct
FROM employees
WHERE job_id LIKE '%REP%';
        更新数据
语法
            
            
              sql
              
              
            
          
          UPDATE table_name
SET column1 = value1 [,column2 = value2,...,columnn = valuen ] [WHERE condition];
        这里记录一下更新多表数据
            
            
              sql
              
              
            
          
          //下面的是SQL92语法
UPDATE table1 alias1,table2 alias2 SET COLUMN1 = VALUE1 [,COLUMN2=VALUE2,...,COLUMNN=VALUEN]
WHERE JoinCondition; 
//下面的是SQL99语法
UPDATE table1 alias1 [INNER | LEFT |RIGHT] JOIN table2 alias2 ON JoinCondition SET COLUMN1 = VALUE1 [,COLUMN2=VALUE2,...,COLUMNN=VALUEN];
        删除数据
语法
            
            
              sql
              
              
            
          
          DELETE FROM TableName [WHERE condition];
        删除多表记录
            
            
              sql
              
              
            
          
          //SQL92语法
DELETE Table1_alias,Table2_alias FROM Table1 alias1,Table2 alias2 WHERE JoinCondition;
//SQL99
DELETE Table1_alias,Table2_alias FROM Table1 alias1 [INNER | LEFT | RIGHT] JOIN Table2 alias2 ON JoinCondition;
        MySQL8新特性:计算列
某一列是通过别的列计算得出的
如创建a表,d,e列,f列是由d列+e列得出的
            
            
              sql
              
              
            
          
          CREATE TABLE a(
				id int,
				d,int,
				e,int,
				f int GENERATED ALWAYS AS (d+e) VIRTUAL
				);