一. MySQL基础语法 (3)

库和表的删除与创建操作时可以加 IF EXISTS/IF NOT EXISTS防止报错

-- 库的管理 # 1.库的创建 /* 语法: create database 【if not exists】库名; */ # 案例:创建一个books库 CREATE DATABASE books; # 2.库的修改 # 案例:更改库的字符集 ALTER DATABASE books CHARACTER SET gbk; # 3.库的删除 DROP DATABASE IF EXISTS books; -- 表的管理 # 1.表的创建√ /* 语法: create table 表名( 列名 列的类型【(长度) 约束】, 列名 列的类型【(长度) 约束】, ... 列名 列的类型【(长度) 约束】 ); */ # 案例:创建表book CREATE TABLE book( id INT, bName VARCHAR(20), price DOUBLE, authorId INT, publishDate DATETIME ); DESC book; DESC book_author; # 2.表的修改 /* 表的常见修改: ① 修改列名 ② 修改列的类型或约束 ③ 添加列 ④ 删除列 ⑤ 修改表名 核心语法: alter table 表名 add|drop|modify|change column 列名 【列类型 约束】; */ # 案例1:修改列名 ALTER TABLE book CHANGE COLUMN publishDate pubDate DATETIME; # 案例2:修改列的类型或约束 ALTER TABLE book MODIFY COLUMN pubdate TIMESTAMP; # 案例3:添加列(可以通过first|after 字段名 指定添加列的位置) ALTER TABLE author ADD COLUMN annual DOUBLE; ALTER TABLE author ADD COLUMN hobby DOUBLE FIRST; ALTER TABLE author ADD COLUMN interest DOUBLE AFTER annual; # 案例4:删除列 ALTER TABLE author DROP COLUMN annual; # 案例5:修改表名 ALTER TABLE author RENAME TO book_author; # 3.表的删除 DROP TABLE IF EXISTS book_author; # 4.表的复制(补充) INSERT INTO book_author VALUES (1,'书上村树','日本'), (2,'莫言','中国'), (3,'金庸','中国'); # 情况1:仅复制表的结构 CREATE TABLE copy LIKE book_author; # 情况2:复制表的结构与(部分)数据 CREATE TABLE copy3 SELECT * FROM book_author WHERE nation='中国'; #情况3:仅复制某些字段 CREATE TABLE copy4 SELECT id,au_name FROM book_author WHERE 0; 4.2 数据类型 -- 常见的数据类型 /* 数值型: 整型 小数: 定点数 浮点数 字符型: 较短的文本:char,varchar 较长的文本:text,blob(较长的二进制数据) 日期型: */ # 一.整型 /* 分类: tinyint(1byte),smallint(2byte),mediumint(3byte) int/integer(4byte),bigint(8byte) 特点: ① 如果不设置符号,默认是有符号。如果要设置无符号, 需要添加unsigned关键字 ② 如果插入的数值超出了整型的范围,会报out of range异常, 并且插入的是临界值 ③ 如果不设置长度,则会有默认长度 ④ 长度代表显示的做大宽度,如果不够会用0在左边填充,但 必须搭配zerofill关键字使用 */ # 1.如何设置无符号和有符号 CREATE TABLE tab_int( t1 INT, #默认有符号 t2 INT UNSIGNED #设置无符号 ); # 二.小数 /* 分类: 1.浮点型 float(M,D) double(M,D) 2.定点型 dec(M,D)/decimal(M,D) 特点: ① M代表整数部位+小数部位的长度,D代表小数部位的长度。 ② M和D都可以省略,如果是decimalm,则M默认为10,D默认为0 如果是float和double,则会根据插入的数值的精度决定精度 ③ 定点型的精度较高,如果要求插入数值的精度较高如货币运算 等则考虑使用定点型 */ # 案例:测试M和D的用处 CREATE TABLE tab_float( f1 FLOAT(5,2) f2 DOUBLE(5,2) f3 DECIMAL(5,2) ); INSERT INTO tab_float VALUES(123.45,123.45,123.45); # 三.字符型 /* 分类: 较短的文本: √ char(M),varchar(M), binary,varbinary =>保存较短的二进制 Enum =>格式:ENUM('a','b','c'...) Set =>和Enum差不多,但是一次可以选多个值 较长的文本: text blob => 保存较长的二进制 特点: ① M代表最大的字符数,char可以省略M,默认为1. varchar不可以省略M ② char代表固定长度的字符,varchar代表可变长度的字符 char效率更高,varchar更节省空间 */ # 四.日期型 /* 分类: √ datetime:8byte 保存日期+时间 √ timestamp:4byte 保存日期+时间(时间戳) date:4byte 只保存日期 time:3byte 只保存时间 year:1byte 只保存年 特点: 范围 是否受时区影响 datetime 1000-9999 不受 timestamp 1970-2038 受 */ CREATE TABLE tab_date( t1 DATETIME, t2 TIMESTAMP ); INSERT INTO tab_date VALUE(NOW(),NOW()); SELECT * FROM tab_date; 4.3 约束 /* 1.含义: 一种限制,用于限制表中的数据,为了保证表中数据的 准确和可靠性 2.分类:六大约束 NOT NULL:非空,用于保证该字段的值不能为空, 比如姓名,学号等。 DEFAULT:默认,用于保证该字段有默认值, 比如性别。 PRIMARY KEY:主键,用于保证该字段的值具有唯一性且非空, 比如学号,员工编号等。一个表中至多有一个主键 UNIQUE:唯一,用于保证该字段的值具有唯一性且可以为空 比如座位号。注意:只能有一个为空 CHECK:检查约束【MySQL中不支持但不报错】,比如年龄,性 别可以用CHECK限制 FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段 的值必须来自于主表的关联列的值。在从表添加外键约 束,用于引用主表中某列的值,比如学生表的专业编号 3.添加约束的时机: ① 创建表时 ② 修改表时 4.约束的添加分类: 列级约束: 六大约束语法上都支持,但外键约束没有效果。 表级约束: 除了非空not null和默认default,其他都支持。 5.主键约束和唯一约束的对比: 保证唯一性 是否允许为空 一个表中可以有几个 是否允许组合 主键 √ × 至多1个 √,但不推荐(稳定性) 唯一 √ √ 可以有多个 √,但不推荐(稳定性) 6. 外键的特点: ① 要求在从表设置外键关系 ② 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求 ③ 主表的关联列必须是一个key(一般是主键或唯一) ④ 插入数据时,先插入主表的数据,再插入从表。先删除从表,再删除主表 */ -- 一.创建表时添加约束 # 1.添加列级约束 /* 语法: 直接在字段名和类型后追加约束类型即可 只支持:默认,非空,主键,唯一,不支持检查和外键 */ CREATE DATABASE students; USE students; DROP TABLE IF EXISTS major; CREATE TABLE major( id INT PRIMARY KEY, majorName VARCHAR(20) ); CREATE TABLE stuinfo( id INT PRIMARY KEY, stuNmae VARCHAR(20) NOT NULL UNIQUE,#可以加多个约束,空格隔开 gender CHAR(1) CHECK(gender='男' OR gender='女'),#mysql不报错但不支持 seat INT UNIQUE, age INT DEFAULT 18, majorId INT REFERENCES major(id) #外键,列级约束不报错但不支持 ); DESC stuinfo; SHOW INDEX FROM stuinfo;#查看表中所有的索引,包括主键,外键,唯一 # 2.添加表级约束 /* 语法:在各个字段的最下面 【constraint 约束名】 约束类型(字段名) */ DROP TABLE IF EXISTS stuinfo; CREATE TABLE stuinfo( id INT, stuName VARCHAR(20), gender CHAR(1), seat INT, age INT, majorId INT, #MySQL主键起了约束名也没有效果,默认为主键约束的列名 CONSTRAINT pk PRIMARY KEY(id), #CONSTRAINT pk PRIMARY KEY(id,stuName),#主键的组合,两个列都相同才报错 UNIQUE(seat),#不写constraint默认约束名为列名 CONSTRAINT ck CHECK(gender='男' OR gender='女'),#MySQL不支持 #最好给外键起一个约束名,利于修改表时删除约束 CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id) ); # 约束通用写法(表级约束和列级约束一般使用情况) DROP TABLE IF EXISTS stuinfo; CREATE TABLE IF NOT EXISTS stuinfo( id INT PRIMARY KEY,1 stuName VARCHAR(20) NOT NULL, sex CHAR(1), age INT DEFAULT 18, seat INT UNIQUE, majorId INT, CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id) ); -- 二.修改表时添加约束(添加约束时列的类型也要写) /* 特点: ① 添加列级约束 alter table 表名 modify column 字段名 字段类型 新约束; ② 添加表级约束 alter table 表名 add 【constraint 约束名】约束类型(字段名) 【外键的引用】; */ DROP TABLE IF EXISTS stuinfo; CREATE TABLE IF NOT EXISTS stuinfo( id INT, stuName VARCHAR(20), sex CHAR(1), age INT, seat INT, majorId INT ); DESC stuinfo; # 1.添加非空约束 ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NOT NULL; # 2.添加默认约束 ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18; # 3.添加主键 ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY; ALTER TABLE stuinfo ADD PRIMARY KEY(id);#表级约束的写法 # 4.添加唯一键 ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE; ALTER TABLE stuinfo ADD UNIQUE(seat);#表级约束的写法 # 5.添加外键 ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorId) REFERENCES major(id); -- 三.修改表时删除约束 # 1.删除非空约束 ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NULL; # 2.删除默认约束 ALTER TABLE stuinfo MODIFY COLUMN age INT; # 3.删除主键 ALTER TABLE stuinfo DROP PRIMARY KEY;#方式一 ALTER TABLE stuinfo MODIFY COLUMN id INT;#方式二 # 4.删除唯一键 ALTER TABLE stuinfo DROP INDEX seat; # 5.删除外键 ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major; SHOW INDEX FROM stuinfo; 4.4 标识列 /* 含义: 标识列又称为自增长列,可以不用手动的插入值,系统提供 默认的序列值 特点: ① 标识列必须和一个key搭配 ② 一个表中最多只有一个标识列 ③ 标识列类型只能是数值型 ④ 标识列可以通过set auto_increment_increment=3;设置 步长,也可以通过手动插入值设置起始值 */ -- 创建表时设置标识列 DROP TABLE IF EXISTS tab_identity; CREATE TABLE tab_identity( id INT PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(20) ); INSERT INTO tab_identity(id,`name`) VALUES(NULL,'john'); INSERT INTO tab_identity(`name`) VALUES('john');#二者效果一样 SELECT * FROM tab_identity; #set auto_increment_increment=3;#设置自增长步长,不常用 -- 修改表时设置标识列 DROP TABLE IF EXISTS tab_identity; CREATE TABLE tab_identity( id INT, `name` VARCHAR(20), seat INT ); ALTER TABLE tab_identity MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT; -- 修改表时删除标识列 ALTER TABLE tab_identity MODIFY COLUMN id INT; 5. TCL语言(事务控制) 5.1 事务概念

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpggfx.html