From 297ecb7e6a064157c9b49f105b33e68a210fa35f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=96=E5=BF=83=E5=A6=8D?= <2392642810@qq.com> Date: Sun, 19 Feb 2023 21:57:01 +0800 Subject: [PATCH 1/3] 2.16MySQL --- ...45\350\247\204\350\214\203\347\255\211.md" | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 "03\350\265\226\345\277\203\345\246\215/2.16 \350\257\255\345\217\245\350\247\204\350\214\203\347\255\211.md" diff --git "a/03\350\265\226\345\277\203\345\246\215/2.16 \350\257\255\345\217\245\350\247\204\350\214\203\347\255\211.md" "b/03\350\265\226\345\277\203\345\246\215/2.16 \350\257\255\345\217\245\350\247\204\350\214\203\347\255\211.md" new file mode 100644 index 0000000..9ece599 --- /dev/null +++ "b/03\350\265\226\345\277\203\345\246\215/2.16 \350\257\255\345\217\245\350\247\204\350\214\203\347\255\211.md" @@ -0,0 +1,87 @@ +# 2.16 MySQL + +### 语法规范 + +- 不区分大小写(建议小写) +- 命名:英文+下划线/数字 +- 不要使用关键字 可以使用`` +- 不能重名 + +### 注释 + +- \-- +- /* ... */ 多行 + +### 标点符号 + +- 成对的 ‘ ’ “ ” ( ) +- 英文状态 +- 特殊符号 + +1. ( ) 创建表函数等 +2. “ ” 字符串和日期类型 +3. “ ” 列的别名 +4. “ ” 大多等于 ’ ‘ + + + +## 数据类型 + +### 整数和小数 + +- 整数: + + int (0-255) m需要配合使用,如zerofill + +- 小数: + + float 单精度 + + double 双精度 + + decimal 定点数 默认(10,0) 122.55——123 + +### 字符串 + + char 固定长度 + + varchar(m) 可变长度 以实际填写的为准 + +### 日期 + + year 年 2023 + + date 日期 2023-02-16 + + time 时间 11:20:25 + + datetime 日期时间 2023+02-16 11:20:25 + +### enum和set + +- enum 单选 枚举型 只能选一个且不能不选 可以使用下标定位 +- set 多选 集合型 可以不选 下标2次方定位 + + + +## 练习 + +```mysql +-- 创建库taobao +CREATE DATABASE taobao; +USE taobao; + +-- 创建表computer +-- 表里存放: +-- 编号,显示宽度5位,不足的补0 +-- 电脑品牌,定长10 +-- 型号,可变长10 +-- 价格:整数部分限长6,小数2位 +CREATE TABLE computer( + bianhao int(5) ZEROFILL, + pinpai CHAR(10), + xinghao VARCHAR(10), + jiage DOUBLE(8,2) +); +``` + -- Gitee From 3b72aea26867f2f13b5fbd200bb9428120b02747 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=96=E5=BF=83=E5=A6=8D?= <2392642810@qq.com> Date: Sun, 19 Feb 2023 22:01:12 +0800 Subject: [PATCH 2/3] 2.17MySQL --- .../2.17 MySQL\350\257\255\345\217\245.md" | 624 ++++++++++++++++++ 1 file changed, 624 insertions(+) create mode 100644 "03\350\265\226\345\277\203\345\246\215/2.17 MySQL\350\257\255\345\217\245.md" diff --git "a/03\350\265\226\345\277\203\345\246\215/2.17 MySQL\350\257\255\345\217\245.md" "b/03\350\265\226\345\277\203\345\246\215/2.17 MySQL\350\257\255\345\217\245.md" new file mode 100644 index 0000000..8584ca5 --- /dev/null +++ "b/03\350\265\226\345\277\203\345\246\215/2.17 MySQL\350\257\255\345\217\245.md" @@ -0,0 +1,624 @@ +# MySQL语句 + +## 数据库 + +#### 创建数据库 + +```mysql +create database 数据库名 ; +create database 数据库名 charset 字符集; +``` + +#### 查看所有的数据库 + +```mysql +show databases; #有一个s,代表多个数据库 +``` + +#### 查看某个数据库的详细定义语句 + +```mysql +show create database 数据库名; +``` + +#### 修改数据库编码 + +```mysql +#修改数据库字符集和校对规则 +ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称 COLLATE 字符集对应校对规则; +``` + +```mysql +ALTER DATABASE mxdx_chapter3_two CHARACTER SET utf8 COLLATE utf8_general_ci; +``` + +==**注意,**==修改数据库编码只会影响之后创建的表的默认编码,之前创建的表不会受影响。 + +#### 删除数据库 + +```mysql +drop database 数据库名; +``` + +#### 使用数据库 + +```mysql +use 数据库名; +``` + + + +## 数据表 + +#### 查看某个数据库的所有表格 + +```mysql +use 数据库名; +show tables; +``` + +```mysql +show tables from 数据库名; +``` + +#### 创建表格 + +```mysql +create table 数据表名称( + 字段名 数据类型, + 字段名 数据类型 + ... +); + +示例: +create table teacher( + tid int, + tname varchar(5), + salary double, + weight double(5,2), + birthday date, + gender enum('男','女'), + blood enum('A','B','AB','O'), + tel char(11) +); +``` + +#### 查看表的详细定义信息,即查看建表语句 + +```mysql +show create table 表名称; +``` + +#### 修改数据表编码 + +```mysql +alter table 表名称 convert to character set utf8; +``` + +#### 查看表结构 + +```mysql +desc 表名称; +``` + +#### 删除表格,包括表结构和里面的数据 + +```mysql +drop table 表名称; +``` + +#### 修改表结构:删除字段 + +```mysql +alter table 表名称 drop 【column】 字段名称; +``` + +```mysql +alter table teacher drop column weight; +``` + +#### 修改表结构:增加字段 + +```mysql +alter table 表名称 add 【column】 字段名称 数据类型; +alter table 表名称 add 【column】 字段名称 数据类型 first; +alter table 表名称 add 【column】 字段名称 数据类型 after 另一个字段; + +示例: +alter table teacher add weight double(5,2); +alter table teacher drop column weight; + +alter table teacher add weight double(5,2) first; +alter table teacher drop column weight; + +alter table teacher add weight double(5,2) after salary; +alter table teacher drop column weight; +``` + +#### 修改表结构:修改字段的数据类型 + +```mysql +alter table 表名称 modify 字段名称 新的数据类型; +``` + +#### 修改表结构:修改字段的名称 + +```mysql +alter table 表名称 change 旧字段名称 新的字段名称 新的数据类型; +``` + +#### 修改表结构:修改字段位置 + +```mysql +alter table 表名称 modify 字段名称 数据类型 first; +alter table 表名称 modify 字段名称 数据类型 after 另一个字段; +``` + +#### 修改表名称(重命名表) + +```mysql +alter table 旧表名 rename 【to】 新表名; +rename table 旧表名称 to 新表名称; + +示例: +alter table teacher rename to t_tea; +rename table t_tea to teacher; +``` + + + +## 添加语句 + +#### (1)添加一条记录到某个表中 + +```mysql +insert into 表名称 values(值列表); #值列表中的值的顺序、类型、个数必须与表结构一一对应 +``` + +```mysql +insert into teacher values(1,'张三',15000,120.5,'1990-5-1','男','O','13789586859'); +``` + +#### (2)添加一条记录到某个表中 + +```mysql +insert into 表名称 (字段列表) values(值列表); #值列表中的值的顺序、类型、个数必须与(字段列表)一一对应 +``` + +```mysql +insert into teacher(tid,tname,salary,phone) values(3,'王五',16000,'15789546586'); +``` + +#### (3)添加多条记录到某个表中 + +```mysql +insert into 表名称 values(值列表),(值列表),(值列表); #值列表中的值的顺序、类型、个数必须与表结构一一对应 +``` + +```mysql +insert into 表名称 (字段列表) values(值列表),(值列表),(值列表); #值列表中的值的顺序、类型、个数必须与(字段列表)一一对应 +``` + +```mysql +insert into teacher (tid,tname,salary,phone) +values(4,'赵六',16000,'15789546586'), +(5,'汪飞',18000,'15789548886'), +(6,'天琪',19000,'15909546586'); +``` + + + +## 修改语句 + +#### 修改所有行 + +```mysql +update 表名称 set 字段名 = 值, 字段名 = 值; #给所有行修改 +``` + +```mysql +#修改所有人的薪资,都涨了1000 +update teacher set salary = salary + 1000 ; +``` + +#### 修改部分行 + +```mysql +update 表名称 set 字段名 = 值, 字段名 = 值 where 条件; #给满足条件的行修改 +``` + +```mysql +#修改天琪的薪资降低5000 +update teacher set salary = salary-5000 where tname = '天琪'; +``` + + + +## 删除 + +#### 删除部分行的数据 + +```mysql +delete from 表名称 where 条件; +``` + +```mysql +delete from teacher where tname = '天琪'; +``` + +#### 删除整张表的数据,但表结构留下 + +```mysql +delete from 表名称; +``` + +```mysql +delete from teacher; +``` + +#### 截断表,清空表中的数据,只留有表结构 + +```mysql +truncate 表名称; +``` + +```mysql +truncate teacher; +``` + +truncate表和delete表的区别: + +delete是一条一条删除记录的。如果在事务中,事务提交之前支持回滚。(后面会讲事务) + +truncate是把整个表drop,新建一张,效率更高。就算在事务中,也无法回滚。 + +```mysql +#同学问:是否可以删除salary字段的值,字段留着,值删掉 +#可以实现,但是不是用delete,用update + +#同学问:是否可以删除salary字段,连同字段和这个字段的数据都是删除 +#可以实现,但是不是用delete,用alter table 表名称 drop column 字段名; + +#同学问:只删除某个单元格的值 +#可以实现,但是不是用delete,用update +``` + + + +# 作业 + +## 第1题 + +1、创建数据库test01_market + +```mysql +CREATE DATABASE IF NOT EXISTS test01_market; +USE test01_market; +``` + +2、创建表格customers + +| 字段名 | 数据类型 | +| --------- | ----------- | +| c_num | int(11) | +| c_name | varchar(50) | +| c_contact | varchar(50) | +| c_city | varchar(50) | +| c_birth | date | + +```mysql +CREATE TABLE customers( + c_num INT(11), + c_name VARCHAR(50), + c_contact VARCHAR(50), + c_city VARCHAR(50), + c_birth DATE +); +``` + +**要求3:**将c_contact字段移动到c_birth字段后面 + +```mysql +ALTER TABLE customers MODIFY c_contact VARCHAR(50) AFTER c_birth; +``` + +**要求4:**将c_name字段数据类型改为 varchar(70) + +```mysql +ALTER TABLE customers MODIFY c_name VARCHAR(70); +``` + +**要求5:**将c_contact字段改名为c_phone + +```mysql +ALTER TABLE customers CHANGE c_contact c_phone VARCHAR(50); +``` + +**要求6:**增加c_gender字段到c_name后面,数据类型为char(1) + +```mysql +ALTER TABLE customers ADD c_gender CHAR AFTER c_name; +``` + +**要求7:**将表名改为customers_info + +```mysql +ALTER TABLE customers RENAME TO customers_info; +``` + +**要求8:**删除字段c_city + +```mysql +ALTER TABLE customers_info DROP c_city; +``` + + + +## 第2题 + +1、创建数据库test02_library + +```mysql +CREATE DATABASE test02_library; +USE test02_library; +``` + +2、创建表格books + +| 字段名 | 字段说明 | 数据类型 | 允许为空 | 唯一 | +| ------- | -------- | ------------- | -------- | ---- | +| b_id | 书编号 | int(11) | 否 | 是 | +| b_name | 书名 | varchar(50) | 否 | 否 | +| authors | 作者 | varchar(100) | 否 | 否 | +| price | 价格 | float | 否 | 否 | +| pubdate | 出版日期 | year | 否 | 否 | +| note | 说明 | varchar(100) | 是 | 否 | +| num | 库存 | int(11) | 否 | 否 | + +```mysql +CREATE TABLE books( + b_id INT(11) NOT NULL UNIQUE COMMENT '书编号', + b_name VARCHAR(50) NOT NULL COMMENT '书名', + `authors` VARCHAR(100) NOT NULL COMMENT '作者', + price FLOAT NOT NULL COMMENT '价格', + pubdate YEAR NOT NULL COMMENT '出版日期', + note VARCHAR(100) COMMENT '说明', + num INT(11) NOT NULL COMMENT '库存' +); +``` + +3、向books表中插入记录 + +| b_id | b_name | authors | price | pubdate | note | num | +| ---- | ------------- | --------------- | ----- | ------- | -------- | ---- | +| 1 | Tal of AAA | Dickes | 23 | 1995 | novel | 11 | +| 2 | EmmaT | Jane lura | 35 | 1993 | joke | 22 | +| 3 | Story of Jane | Jane Tim | 40 | 2001 | novel | 0 | +| 4 | Lovey Day | George Byron | 20 | 2005 | novel | 30 | +| 5 | Old land | Honore Blade | 30 | 2010 | law | 0 | +| 6 | The Battle | Upton Sara | 30 | 1999 | medicine | 40 | +| 7 | Rose Hood | Richard haggard | 28 | 2008 | cartoon | 28 | + +1) 指定所有字段名称插入第一条记录 + +```mysql +INSERT INTO books(b_id,b_name,`authors`,price,pubdate,note,num) VALUES(1,'Tal of AAA','Dickes',23,'1995','novel',11); +``` + +2)不指定字段名称插入第二记录 + +```mysql +INSERT INTO books VALUES(2,'EmmaT','Jane lura',35,'1993','joke',22); +``` + +3)同时插入多条记录(剩下的所有记录) + +```mysql +INSERT INTO books(b_id,b_name,`authors`,price,pubdate,note,num) +VALUES(3,'Story of Jane','Jane Tim',40,'2001','novel',0), +(4,'Lovey Day','George Byron',20,'2005','novel',30), +(5,'Old land','Honore Blade',30,'2010','law',0) +(6,'The Battle','Upton Sara',30,'1999','medicine',40), +(7,'Rose Hood','Richard haggard',28,'2008','cartoon',28); +``` + +4、将小说类型(novel)的书的价格都增加5。 + +```mysql +UPDATE books set price = price+5 where note = 'novel'; +``` + +5、将名称为EmmaT的书的价格改为40。 + +```mysql +UPDATE books set price = 40 WHERE b_name = 'EmmaT'; +``` + +6、删除库存为0的记录 + +```mysql +DELETE FROM books WHERE num = 0; +``` + + + +## 第3题 + +1、创建数据库test03_bookstore + +```mysql +CREATE DATABASE test03_bookstore; +USE test03_bookstore; +``` + +2、创建book表 + +```mysql ++----------+--------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++----------+--------------+------+-----+---------+----------------+ +| id | int(11) | NO | PRI | NULL | auto_increment | +| title | varchar(100) | NO | | NULL | | +| author | varchar(100) | NO | | NULL | | +| price | double(11,2) | NO | | NULL | | +| sales | int(11) | NO | | NULL | | +| stock | int(11) | NO | | NULL | | +| img_path | varchar(100) | NO | | NULL | | ++----------+--------------+------+-----+---------+----------------+ +``` + +```mysql +CREATE TABLE book( + id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + title VARCHAR(100) NOT NULL, + author VARCHAR(100) NOT NULL, + price DOUBLE(11,2) NOT NULL, + sales INT(11) NOT NULL, + stock INT(11) NOT NULL, + img_path VARCHAR(100) NOT NULL +); +``` + +尝试添加部分模拟数据,参考示例如下: + +```mysql ++---+---------+--------+-------+-----+------+--------------------------+ +|id | title | author | price |sales| stock| img_path | ++---+---------+--------+------+------+------+--------------------------+ +| 1 |解忧杂货店 |东野圭吾 | 27.20 | 102 | 98 |upload/books/解忧杂货店.jpg | ++---+---------+--------+------+------+------+--------------------------+ +| 2 | 边城 | 沈从文 | 23.00| 102 | 98 | upload/books/边城.jpg | ++---+---------+--------+-------+-----+------+--------------------------+ + +代码: +ALTER TABLE book CONVERT TO CHARACTER SET utf8; +INSERT INTO book(id,title,author,price,sales,stock,img_path) +VALUES(1,'解忧杂货店','东野圭吾',27.20,102,98,'upload/books/解忧杂货店.jpg'), +(2,'边城','沈从文',23.00,102,98,'upload/books/边城.jpg'); +``` + +3、创建用户表users,并插入数据 + +```mysql ++----------+--------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++----------+--------------+------+-----+---------+----------------+ +| id | int(11) | NO | PRI | NULL | auto_increment | +| username | varchar(100) | NO | UNI | NULL | | +| password | varchar(100) | NO | | NULL | | +| email | varchar(100) | YES | | NULL | | ++----------+--------------+------+-----+---------+----------------+ + +代码: +CREATE TABLE users( + id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + username VARCHAR(100) NOT NULL UNIQUE KEY, + `password` VARCHAR(100) NOT NULL , + email VARCHAR(100) +); +``` + +尝试添加部分模拟数据,参考示例如下: + +```mysql ++----+----------+----------------------------------+--------------------+ +| id | username | password | email | ++----+----------+----------------------------------+--------------------+ +| 1 | admin | 112233 | admin@mxdx.com | ++----+----------+----------------------------------+--------------------+ + +代码: +INSERT INTO users(id,username,`password`,email) +VALUES(1,'admin','112233','admin@mxdx.com'); +``` + +4、创建订单表orders + +```mysql ++--------------+--------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++--------------+--------------+------+-----+---------+-------+ +| id | varchar(100) | NO | PRI | NULL | | +| order_time | datetime | NO | | NULL | | +| total_count | int(11) | NO | | NULL | | +| total_amount | double(11,2) | NO | | NULL | | +| state | int(11) | NO | | NULL | | +| user_id | int(11) | NO | MUL | NULL | | ++--------------+--------------+------+-----+---------+-------+ + +代码: +CREATE TABLE orders( + id VARCHAR(100) NOT NULL PRIMARY KEY, + order_time DATETIME NOT NULL, + total_count INT(11) NOT NULL, + total_amount DOUBLE(11,2) NOT NULL, + state INT(11) NOT NULL, + user_id INT(11) NOT NULL +); +ALTER TABLE orders ADD INDEX(user_id); +``` + +尝试添加部分模拟数据,参考示例如下: + +```mysql ++-----------+-------------------+-----------+------------+-----+---------+ +| id |order_time |total_count|total_amount|state| user_id | ++-----------+-------------------+-----------+------------+-----+---------+ +|15294258455691|2018-06-20 00:30:45| 2 | 50.20 | 0 | 1 | ++-----------+-------------------+-----------+------------+-----+---------+ + +代码: +INSERT INTO orders VALUES('15294258455691','2018-06-20 00:30:45',2,50.20,0,1); +``` + +5、创建订单明细表order_items + +```mysql ++----------+--------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++----------+--------------+------+-----+---------+----------------+ +| id | int(11) | NO | PRI | NULL | auto_increment | +| count | int(11) | NO | | NULL | | +| amount | double(11,2) | NO | | NULL | | +| title | varchar(100) | NO | | NULL | | +| author | varchar(100) | NO | | NULL | | +| price | double(11,2) | NO | | NULL | | +| img_path | varchar(100) | NO | | NULL | | +| order_id | varchar(100) | NO | MUL | NULL | | ++----------+--------------+------+-----+---------+----------------+ + +代码: +CREATE TABLE order_items( + id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, + count INT(11) NOT NULL, + amount DOUBLE(11,2) NOT NULL, + title VARCHAR(100) NOT NULL, + `author` VARCHAR(100) NOT NULL, + price DOUBLE(11,2) NOT NULL, + img_path VARCHAR(100) NOT NULL, + order_id VARCHAR(100) NOT NULL +); +ALTER TABLE order_items ADD INDEX(order_id); +``` + +尝试添加部分模拟数据,参考示例如下: + +```mysql ++--+-----+------+---------+---------+-------+------------+---------------+ +|id|count|amount| title | author | price | img_path | order_id | ++----+-----+------+---------+---------+-------+------------+-------------+ +|1 |1 |27.20|解忧杂货店|东野圭吾|27.20|static/img/default.jpg|15294258455691| ++----+-----+------+---------+---------+-------+------------+-------------+ +|2 |1 |23.00| 边城 |沈从文 |23.00|static/img/default.jpg|15294258455691| ++----+-----+------+---------+---------+-------+------------+-------------+ + +代码: +ALTER TABLE order_items CONVERT TO CHARACTER SET utf8; +INSERT INTO order_items +VALUES +(1,1,27.20,'解忧杂货店','东野圭吾',27.20,'static/img/default.jpg','15294258455691'), +(2,1,23.00,'边城','沈从文',23.00,'static/img/default.jpg','15294258455691'); +``` + + + -- Gitee From c5a234df18f1b7a3b874cffafc3b18552e089ce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=96=E5=BF=83=E5=A6=8D?= <2392642810@qq.com> Date: Wed, 22 Feb 2023 13:25:29 +0800 Subject: [PATCH 3/3] =?UTF-8?q?2.21=20=E7=BA=A6=E6=9D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2.21 \347\272\246\346\235\237.md" | 599 ++++++++++++++++++ 1 file changed, 599 insertions(+) create mode 100644 "03\350\265\226\345\277\203\345\246\215/2.21 \347\272\246\346\235\237.md" diff --git "a/03\350\265\226\345\277\203\345\246\215/2.21 \347\272\246\346\235\237.md" "b/03\350\265\226\345\277\203\345\246\215/2.21 \347\272\246\346\235\237.md" new file mode 100644 index 0000000..5031aef --- /dev/null +++ "b/03\350\265\226\345\277\203\345\246\215/2.21 \347\272\246\346\235\237.md" @@ -0,0 +1,599 @@ +# 2.21 约束 + +#### 主键、唯一、非空、默认、自增、外键 + +### 1、主键约束 + +(1)关键字是primary key +(2)特点 +A:每一个表只能有一个主键约束 +B:主键约束的字段值是不允许为null,也不允许重复的 + +```mysql +CREATE TABLE teacher( + tid INT PRIMARY KEY, + tname VARCHAR(20) +); + +只有一个主键: +若执行 +tid INT PRIMARY KEY, +tname VARCHAR(20) PRIMARY KEY, +错误代码: 1068 +Multiple(重复的,多倍的) primary key defined(定义) + +不为null: +若执行(INSERT INTO teacher VALUES(NULL,'王');) +错误代码: 1048 +Column 'tid' cannot be null +主键不允许为null + +不重复: +若执行两遍相同的insert语句(INSERT INTO teacher VALUES(1,'柴');),就会报错 +错误代码: 1062 +Duplicate(重复的) entry(输入) '1' +for key 'teacher.PRIMARY' +意思:违反了主键约束 +``` + +复合主键 + +```mysql +PRIMARY KEY(sid,cid) //放在在create table()里最后一行 +``` + +建表后增加主键约束 + +```mysql +ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表); + +示例: +ALTER TABLE student ADD PRIMARY KEY(sid); +``` + +删除主键约束 + +```mysql +ALTER TABLE 表名称 DROP PRIMARY KEY; + +示例: +ALTER TABLE student DROP PRIMARY KEY; +``` + +### 2、唯一键约束 + +(1)关键字:unique key +(2)特点 +A:允许为null,但是不能重复 +B:一个表可以有多个唯一键约束 + +建表后增加唯一键约束 + +```mysql +ALTER TABLE 表名称 ADD UNIQUE KEY (字段列表); + +示例: +ALTER TABLE student ADD UNIQUE KEY(sname); +``` + +删除唯一主键约束 + +```mysql +ALTER TABLE 表名称 DROP INDEX 索引名; +``` + +### 3、非空约束 + +不要求唯一,但是要求非空 + +### 4、默认值约束 + +如果某个字段,在添加数据时未指定值时,希望不要用NULL处理,而是按照一个默认值处理, +就可以使用默认值约束。 +例如:学生性别,在未指定时,默认按照 男 处理 + +```mysql +CREATE TABLE student( + sid INT PRIMARY KEY, #主键约束 + sname VARCHAR(20) UNIQUE KEY, #唯一键约束 + birthday DATE, + score INT NOT NULL, #非空约束 + gender ENUM('男','女') NOT NULL DEFAULT '男', #非空 + 默认值约束 + weight DOUBLE(4,1), + tel CHAR(11) UNIQUE KEY #唯一键约束 +); +``` + +删除非空约束 + +```mysql +ALTER TABLE 表名 MODIFY 字段 字段类型; +``` + + 增加非空约束 + +```mysql +ALTER TABLE 表名 MODIFY 字段 字段类型 NOT NULL; +``` + +非空+默认值中删除默认值约束,保留非空约束 + +```mysql +ALTER TABLE 表名 MODIFY 字段 字段类型 NOT NULL; + +反过来: +ALTER TABLE 表名 MODIFY 字段 字段类型 DEFAULT 默认值; +``` + +保留非空和默认值约束 + +```mysql +ALTER TABLE 表名 MODIFY 字段 字段类型 DEFAULT 默认值 NOT NULL +``` + +查看约束名等信息,查看系统库“information_schema”的“table_constraints” + +```mysql +SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称'; +``` + +### 5、检查约束 + +###### (MySQL5.7不支持CHECK约束,在MySQL8.0中开始支持CHECK约束) + +### 6、外键约束 + +约束两个表的关系,或者是一个表的两个字段之间的关系。 + +(1)主表(父表)和从表(子表) +主表:被依赖,被参考 +从表:依赖别人的,参考别人的 + +2)外键的建立和指定要在从表中定义 +(3)关键字 foreign key +(4)格式 foreign key (从表的字段) references 主表(被依赖字段) +(5)要求 +A:主表必须先存在 +B:主表被依赖字段必须有索引,所以通常是主键列或唯一键列等才能作为被依赖字段。 +C:删除表时,要么先删除从表,再删除主表,要么先解除外键约束,然后各自删除。 +D:从(子)表的依赖字段的数据,必须在主(父)表被依赖字段中选择。 + 添加和修改都是这样的。 +E:主(父)表被依赖字段的数据不能轻易的删除和修改,要看是否被引用 + +外键约束等级为 on update/delete cascade /(set null) + +```mysql +CREATE TABLE dept( + did INT PRIMARY KEY, + dname VARCHAR(20) +); +CREATE TABLE emp( + eid INT, + ename VARCHAR(20), + deptid INT, + #这里的部门编号可以和dept表中的部门编号名字不一样,但是数据类型和逻辑意义要一样 + FOREIGN KEY (deptid) REFERENCES dept(did) +); +``` + +### 7、自增属性 + +维护某个字段的值自动增长的一个属性。 +它的要求: +(1)一个表最多只能有一个字段是自增的 +(2)自增的字段必须是整数类型 +(3)自增的字段必须是键约束的字段(通常是主键、唯一键) + +自增字段赋值为null和0的时候,会自增,如果赋值为其他的值,按照你指定的值来。 + +```mysql +CREATE TABLE stu( + sid INT AUTO_INCREMENT PRIMARY KEY, + sname VARCHAR(20) +); +``` + +```mysql +ALTER TABLE 表名称 AUTO_INCREMENT = 起始值; + +示例: +ALTER TABLE stu AUTO_INCREMENT = 1001; +``` + + + +# 作业 + +## 第1题 + +1、创建数据库test01_company + +```mysql +CREATE DATABASE test01_company CHARSET utf8; +USE test01_company; +``` + +2、创建表格offices + +| 字段名 | 数据类型 | +| ---------- | ----------- | +| officeCode | int | +| city | varchar(30) | +| address | varchar(50) | +| country | varchar(50) | +| postalCode | varchar(25) | + +```mysql +CREATE TABLE offices( + officeCode INT, + city VARCHAR(30), + address VARCHAR(50), + country VARCHAR(50), + postalCode VARCHAR(25) +); +``` + +3、创建表格employees + +| 字段名 | 数据类型 | +| ------------- | ---------------------------- | +| empNum | int(11) | +| lastName | varchar(50) | +| firstName | varchar(50) | +| mobile | varchar(25) | +| code | int | +| jobTitle | varchar(50) | +| birth | date | +| Note | varchar(255) | +| Sex | varchar(5) | + +```mysql +CREATE TABLE employees( + empNum INT(11), + lastName VARCHAR(50), + firstName VARCHAR(50), + mobile VARCHAR(25), + `code` INT, + jobTitle VARCHAR(50), + birth date, + Note VARCHAR(255), + Sex VARCHAR(5) +); +``` + +**要求4:**将表employees的mobile字段修改到code字段后面。 + +```mysql +ALTER TABLE employees MODIFY mobile VARCHAR(25) AFTER `code`; +``` + +**要求5:**将表employees的birth字段改名为birthday; + +```mysql +ALTER TABLE employees CHANGE birth birthday DATE; +``` + +**要求6:**修改sex字段,数据类型为char(1) + +```mysql +ALTER TABLE employees MODIFY sex CHAR(1); +``` + +**要求7:**删除字段note; + +```mysql +ALTER TABLE employees DROP note; +``` + +**要求8:**增加字段名favoriate_activity,数据类型为varchar(100); + +```mysql +ALTER TABLE employees ADD favoriate_activity VARCHAR(100); +``` + +**要求9:**将表employees的名称修改为 employees_info + +```mysql +ALTER TABLE employees RENAME employees_info; +``` + + + +## 第2题 + +1、创建数据库test02db + +```mysql +CREATE DATABASE test02db CHARSET utf8; +USE test02db; +``` + +2、创建表格pet + +| 字段名 | 字段说明 | 数据类型 | +| ------- | -------- | ----------- | +| name | 宠物名称 | varchar(20) | +| owner | 宠物主人 | varchar(20) | +| species | 种类 | varchar(20) | +| sex | 性别 | char(1) | +| birth | 出生日期 | year | +| death | 死亡日期 | year | + +```mysql +CREATE TABLE pet( + `name` VARCHAR(20) COMMENT '宠物名称', + `owner` VARCHAR(20) COMMENT '宠物主人', + species VARCHAR(20) COMMENT '种类', + sex CHAR(1) COMMENT '性别', + birth year COMMENT '出生日期', + death year COMMENT '死亡日期' +); +``` + +3、添加记录 + +| name | owner | species | sex | birth | death | +| ------ | ------ | ------- | ---- | ----- | ----- | +| Fluffy | harold | Cat | f | 2003 | 2010 | +| Claws | gwen | Cat | m | 2004 | | +| Buffy | | Dog | f | 2009 | | +| Fang | benny | Dog | m | 2000 | | +| bowser | diane | Dog | m | 2003 | 2009 | +| Chirpy | | Bird | f | 2008 | | + +```mysql +INSERT INTO pet +VALUES + ('Fluffy','harold','Cat','f','2003','2010'), + ('Claws','gwen','Cat','m','2004',NULL), + ('Butty',NULL,'Dog','f','2009',NULL), + ('Fang','benny','Dog','m','2000',NULL), + ('bowser','diane','Dog','m','2003','2009'), + ('Chirpy',NULL,'Bird','f','2008',NULL); +``` + +4、 添加字段主人的生日owner_birth。 + +```mysql +ALTER TABLE pet ADD owner_birth date; +``` + +5、 将名称为Claws的猫的主人改为kevin + +```mysql +UPDATE pet SET `owner` = 'kevin' WHERE `name` = 'Claws'; +``` + +6、 将没有死的狗的主人改为duck + +```mysql +UPDATE pet SET `owner` = 'duck' WHERE species = 'Dog' AND death IS NULL; +``` + +7、 查询没有主人的宠物的名字; + +```mysql +SELECT `name` FROM pet WHERE `owner` IS NULL; +``` + +8、 查询已经死了的cat的姓名,主人,以及去世时间; + +```mysql +SELECT `name`, `owner`, death FROM pet WHERE species='Cat' AND death IS NOT NULL; +``` + +9、 删除已经死亡的狗 + +```mysql +DELETE FROM pet WHERE death is not null and species = 'Dog'; +``` + +10、查询所有宠物信息 + +```mysql +SELECT * FROM pet; +``` + + + +## 第3题 + +1、创建数据库:test03_company + +```mysql +CREATE DATABASE test03_company CHARSET utf8; +USE test03_company; +``` + +2、在此数据库下创建如下3表,数据类型,宽度,是否为空根据实际情况自己定义。 + +A. 部门表(department):部门编号(depid),部门名称(depname),部门简介(deinfo);其中部门编号为主键。 + +```mysql +CREATE TABLE department( + depid VARCHAR(5) NOT NULL PRIMARY KEY, + depname VARCHAR(5) NOT NULL, + deinfo VARCHAR(30) +); +``` + +B. 雇员表(employee):雇员编号(empid),姓名(name),性别(sex),职称(title),出生日期(birthday),所在部门编号(depid);其中 + +* ​ 雇员编号为主键; +* ​ 部门编号为外键,外键约束等级为(on update cascade 和on delete set null); +* ​ 性别默认为男; + +```mysql +CREATE TABLE employee ( + empid VARCHAR(5) NOT NULL PRIMARY KEY, + `name` VARCHAR(5) NOT NULL, + sex VARCHAR(1) NOT NULL DEFAULT '男', + title VARCHAR(10), + birthday date NOT NULL, + depid VARCHAR(5), + FOREIGN KEY(depid) REFERENCES department(depid) ON UPDATE CASCADE ON DELETE SET NULL +); +``` + +C. 工资表(salary):雇员编号(empid),基本工资(basesalary),职务工资(titlesalary),扣除(deduction)。其中雇员编号为主键。 + +3、给工资表(salary)的雇员编号(empid)增加外键约束,外键约束等级为(on update cascade 和on delete cascade) + +```mysql +CREATE TABLE salary( + empid VARCHAR(5) PRIMARY KEY, + basesalary INT, + titlesalary INT, + deduction INT +); +ALTER TABLE salary MODIFY empid VARCHAR(5); +ALTER TABLE salary ADD FOREIGN KEY(empid) REFERENCES employee(empid) ON UPDATE CASCADE ON DELETE CASCADE; +``` + + + +4、添加数据如下: + +部门表: + +| 部门编号 | 部门名称 | 部门简介 | +| -------- | -------- | ------------ | +| 111 | 生产部 | Null | +| 222 | 销售部 | Null | +| 333 | 人事部 | 人力资源管理 | + +```mysql +INSERT INTO department +VALUES +(111,'生产部',NULL), +(222,'销售部',NULL), +(333,'人事部','人力资源管理'); +``` + + 雇员表: + +| 雇员编号 | 姓名 | 性别 | 职称 | 出生日期 | 所在部门编号 | +| -------- | ---- | ---- | ---------- | ---------- | ------------ | +| 1001 | 张三 | 男 | 高级工程师 | 1975-1-1 | 111 | +| 1002 | 李四 | 女 | 助工 | 1985-1-1 | 111 | +| 1003 | 王五 | 男 | 工程师 | 1978-11-11 | 222 | +| 1004 | 张六 | 男 | 工程师 | 1999-1-1 | 222 | + +```mysql +INSERT INTO employee VALUES +(1001,'张三','男','高级工程师','1975-1-1',111), +(1002,'李四','女','助工','1985-1-1',111), +(1003,'王五','男','工程师','1978-11-11',222), +(1004,'张六','男','工程师','1999-1-1',222); +``` + + 工资表: + +| 雇员编号 | 基本工资 | 职务工资 | 扣除 | +| -------- | -------- | -------- | ---- | +| 1001 | 2200 | 1100 | 200 | +| 1002 | 1200 | 200 | NULL | +| 1003 | 2900 | 700 | 200 | +| 1004 | 1950 | 700 | 150 | + +```mysql +INSERT INTO salary VALUES +(1001,2200,1100,200), +(1002,1200,200,NULL), +(1003,2900,700,200), +(1004,1950,700,150); +``` + + + +## 第4题 + +1、创建一个数据库:test04_school + +```mysql +CREATE DATABASE test04_school CHARSET utf8; +USE test04_school; +``` + +2、创建如下表格 + +表1 Department表的定义 + +| **字段名** | **字段描述** | **数据类型** | **主键** | **外键** | **非空** | **唯一** | +| ---------- | ------------ | ------------ | -------- | -------- | -------- | -------- | +| DepNo | 部门号 | int(10) | 是 | 否 | 是 | 是 | +| DepName | 部门名称 | varchar(20) | 否 | 否 | 是 | 否 | +| DepNote | 部门备注 | Varchar(50) | 否 | 否 | 否 | 否 | + +```mysql +CREATE TABLE Department( + DepNo INT(10) UNIQUE PRIMARY KEY COMMENT '部门号', + DepName VARCHAR(20) COMMENT '部门名称', + DepNote VARCHAR(50) NOT NULL COMMENT '部门备注' +); +``` + +表2 Teacher表的定义 + +| **字段名** | **字段描述** | **数据类型** | **主键** | **外键** | **非空** | **唯一** | +| ---------- | ------------ | ------------ | -------- | -------- | -------- | -------- | +| Number | 教工号 | int | 是 | 否 | 是 | 是 | +| Name | 姓名 | varchar(30) | 否 | 否 | 是 | 否 | +| Sex | 性别 | varchar(4) | 否 | 否 | 否 | 否 | +| Birth | 出生日期 | date | 否 | 否 | 否 | 否 | +| DepNo | 部门号 | int | 否 | 是 | 否 | 否 | +| Salary | 工资 | float | 否 | 否 | 否 | 否 | +| Address | 家庭住址 | varchar(100) | 否 | 否 | 否 | 否 | + +```mysql +CREATE TABLE Teacher( + Number INT UNIQUE PRIMARY KEY COMMENT '教工号', + `Name` VARCHAR(30) COMMENT '姓名', + Sex VARCHAR(4) NOT NULL COMMENT '性别', + Birth date NOT NULL COMMENT '出生日期', + DepNo INT NOT NULL COMMENT '部门号', + Salary FLOAT NOT NULL COMMENT '工资', + Address VARCHAR(100) NOT NULL COMMENT '家庭住址', + FOREIGN KEY(DepNo) REFERENCES Department(DepNo) +); +``` + +3、添加记录 + +| **DepNo** | **DepName** | **DepNote** | +| --------- | ----------- | ------------------ | +| 601 | 软件技术系 | 软件技术等专业 | +| 602 | 网络技术系 | 多媒体技术等专业 | +| 603 | 艺术设计系 | 广告艺术设计等专业 | +| 604 | 管理工程系 | 连锁经营管理等专业 | + +```mysql +INSERT INTO Department VALUES +(601,'软件设计系','软件技术等专业'), +(602,'网络技术系','多媒体技术等专业'), +(603,'艺术设计系','广告艺术设计等专业'), +(604,'管理工程系','连锁经营管理等专业'); +``` + +| **Number** | **Name** | **Sex** | **Birth** | **DepNo** | **Salary** | **Address** | +| ---------- | -------- | ------- | ---------- | --------- | ---------- | ------------ | +| 2001 | Tom | 女 | 1970-01-10 | 602 | 4500 | 四川省绵阳市 | +| 2002 | Lucy | 男 | 1983-12-18 | 601 | 2500 | 北京市昌平区 | +| 2003 | Mike | 男 | 1990-06-01 | 604 | 1500 | 重庆市渝中区 | +| 2004 | James | 女 | 1980-10-20 | 602 | 3500 | 四川省成都市 | +| 2005 | Jack | 男 | 1975-05-30 | 603 | 1200 | 重庆市南岸区 | + +```mysql +INSERT INTO Teacher VALUES +(2001,'Tom','女','1970-01-10',602,4500,'四川省绵阳市'), +(2002,'Lucy','男','1983-12-18',601,2500,'北京市昌平区'), +(2003,'Mike','男','1990-06-01',604,1500,'重庆市渝中区'), +(2004,'James','女','1980-10-20',602,3500,'四川省成都市'), +(2005,'Jack','男','1975-05-30',603,1200,'重庆市南岸区'); +``` + +4、用SELECT语句查询Teacher表的所有记录。 + +```mysql +SELECT * FROM Teacher; +``` -- Gitee