是记录,我不会记录的特别详细
第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 | 从-2^31到2^31-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
);