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" deleted file mode 100644 index 9ece5998e6667d1e1af4e1cdc66648ddd4bb3e5c..0000000000000000000000000000000000000000 --- "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" +++ /dev/null @@ -1,87 +0,0 @@ -# 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) -); -``` - 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" deleted file mode 100644 index 8584ca59f7906e680557e2391b7e5336393b91d1..0000000000000000000000000000000000000000 --- "a/03\350\265\226\345\277\203\345\246\215/2.17 MySQL\350\257\255\345\217\245.md" +++ /dev/null @@ -1,624 +0,0 @@ -# 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'); -``` - - - 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" deleted file mode 100644 index 5031aefc27249dac88cc2942cbf7fb4c6e8f8950..0000000000000000000000000000000000000000 --- "a/03\350\265\226\345\277\203\345\246\215/2.21 \347\272\246\346\235\237.md" +++ /dev/null @@ -1,599 +0,0 @@ -# 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; -```