From 03a420d83a8a33e4fb80052188388696108b0457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=96=E5=BF=83=E5=A6=8D?= <2392642810@qq.com> Date: Thu, 23 Feb 2023 21:45:06 +0800 Subject: [PATCH 1/3] =?UTF-8?q?2.23=20=E6=9F=A5=E8=AF=A2=E4=B8=8E=E8=BF=90?= =?UTF-8?q?=E7=AE=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...14\350\277\220\347\256\227\347\254\246.md" | 361 ++++++++++++++++++ 1 file changed, 361 insertions(+) create mode 100644 "03\350\265\226\345\277\203\345\246\215/2.23 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" diff --git "a/03\350\265\226\345\277\203\345\246\215/2.23 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" "b/03\350\265\226\345\277\203\345\246\215/2.23 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" new file mode 100644 index 0000000..6b0181a --- /dev/null +++ "b/03\350\265\226\345\277\203\345\246\215/2.23 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" @@ -0,0 +1,361 @@ +# 2.23 查询select语句和运算符 + +### select语句格式: + +```mysql +SELECT 字段列表 FROM 表名称; + +SELECT 字段列表 FROM 表名称 WHERE 条件; +``` + +### 使用别名(临时名称) + +```mysql +select 字段名1 as "别名1", 字段名2 as "别名2" from 表名称 as 别名; +``` + +- 列的别名有空格时,请加双引号。**==列的别名==中没有空格时,双引号可以加也可以不加**。 +- ==**表的别名不能加双引号**==,表的别名中间不能包含空格。 +- as大小写都可以,as也完全可以省略。 + +```mysql +示例: +mysql> select id "学号",name "姓名" from student; ++------+------+ +| 学号 | 姓名 | ++------+------+ +| 1 | 张三 | +| 2 | 李四 | ++------+------+ +2 rows in set (0.00 sec) + +mysql> select id 学号,name 姓名 from student; ++------+------+ +| 学号 | 姓名 | ++------+------+ +| 1 | 张三 | +| 2 | 李四 | ++------+------+ +2 rows in set (0.00 sec) +``` + +### 结果去重 + +mysql可以在查询结果中使用distinct关键字去重。 + +```mysql +select distinct 字段列表 from 表名称 【where 条件】; + +示例: +select distinct did from t_employee; +``` + +### 算术运算符 + +```mysql +加:+ + 在MySQL +就是求和,没有字符串拼接 +减:- +乘:* +除:/ div(只保留整数部分) + div:两个数相除只保留整数部分 + /:数学中的除 +模:% mod + +mysql中没有 +=等运算符 +``` + +### 比较运算符 + +```mysql +大于:> +小于:< +大于等于:>= +小于等于:>= +等于:= 不能用于null判断 +不等于:!= 或 <> 不能用于null判断 +判断是null 用 is null 或 用 <=> null +判断不是null is not null +``` + +### 区间或集合范围比较运算符 + +```mysql +区间范围:between x and y + not between x and y +集合范围:in (x,x,x) + not in(x,x,x) +between ... and ... 结果包含两端的边界 + +示例: +#查询薪资在[10000,15000] +select * from t_employee where salary>=10000 && salary<=15000; +select * from t_employee where salary between 10000 and 15000; + +#查询籍贯在这几个地方的 +select * from t_employee where work_place in ('北京', '浙江', '江西'); + +#查询薪资不在[10000,15000] +select * from t_employee where salary not between 10000 and 15000; + +#查询籍贯不在这几个地方的 +select * from t_employee where work_place not in ('北京', '浙江', '江西'); +``` + +### 模糊匹配比较运算符 + +%:代表任意个字符 + +_:代表一个字符,如果两个下划线代表两个字符 + +```mysql +示例: +#查询名字中包含'冰'字 +select * from t_employee where ename like '%冰%'; + +#查询名字以‘雷'结尾的 +select * from t_employee where ename like '%远'; + +#查询名字以’李'开头 +select * from t_employee where ename like '李%'; + +#查询名字有冰这个字,但是冰的前面只能有1个字 +select * from t_employee where ename like '_冰%'; + +#查询当前mysql数据库的字符集情况 +show variables like '%character%'; +``` + +### 逻辑运算符 + +```mysql +逻辑与:&& 或 and +逻辑或:|| 或 or +逻辑非:! 或 not +逻辑异或: xor + +示例: +#查询薪资高于15000,并且性别是男的员工 +select * from t_employee where salary>15000 and gender='男'; +select * from t_employee where salary>15000 && gender='男'; + +select * from t_employee where salary>15000 & gender='男';#错误得不到值 &按位与 +select * from t_employee where (salary>15000) & (gender='男'); + +#查询薪资高于15000,或者did为1的员工 +select * from t_employee where salary>15000 or did = 1; +select * from t_employee where salary>15000 || did = 1; + +#查询薪资不在[15000,20000]范围的 +select * from t_employee where salary not between 15000 and 20000; +select * from t_employee where !(salary between 15000 and 20000); + +#查询薪资高于15000,或者did为1的员工,两者只能满足其一 +select * from t_employee where salary>15000 xor did = 1; +select * from t_employee where (salary>15000) ^ (did = 1); +``` + +### 关于null值的问题、 + +```mysql +#(1)判断时 +xx is null +xx is not null +xx <=> null + +#(2)计算时 +ifnull(xx,代替值) 当xx是null时,用代替值计算 + +示例: +#查询员工的实发工资,实发工资 = 薪资 + 薪资 * 奖金比例 +select ename , salary + salary * commission_pct "实发工资" from t_employee; #失败,当commission_pct为null,结果都为null + +select ename ,salary , commission_pct, salary + salary * ifnull(commission_pct,0) "实发工资" from t_employee; +``` + +### 位运算符 + +```mysql +左移:<< +右移:>> +按位与:& +按位或:| +按位异或:^ +按位取反:~ +``` + + + +# 作业 + +## 第1题:员工表 + +| **id** | **name** | **sex** | **tel** | **addr** | **salary** | +| ------ | -------- | ------- | ------------ | -------- | ---------- | +| 10001 | 张一一 | 男 | 13456789000 | 广东韶关 | 10010.58 | +| 10002 | 刘小红 | 女 | 13454319000 | 广东江门 | 12010.21 | +| 10003 | 李四 | 男 | 0751-1234567 | 广东佛山 | 10040.11 | +| 10004 | 刘小强 | 男 | 0755-5555555 | 广东深圳 | 15010.23 | +| 10005 | 王艳 | 女 | NULL | 广东广州 | 14050.16 | + +```mysql +CREATE DATABASE test03 CHARSET utf8; +USE test03; + +CREATE TABLE employee( + id INT, + `name` VARCHAR(20), + sex VARCHAR(20), + tel VARCHAR(20), + addr VARCHAR(50), + salary FLOAT +); + +INSERT INTO employee(id,`name`,sex,tel,addr,salary)VALUES +(10001,'张一一','男','13456789000','广东韶关',10010.58), +(10002,'刘小红','女','13454319000','广东江门',12010.21), +(10003,'李四','男','0751-1234567','广东佛山',10040.11), +(10004,'刘小强','男','0755-5555555','广东深圳',15010.23), +(10005,'王艳','男',NULL,'广东广州',14050.16); +``` + +**要求1:**查询出薪资在12000~13000之间的员工信息。 + +```mysql +SELECT * FROM employee WHERE salary BETWEEN 12000 AND 13000; +``` + +**要求2:**查询出姓“刘”的员工的工号,姓名,家庭住址。 + +```mysql +SELECT id,`name`,addr FROM employee WHERE `name` LIKE '刘%'; +``` + +**要求3:**将“李四”的家庭住址改为“广东韶关” + +```mysql +UPDATE employee SET addr = '广东韶关' WHERE `name` = '李四'; +``` + +**要求4:**查询出名字中带“小”的员工 + +```mysql +SELECT `name` FROM employee WHERE `name` LIKE '%小%'; +``` + +**要求5:**查询出薪资高于11000的男员工信息 + +```mysql +SELECT * FROM employee WHERE salary>11000 AND sex='男'; +``` + +**要求6:**查询没有登记电话号码的员工 + +```mysql +SELECT `name` FROM employee WHERE tel is NULL; +``` + +**要求7:**查询薪资高于12000或者家是广东深圳、广州的男员工 + +```mysql +SELECT `name` FROM employee WHERE sex = '男' AND salary = 12000 OR addr = '广东深圳' OR addr='广东广州'; +``` + +**要求8:**查询每个员工的年薪,显示“姓名、年薪” + +```mysql +SELECT `name`,salary FROM employee; +``` + + + +## 第2题:国家信息表 + +countries_info表中存储了国家名称、所属大陆、面积、人口和 GDP 值。 + +```mysql +DROP TABLE IF EXISTS `countries_info`; +CREATE TABLE `countries_info`( + `name` VARCHAR(100), + `continent` VARCHAR(100), + `area` INT, + population INT, + gdp BIGINT +); + +INSERT INTO countries_info VALUES +('Afghanistan','Asia',652230,25500100,20343000000), +('Albania','Europe',28748,2831741,12960000000), +('Algeria','Africa',2381741,37100000,188681000000), +('Andorra','Europe',468,78115,3712000000), +('Angola','Africa',1246700,20609294,100990000000); +``` + +表数据样例: + +```mysql ++-------------+-----------+---------+------------+--------------+ +| name | continent | area | population | gdp | ++-------------+-----------+---------+------------+--------------+ +| Afghanistan | Asia | 652230 | 25500100 | 20343000000 | +| Albania | Europe | 28748 | 2831741 | 12960000000 | +| Algeria | Africa | 2381741 | 37100000 | 188681000000 | +| Andorra | Europe | 468 | 78115 | 3712000000 | +| Angola | Africa | 1246700 | 20609294 | 100990000000 | ++-------------+-----------+---------+------------+--------------+ +``` + +**要求1:** 查询大国 的国家名称、人口和面积。 + +如果一个国家满足下述两个条件之一,则认为该国是 大国 : + +- 面积至少为 300万平方公里(即,3000000 km2) + +- 人口至少为 2500 万(即 25000000) + + ```mysql + SELECT `name`,area,population FROM countries_info WHERE area>3000000 OR population>=25000000; + ``` + +**要求2:**查询属于亚洲的国家名称、所属大陆、面积、人口和 GDP 值 + +```mysql +SELECT * FROM countries_info WHERE continent = 'Asia'; +``` + +**要求3:**查询国土面积不足1万平方公里且人口不走10万人的国家信息 + +```mysql +SELECT * FROM countries_info WHERE area<10000 AND population<100000; +``` + +**要求4:**查询国家名字中包含“o“字母的国家信息 + +```mysql +SELECT * FROM countries_info WHERE `name` LIKE '%o%'; +``` + +**要求5:**查询GDP值超过10000000000的国家信息 + +```mysql +SELECT * FROM countries_info WHERE gdp>10000000000; +``` + +**要求6:**查询每个国家的人均贡献GDP值(GDP/人口总数)并显示为“国家名、人口、GDP值、人均贡献GDP值” + +```mysql +SELECT `name` 国家名,population 人口,gdp GDP值,gdp/population AS 人均贡献GDP值 FROM countries_info; +``` + +**要求7:**查询人均贡献GDP值低于1000的国家信息。 + +```mysql +SELECT * FROM countries_info WHERE gdp/population<1000; +``` + +**要求8:**查询每个国家的人均国土面积(面积/人口总数)并显示为“国家名、面积、人口、人均国土面积值” + +```mysql +SELECT `name` 国家名,population 人口,gdp GDP值,area/population AS 人均国土面积值 FROM countries_info; +``` + -- Gitee From 1764943e4029670af8b521fcba13bef99e375e77 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, 1 Mar 2023 22:38:26 +0800 Subject: [PATCH 2/3] =?UTF-8?q?2.28=20=E5=85=B3=E8=81=94=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\350\247\204\350\214\203\347\255\211.md" | 87 +++ .../2.17 MySQL\350\257\255\345\217\245.md" | 624 ++++++++++++++++++ .../2.21 \347\272\246\346\235\237.md" | 599 +++++++++++++++++ ...14\350\277\220\347\256\227\347\254\246.md" | 361 ++++++++++ ...63\350\201\224\346\237\245\350\257\242.md" | 540 +++++++++++++++ 5 files changed, 2211 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" create mode 100644 "03 \350\265\226\345\277\203\345\246\215/2.17 MySQL\350\257\255\345\217\245.md" create mode 100644 "03 \350\265\226\345\277\203\345\246\215/2.21 \347\272\246\346\235\237.md" create mode 100644 "03 \350\265\226\345\277\203\345\246\215/2.23 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" create mode 100644 "03 \350\265\226\345\277\203\345\246\215/2.28 \345\205\263\350\201\224\346\237\245\350\257\242.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) +); +``` + 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'); +``` + + + 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..64433ab --- /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(empid) 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; +``` diff --git "a/03 \350\265\226\345\277\203\345\246\215/2.23 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" "b/03 \350\265\226\345\277\203\345\246\215/2.23 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" new file mode 100644 index 0000000..6b0181a --- /dev/null +++ "b/03 \350\265\226\345\277\203\345\246\215/2.23 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" @@ -0,0 +1,361 @@ +# 2.23 查询select语句和运算符 + +### select语句格式: + +```mysql +SELECT 字段列表 FROM 表名称; + +SELECT 字段列表 FROM 表名称 WHERE 条件; +``` + +### 使用别名(临时名称) + +```mysql +select 字段名1 as "别名1", 字段名2 as "别名2" from 表名称 as 别名; +``` + +- 列的别名有空格时,请加双引号。**==列的别名==中没有空格时,双引号可以加也可以不加**。 +- ==**表的别名不能加双引号**==,表的别名中间不能包含空格。 +- as大小写都可以,as也完全可以省略。 + +```mysql +示例: +mysql> select id "学号",name "姓名" from student; ++------+------+ +| 学号 | 姓名 | ++------+------+ +| 1 | 张三 | +| 2 | 李四 | ++------+------+ +2 rows in set (0.00 sec) + +mysql> select id 学号,name 姓名 from student; ++------+------+ +| 学号 | 姓名 | ++------+------+ +| 1 | 张三 | +| 2 | 李四 | ++------+------+ +2 rows in set (0.00 sec) +``` + +### 结果去重 + +mysql可以在查询结果中使用distinct关键字去重。 + +```mysql +select distinct 字段列表 from 表名称 【where 条件】; + +示例: +select distinct did from t_employee; +``` + +### 算术运算符 + +```mysql +加:+ + 在MySQL +就是求和,没有字符串拼接 +减:- +乘:* +除:/ div(只保留整数部分) + div:两个数相除只保留整数部分 + /:数学中的除 +模:% mod + +mysql中没有 +=等运算符 +``` + +### 比较运算符 + +```mysql +大于:> +小于:< +大于等于:>= +小于等于:>= +等于:= 不能用于null判断 +不等于:!= 或 <> 不能用于null判断 +判断是null 用 is null 或 用 <=> null +判断不是null is not null +``` + +### 区间或集合范围比较运算符 + +```mysql +区间范围:between x and y + not between x and y +集合范围:in (x,x,x) + not in(x,x,x) +between ... and ... 结果包含两端的边界 + +示例: +#查询薪资在[10000,15000] +select * from t_employee where salary>=10000 && salary<=15000; +select * from t_employee where salary between 10000 and 15000; + +#查询籍贯在这几个地方的 +select * from t_employee where work_place in ('北京', '浙江', '江西'); + +#查询薪资不在[10000,15000] +select * from t_employee where salary not between 10000 and 15000; + +#查询籍贯不在这几个地方的 +select * from t_employee where work_place not in ('北京', '浙江', '江西'); +``` + +### 模糊匹配比较运算符 + +%:代表任意个字符 + +_:代表一个字符,如果两个下划线代表两个字符 + +```mysql +示例: +#查询名字中包含'冰'字 +select * from t_employee where ename like '%冰%'; + +#查询名字以‘雷'结尾的 +select * from t_employee where ename like '%远'; + +#查询名字以’李'开头 +select * from t_employee where ename like '李%'; + +#查询名字有冰这个字,但是冰的前面只能有1个字 +select * from t_employee where ename like '_冰%'; + +#查询当前mysql数据库的字符集情况 +show variables like '%character%'; +``` + +### 逻辑运算符 + +```mysql +逻辑与:&& 或 and +逻辑或:|| 或 or +逻辑非:! 或 not +逻辑异或: xor + +示例: +#查询薪资高于15000,并且性别是男的员工 +select * from t_employee where salary>15000 and gender='男'; +select * from t_employee where salary>15000 && gender='男'; + +select * from t_employee where salary>15000 & gender='男';#错误得不到值 &按位与 +select * from t_employee where (salary>15000) & (gender='男'); + +#查询薪资高于15000,或者did为1的员工 +select * from t_employee where salary>15000 or did = 1; +select * from t_employee where salary>15000 || did = 1; + +#查询薪资不在[15000,20000]范围的 +select * from t_employee where salary not between 15000 and 20000; +select * from t_employee where !(salary between 15000 and 20000); + +#查询薪资高于15000,或者did为1的员工,两者只能满足其一 +select * from t_employee where salary>15000 xor did = 1; +select * from t_employee where (salary>15000) ^ (did = 1); +``` + +### 关于null值的问题、 + +```mysql +#(1)判断时 +xx is null +xx is not null +xx <=> null + +#(2)计算时 +ifnull(xx,代替值) 当xx是null时,用代替值计算 + +示例: +#查询员工的实发工资,实发工资 = 薪资 + 薪资 * 奖金比例 +select ename , salary + salary * commission_pct "实发工资" from t_employee; #失败,当commission_pct为null,结果都为null + +select ename ,salary , commission_pct, salary + salary * ifnull(commission_pct,0) "实发工资" from t_employee; +``` + +### 位运算符 + +```mysql +左移:<< +右移:>> +按位与:& +按位或:| +按位异或:^ +按位取反:~ +``` + + + +# 作业 + +## 第1题:员工表 + +| **id** | **name** | **sex** | **tel** | **addr** | **salary** | +| ------ | -------- | ------- | ------------ | -------- | ---------- | +| 10001 | 张一一 | 男 | 13456789000 | 广东韶关 | 10010.58 | +| 10002 | 刘小红 | 女 | 13454319000 | 广东江门 | 12010.21 | +| 10003 | 李四 | 男 | 0751-1234567 | 广东佛山 | 10040.11 | +| 10004 | 刘小强 | 男 | 0755-5555555 | 广东深圳 | 15010.23 | +| 10005 | 王艳 | 女 | NULL | 广东广州 | 14050.16 | + +```mysql +CREATE DATABASE test03 CHARSET utf8; +USE test03; + +CREATE TABLE employee( + id INT, + `name` VARCHAR(20), + sex VARCHAR(20), + tel VARCHAR(20), + addr VARCHAR(50), + salary FLOAT +); + +INSERT INTO employee(id,`name`,sex,tel,addr,salary)VALUES +(10001,'张一一','男','13456789000','广东韶关',10010.58), +(10002,'刘小红','女','13454319000','广东江门',12010.21), +(10003,'李四','男','0751-1234567','广东佛山',10040.11), +(10004,'刘小强','男','0755-5555555','广东深圳',15010.23), +(10005,'王艳','男',NULL,'广东广州',14050.16); +``` + +**要求1:**查询出薪资在12000~13000之间的员工信息。 + +```mysql +SELECT * FROM employee WHERE salary BETWEEN 12000 AND 13000; +``` + +**要求2:**查询出姓“刘”的员工的工号,姓名,家庭住址。 + +```mysql +SELECT id,`name`,addr FROM employee WHERE `name` LIKE '刘%'; +``` + +**要求3:**将“李四”的家庭住址改为“广东韶关” + +```mysql +UPDATE employee SET addr = '广东韶关' WHERE `name` = '李四'; +``` + +**要求4:**查询出名字中带“小”的员工 + +```mysql +SELECT `name` FROM employee WHERE `name` LIKE '%小%'; +``` + +**要求5:**查询出薪资高于11000的男员工信息 + +```mysql +SELECT * FROM employee WHERE salary>11000 AND sex='男'; +``` + +**要求6:**查询没有登记电话号码的员工 + +```mysql +SELECT `name` FROM employee WHERE tel is NULL; +``` + +**要求7:**查询薪资高于12000或者家是广东深圳、广州的男员工 + +```mysql +SELECT `name` FROM employee WHERE sex = '男' AND salary = 12000 OR addr = '广东深圳' OR addr='广东广州'; +``` + +**要求8:**查询每个员工的年薪,显示“姓名、年薪” + +```mysql +SELECT `name`,salary FROM employee; +``` + + + +## 第2题:国家信息表 + +countries_info表中存储了国家名称、所属大陆、面积、人口和 GDP 值。 + +```mysql +DROP TABLE IF EXISTS `countries_info`; +CREATE TABLE `countries_info`( + `name` VARCHAR(100), + `continent` VARCHAR(100), + `area` INT, + population INT, + gdp BIGINT +); + +INSERT INTO countries_info VALUES +('Afghanistan','Asia',652230,25500100,20343000000), +('Albania','Europe',28748,2831741,12960000000), +('Algeria','Africa',2381741,37100000,188681000000), +('Andorra','Europe',468,78115,3712000000), +('Angola','Africa',1246700,20609294,100990000000); +``` + +表数据样例: + +```mysql ++-------------+-----------+---------+------------+--------------+ +| name | continent | area | population | gdp | ++-------------+-----------+---------+------------+--------------+ +| Afghanistan | Asia | 652230 | 25500100 | 20343000000 | +| Albania | Europe | 28748 | 2831741 | 12960000000 | +| Algeria | Africa | 2381741 | 37100000 | 188681000000 | +| Andorra | Europe | 468 | 78115 | 3712000000 | +| Angola | Africa | 1246700 | 20609294 | 100990000000 | ++-------------+-----------+---------+------------+--------------+ +``` + +**要求1:** 查询大国 的国家名称、人口和面积。 + +如果一个国家满足下述两个条件之一,则认为该国是 大国 : + +- 面积至少为 300万平方公里(即,3000000 km2) + +- 人口至少为 2500 万(即 25000000) + + ```mysql + SELECT `name`,area,population FROM countries_info WHERE area>3000000 OR population>=25000000; + ``` + +**要求2:**查询属于亚洲的国家名称、所属大陆、面积、人口和 GDP 值 + +```mysql +SELECT * FROM countries_info WHERE continent = 'Asia'; +``` + +**要求3:**查询国土面积不足1万平方公里且人口不走10万人的国家信息 + +```mysql +SELECT * FROM countries_info WHERE area<10000 AND population<100000; +``` + +**要求4:**查询国家名字中包含“o“字母的国家信息 + +```mysql +SELECT * FROM countries_info WHERE `name` LIKE '%o%'; +``` + +**要求5:**查询GDP值超过10000000000的国家信息 + +```mysql +SELECT * FROM countries_info WHERE gdp>10000000000; +``` + +**要求6:**查询每个国家的人均贡献GDP值(GDP/人口总数)并显示为“国家名、人口、GDP值、人均贡献GDP值” + +```mysql +SELECT `name` 国家名,population 人口,gdp GDP值,gdp/population AS 人均贡献GDP值 FROM countries_info; +``` + +**要求7:**查询人均贡献GDP值低于1000的国家信息。 + +```mysql +SELECT * FROM countries_info WHERE gdp/population<1000; +``` + +**要求8:**查询每个国家的人均国土面积(面积/人口总数)并显示为“国家名、面积、人口、人均国土面积值” + +```mysql +SELECT `name` 国家名,population 人口,gdp GDP值,area/population AS 人均国土面积值 FROM countries_info; +``` + diff --git "a/03 \350\265\226\345\277\203\345\246\215/2.28 \345\205\263\350\201\224\346\237\245\350\257\242.md" "b/03 \350\265\226\345\277\203\345\246\215/2.28 \345\205\263\350\201\224\346\237\245\350\257\242.md" new file mode 100644 index 0000000..9a4de38 --- /dev/null +++ "b/03 \350\265\226\345\277\203\345\246\215/2.28 \345\205\263\350\201\224\346\237\245\350\257\242.md" @@ -0,0 +1,540 @@ +# 2.28 关联查询 + +#### 分组函数 + +| **AVG(x) :求平均值** | **SUM(x):求总和** | +| ------------------------ | -------------------- | +| **MAX(x):求最大值** | **MIN(x):求最小值** | +| **COUNT(x):统计记录数** | | + +count(*)是对满足条件的(如果没有where条件,就是对所有记录)记录累加数量 + +count(常量值)等价于count(*) + +count(字段名/表达式) 只统计非NULL值的记录数 + +#### 单行函数 + +##### 数学函数 + +| 函数 | 用法 | +| ------------- | ------------------------------------------------------------ | +| ABS(x) | 返回x的绝对值 | +| CEIL(x) | 返回大于x的最小整数值 | +| FLOOR(x) | 返回小于x的最大整数值 | +| MOD(x,y) | 返回x/y的模 | +| RAND() | 返回0~1的随机值 | +| ROUND(x,y) | 返回参数x的四舍五入的有y位的小数的值 | +| TRUNCATE(x,y) | 返回数字x截断为y位小数的结果 | +| FORMAT(x,y) | 强制保留小数点后y位,整数部分超过三位的时候以逗号分割,并且返回的结果是文本类型的 | +| SQRT(x) | 返回x的平方根 | +| POW(x,y) | 返回x的y次方 | + +##### 字符串函数 + +| 函数 | 功能描述 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| CONCAT(S1,S2,……Sn) | 连接S1,S2,……Sn为一个字符串 | +| CONCAT_WS(s,S1,S2,……Sn) | 同CONCAT(S1,S2,…)函数,但每个字符串之间要加上s | +| CHAR_LENGTH(s) | 返回字符串s的字符数 | +| LENGTH(s) | 返回字符串s的字节数,和字符集有关 | +| LOCATE(str1,str)或 POSITION(str1 in str)或 INSTR(str,str1) | 返回子字符串str1在str中的开始位置 | +| UPPER(s)或UCASE(s) | 将字符串s的所有字母转成大写字母 | +| LOWER(s)或LCASE(s) | 将字符串s的所有字母转成小写字母 | +| LEFT(s,n) | 返回字符串s最左边的n个字符 | +| RIGHT(s,n) | 返回字符串s最右边的n个字符 | +| LPAD(str,len,pad) | 用字符串pad对str最左边进行填充直到str的长度达到len | +| RPAD(str,len,pad) | 用字符串pad对str最右边进行填充直到str的长度达到len | +| LTRIM(s) | 去掉字符串s左侧的空格 | +| RTRIM(s) | 去掉字符串s右侧的空格 | +| TRIM(s) | 去掉字符串s开始与结尾的空格 | +| TRIM([BOTH] s1 FROM s) | 去掉字符串s开始与结尾的s1 | +| TRIM([LEADING] s1 FROM s) | 去掉字符串s开始处的s1 | +| TRIM([TRAILING]s1 FROM s) | 去掉字符串s结尾处的s1 | +| INSERT(str,index,len,instr) | 将字符串str从index位置开始len个字符的替换为字符串instr | +| REPLACE(str,a,b) | 用字符串b替换字符串str中所有出现的字符串a | +| REPEAT(str,n) | 返回str重复n次的结果 | +| REVERSE(s) | 将字符串反转 | +| STRCMP(s1,s2) | 比较字符串s1,s2 | +| SUBSTRING(s,index,len) | 返回从字符串s的index位置截取len个字符 | +| SUBSTRING_INDEX(str, 分隔符,count) | 如果count是正数,那么从左往右数,第n个分隔符的左边的全部内容。例如,substring_index("www.mxdx.com",".",1)是"www"。如果count是负数,那么从右边开始数,第n个分隔符右边的所有内容。例如,substring_index("www.mxdx.com",".",-1)是"com"。 | + +##### 日期时间函数 + +| 函数 | 功能描述 | +| ------------------------------------------------------------ | --------------------------------------------------- | +| CURDATE()或CURRENT_DATE() | 返回当前系统日期 | +| CURTIME()或CURRENT_TIME() | 返回当前系统时间 | +| NOW()/SYSDATE()/CURRENT_TIMESTAMP()/ LOCALTIME()/LOCALTIMESTAMP() | 返回当前系统日期时间 | +| UTC_DATE()/UTC_TIME() | 返回当前UTC日期值/时间值 | +| UNIX_TIMESTAMP(date) | 返回一个UNIX时间戳 | +| YEAR(date)/MONTH(date)/DAY(date)/ HOUR(time)/MINUTE(time)/SECOND(time) | 返回具体的时间值 | +| EXTRACT(type FROM date) | 从日期中提取一部分值 | +| DAYOFMONTH(date)/DAYOFYEAR(date) | 返回一月/年中第几天 | +| WEEK(date)/WEEKOFYEAR(date) | 返回一年中的第几周 | +| DAYOFWEEK() | 返回周几,注意,周日是1,周一是2,…周六是7 | +| WEEKDAY(date) | 返回周几,注意,周一是0,周二是1,…周日是6 | +| DAYNAME(date) | 返回星期,MONDAY,TUESDAY,…SUNDAY | +| MONTHNAME(date) | 返回月份,January,… | +| DATEDIFF(date1,date2)/TIMEDIFF(time1,time2) | 返回date1-date2的日期间隔/返回time1-time2的时间间隔 | +| DATE_ADD(date,INTERVAL expr type)或ADDDATE/DATE_SUB/SUBDATE | 返回与给定日期相差INTERVAL时间段的日期 | +| ADDTIME(time,expr)/SUBTIME(time,expr) | 返回给定时间加上/减去expr的时间值 | +| DATE_FORMAT(datetime,fmt)/ TIME_FORMAT(time,fmt) | 按照字符串fmt格式化日期datetime值/时间time值 | +| STR_TO_DATE(str,fmt) | 按照字符串fmt对str进行解析,解析为一个日期 | +| GET_FORMAT(val_type,format_type) | 返回日期时间字符串的显示格式 | + +函数中日期时间类型说明 + +| 参数类型 | 描述 | 参数类型 | 描述 | +| -------- | ---- | ------------- | -------- | +| YEAR | 年 | YEAR_MONTH | 年月 | +| MONTH | 月 | DAY_HOUR | 日时 | +| DAY | 日 | DAY_MINUTE | 日时分 | +| HOUR | 时 | DAY_SECOND | 日时分秒 | +| MINUTE | 分 | HOUR_MINUTE | 时分 | +| SECOND | 秒 | HOUR_SECOND | 时分秒 | +| WEEK | 星期 | MINUTE_SECOND | 分秒 | +| QUARTER | 一刻 | | | + +函数中format参数说明 + +| 格式符 | 说明 | 格式符 | 说明 | +| ------ | --------------------------------------------------------- | ------ | ------------------------------------------------------- | +| %Y | 4位数字表示年份 | %y | 两位数字表示年份 | +| %M | 月名表示月份(January,…) | %m | 两位数字表示月份(01,02,03,…) | +| %b | 缩写的月名(Jan.,Feb.,…) | %c | 数字表示月份(1,2,3…) | +| %D | 英文后缀表示月中的天数(1st,2nd,3rd,…) | %d | 两位数字表示表示月中的天数(01,02,…) | +| %e | 数字形式表示月中的天数(1,2,3,…) | %p | AM或PM | +| %H | 两位数字表示小数,24小时制(01,02,03,…) | %h和%I | 两位数字表示小时,12小时制(01,02,03,…) | +| %k | 数字形式的小时,24小时制(1,2,3,…) | %l | 数字表示小时,12小时制(1,2,3,…) | +| %i | 两位数字表示分钟(00,01,02,…) | %S和%s | 两位数字表示秒(00,01,02,…) | +| %T | 时间,24小时制(hh:mm:ss) | %r | 时间,12小时制(hh:mm:ss)后加AM或PM | +| %W | 一周中的星期名称(Sunday,…) | %a | 一周中的星期缩写(Sun.,Mon.,Tues.,…) | +| %w | 以数字表示周中的天数(0=Sunday,1=Monday,…) | %j | 以3位数字表示年中的天数(001,002,…) | +| %U | 以数字表示的的第几周(1,2,3,…) 其中Sunday为周中的第一天 | %u | 以数字表示年中的年份(1,2,3,…) 其中Monday为周中第一天 | +| %V | 一年中第几周(01~53),周日为每周的第一天,和%X同时使用 | %X | 4位数形式表示该周的年份,周日为每周第一天,和%V同时使用 | +| %v | 一年中第几周(01~53),周一为每周的第一天,和%x同时使用 | %x | 4位数形式表示该周的年份,周一为每周第一天,和%v同时使用 | +| %% | 表示% | | | + +GET_FORMAT函数中val_type 和format_type参数说明 + +| 值类型 | 格式化类型 | 显示格式字符串 | +| -------- | ---------- | ----------------- | +| DATE | EUR | %d.%m.%Y | +| DATE | INTERVAL | %Y%m%d | +| DATE | ISO | %Y-%m-%d | +| DATE | JIS | %Y-%m-%d | +| DATE | USA | %m.%d.%Y | +| TIME | EUR | %H.%i.%s | +| TIME | INTERVAL | %H%i%s | +| TIME | ISO | %H:%i:%s | +| TIME | JIS | %H:%i:%s | +| TIME | USA | %h:%i:%s %p | +| DATETIME | EUR | %Y-%m-%d %H.%i.%s | +| DATETIME | INTERVAL | %Y%m%d %H%i%s | +| DATETIME | ISO | %Y-%m-%d %H:%i:%s | +| DATETIME | JIS | %Y-%m-%d %H:%i:%s | +| DATETIME | USA | %Y-%m-%d %H.%i.%s | + +#### 加密函数 + +| 函数 | 用法 | +| --------------------- | ------------------------------------------------------------ | +| password(str) | 返回字符串str的加密版本,41位长的字符串 | +| md5(str) | 返回字符串str的md5值,也是一种加密方式 | +| SHA(str) | 返回字符串str的sha算法加密字符串,40位十六进制值的密码字符串 | +| SHA2(str,hash_length) | 返回字符串str的sha算法加密字符串,密码字符串的长度是hash_length/4。hash_length可以是224、256、384、512、0,其中0等同于256。 | + +#### 条件判断 + +| 函数 | 功能 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| IF(value,t,f) | 如果value是真,返回t,否则返回f | +| IFNULL(value1,value2) | 如果value1不为空,返回value1,否则返回value2 | +| CASE WHEN 条件1 THEN result1 WHEN 条件2 THEN result2 … ELSE resultn END | 依次判断条件,哪个条件满足了,就返回对应的result,所有条件都不满足就返回ELSE的result。如果没有单独的ELSE子句,当所有WHEN后面的条件都不满足时则返回NULL值结果。等价于Java中if...else if.... | +| CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值2 THEN 值2 … ELSE 值n END | 判断表达式expr与哪个常量值匹配,找到匹配的就返回对应值,都不匹配就返回ELSE的值。如果没有单独的ELSE子句,当所有WHEN后面的常量值都不匹配时则返回NULL值结果。等价于Java中switch....case | + +#### 七种查询 + +###### (1)内连接 inner join + +###### (2)外连接 outer join + +左外连接 left outer join 或 left join + +右外连接 right outer join 或 right join + +全外连接 full outer join 或 full join -- union 代替 + +但是,mysql不支持全外连接,没有full join。 + +mysql使用union关键字合并其他的查询结果实现全外连接的效果。 + +内连接 ==> A∩B + +左连接 ==> A 或 A-A∩B + +右连接 ==> B 或 B-A∩B + +全外连接 ==> A∪B 或 A∪B - A∩B + +左连接的A union 右连接的B 得到 A∪B + +左连接的A-A∩B union 右连接B-A∩B 得到 A∪B - A∩B + +###### 使用union实现全外连接的效果 + +(1)A∪B + +转换为 左连接的A union 右连接的B + +(2)A∪B - A∩B + +转换为 左连接的A-A∩B union 右连接的B-A∩B + +###### 自连接 + +进行关联查询的两个表,本质上是一个表。 + +分析员工表: + +有一个字段是mid,是领导编号,即表示这个员工归谁管。 + +那么这里的领导编号其实就是这个领导他作为员工的员工编号。 + +通过取别名的方式,把一张表虚拟成两张表。 + +当然,也要关联字段。 + +# 作业 + +1. 设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示。用SQL语句创建四个表并完成相关题目。 + +2. **数据库的表结构** + +表(一)Student (学生表) + +| 属性名 | 数据类型 | 可否为空 | 含义 | +| --------- | ------------ | -------- | ------------ | +| Sno | varchar (20) | 否 | 学号(主码) | +| Sname | varchar (20) | 否 | 学生姓名 | +| Ssex | varchar (20) | 否 | 学生性别 | +| Sbirthday | datetime | 可 | 学生出生年月 | +| Class | varchar (20) | 可 | 学生所在班级 | + +表(二)Course(课程表) + +| 属性名 | 数据类型 | 可否为空 | 含义 | +| ------ | ------------ | -------- | ---------------- | +| Cno | varchar (20) | 否 | 课程号(主码) | +| Cname | varchar (20) | 否 | 课程名称 | +| Tno | varchar (20) | 否 | 教工编号(外码) | + +表(三)Score(成绩表) + +| 属性名 | 数据类型 | 可否为空 | 含义 | +| -------------- | ------------ | -------- | -------------- | +| Sno | varchar (20) | 否 | 学号(外码) | +| Cno | varchar (20) | 否 | 课程号(外码) | +| Degree | Decimal(4,1) | 可 | 成绩 | +| 主码:Sno+ Cno | | | | + +表(四)Teacher(教师表) + +| 属性名 | 数据类型 | 可否为空 | 含义 | +| --------- | ------------ | -------- | ---------------- | +| Tno | varchar (20) | 否 | 教工编号(主码) | +| Tname | varchar (20) | 否 | 教工姓名 | +| Tsex | varchar (20) | 否 | 教工性别 | +| Tbirthday | datetime | 可 | 教工出生年月 | +| Prof | varchar (20) | 可 | 职称 | +| Depart | varchar (20) | 否 | 教工所在部门 | + +```mysql +create database test03 charset utf8; + +use test03; + +CREATE TABLE `student` ( + `Sno` varchar(20) NOT NULL COMMENT '学号', + `Sname` varchar(20) NOT NULL COMMENT '学生姓名', + `Ssex` varchar(20) NOT NULL COMMENT '学生性别', + `Sbirthday` datetime DEFAULT NULL COMMENT '学生出生年月', + `Class` varchar(20) DEFAULT NULL COMMENT '学生所在班级', + PRIMARY KEY (`Sno`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +insert into student values +('108','曾华','男','1977-9-1','95033'), +('105','匡明','男','1975-10-2','95031'), +('107','王丽','女','1976-1-23','95033'), +('101','李军','男','1976-2-20','95033'), +('109','王芳','女','1975-2-10','95031'), +('103','陆君','男','1974-6-3','95031'); + +CREATE TABLE `teacher` ( + `Tno` varchar(20) NOT NULL COMMENT '教工编号', + `Tname` varchar(20) NOT NULL COMMENT '教工姓名', + `Tsex` varchar(20) NOT NULL COMMENT '教工性别', + `Tbirthday` datetime DEFAULT NULL COMMENT '教工出生年月', + `Prof` varchar(20) DEFAULT NULL COMMENT '职称', + `Depart` varchar(20) NOT NULL COMMENT '教工所在部门', + PRIMARY KEY (`Tno`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +insert into teacher values +('804','李诚','男','1958-12-2','副教授','计算机系'), +('856','张旭','男','1969-3-12','讲师','电子工程系'), +('825','王萍','女','1972-5-5','助教','计算机系'), +('831','刘冰','女','1977-8-14','助教','电子工程系'); + +CREATE TABLE `course` ( + `Cno` varchar(20) NOT NULL COMMENT '课程号', + `Cname` varchar(20) NOT NULL COMMENT '课程名称', + `Tno` varchar(20) NOT NULL COMMENT '教工编号', + PRIMARY KEY (`Cno`), + KEY `Tno` (`Tno`), + CONSTRAINT `course_ibfk_1` FOREIGN KEY (`Tno`) REFERENCES `teacher` (`Tno`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +insert into course values +('3-105','计算机导论','825'), +('3-245','操作系统','804'), +('6-166','数字电路','856'), +('9-888','高等数学','831'); + +CREATE TABLE `score` ( + `Sno` varchar(20) NOT NULL COMMENT '学号', + `Cno` varchar(20) NOT NULL COMMENT '课程号', + `Degree` decimal(4,1) DEFAULT NULL COMMENT '成绩', + PRIMARY KEY (`Sno`,`Cno`), + KEY `Cno` (`Cno`), + CONSTRAINT `score_ibfk_1` FOREIGN KEY (`Cno`) REFERENCES `course` (`Cno`), + CONSTRAINT `score_ibfk_2` FOREIGN KEY (`Sno`) REFERENCES `student` (`Sno`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +insert into score values +('103','3-245',86), +('105','3-245',75), +('109','3-245',68), +('103','3-105',92), +('105','3-105',88), +('109','3-105',76), +('101','3-105',64), +('107','3-105',91), +('108','3-105',78), +('101','6-166',85), +('107','6-166',79), +('108','6-166',81); +``` + +3. **数据库中的数据**: + +-- 1,查询所有学生,都学了哪些课程,要显示学生信息和课程信息 + +```mysql +select sname,course.cname from student inner join score on student.sno=score.sno left join course on score.cno=course.cno; +``` + +-- 2,查询没有学生的教师的所有信息 + +表(一)Student + +| Sno | Sname | Ssex | Sbirthday | class | +| ---- | ----- | ---- | --------- | ----- | +| 108 | 曾华 | 男 | 1977-9-1 | 95033 | +| 105 | 匡明 | 男 | 1975-10-2 | 95031 | +| 107 | 王丽 | 女 | 1976-1-23 | 95033 | +| 101 | 李军 | 男 | 1976-2-20 | 95033 | +| 109 | 王芳 | 女 | 1975-2-10 | 95031 | +| 103 | 陆君 | 男 | 1974-6-3 | 95031 | + +表(二)Course + +| Cno | Cname | Tno | +| ----- | ---------- | ---- | +| 3-105 | 计算机导论 | 825 | +| 3-245 | 操作系统 | 804 | +| 6-166 | 数字电路 | 856 | +| 9-888 | 高等数学 | 831 | + +表(三)Score + +| Sno | Cno | Degree | +| ---- | ----- | ------ | +| 103 | 3-245 | 86 | +| 105 | 3-245 | 75 | +| 109 | 3-245 | 68 | +| 103 | 3-105 | 92 | +| 105 | 3-105 | 88 | +| 109 | 3-105 | 76 | +| 101 | 3-105 | 64 | +| 107 | 3-105 | 91 | +| 108 | 3-105 | 78 | +| 101 | 6-166 | 85 | +| 107 | 6-166 | 79 | +| 108 | 6-166 | 81 | + +表(四)Teacher + +| Tno | Tname | Tsex | Tbirthday | Prof | Depart | +| ---- | ----- | ---- | --------- | ------ | ---------- | +| 804 | 李诚 | 男 | 1958-12-2 | 副教授 | 计算机系 | +| 856 | 张旭 | 男 | 1969-3-12 | 讲师 | 电子工程系 | +| 825 | 王萍 | 女 | 1972-5-5 | 助教 | 计算机系 | +| 831 | 刘冰 | 女 | 1977-8-14 | 助教 | 电子工程系 | + +3. **数据库中的数据**: + +-- 1,查询所有学生,都学了哪些课程,要显示学生信息和课程信息 + +```mysql +select sname,course.cname from student inner join score on student.sno=score.sno left join course on score.cno=course.cno; +``` + +-- 2,查询没有学生的教师的所有信息 + +```mysql +select Teacher.Tno,Tname,Tsex,Tbirthday,Prof,Depart from Teacher left join Course on Teacher.Tno = Course.Tno left join Score on Course.Cno = Score.Cno where Score.Sno is null; +``` + +4. ##### 查询: + +① 查询Score表中的最高分的学生学号和课程号。 + +```mysql +select sno,cno from score where degree=(select max(degree) from score); +``` + +② 查询所有学生的Sname、Cno和Degree列。 + +```mysql +select Sname,Cno,Degree from Student,Score where Student.Sno=Score.Sno; +``` + +③ 查询所有学生的Sno、Cname和Degree列。 + +```mysql +select sno,cname,degree from course,score where course.cno = score.cno; +``` + +④ 查询所有学生的Sname、Cname和Degree列。 + +```mysql +select sname,cname,degree from student,course,score where student.sno=score.sno and course.cno=score.cno; +``` + +⑤ 查询“95033”班学生的平均分。 + +```mysql +select cno,avg(degree) from score where sno in (select sno from student where class='95031') group by cno; +``` + +⑥ 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 + +```mysql +select * from score where cno='3-105' and degree>(select degree from score where sno='109' and cno='3-105'); +``` + +⑦ 查询score中选学多门课程的同学中分数为非最高分成绩的记录。 + +```mysql +select * from Score a where Degree <(select MAX(degree) from Score b where a.Cno=b.Cno) and Sno in(select Sno from Score group by Sno having count(*)>1); +``` + +⑧ 查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 + +```mysql +select * from Student,Score where Student.Sno=Score.Sno and Score.Degree>(select Degree from Score where Cno='3-105' and Sno='109'); +``` + +⑨ 查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 + +```mysql +select sno,sname,sbirthday from student where sbirthday in (select sbirthday from student where sno='108'); +``` + +⑩ 查询“张旭“教师任课的学生成绩。 + +```mysql +select Sname,Degree from Student,Score where Student.Sno=Score.Sno and Cno ='6-166'; +``` + +11 查询选修某课程的同学人数多于5人的教师姓名。 + +```mysql +Select * from teacher where tno=(Select tno from course where cno=(Select cno from score group by cno having count(*)>5)); +``` + +12 查询出“计算机系“教师所教课程的成绩表。 + +```mysql +select * from score where cno in(select cno from course where tno in(select tno from teacher where depart='计算机系')); +``` + +13 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 + +```mysql +select Tname,Prof from Teacher a where Prof not in(select Prof from Teacher b where a.Depart!=b.Depart); +``` + +14 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 + +```mysql +select * from score where cno='3-105' and degree>any(select degree from score where cno='3-245') order by degree desc; +``` + +15 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. + +```mysql +select * from score where cno='3-105' and degree>all(select degree from score where cno='3-245'); +``` + +16 查询成绩比该课程平均成绩低的同学的成绩表。 + +```mysql +select Sno,Cno,Degree from Score a where a.Degree<(select AVG(Degree) from Score b where a.Cno=b.Cno); +``` + +17 查询所有任课教师的Tname和Depart. + +```mysql +select Tname,Depart from Teacher where Tname in (select distinct Tname from Teacher,Course,Score where Teacher.Tno=Course.Tno and Course.Cno=Score.Cno); +``` + +18 查询所有未讲课的教师的Tname和Depart. + +```mysql +select Tname,Depart from Teacher where Tname not in (select distinct Tname from Teacher,Course,Score where Teacher.Tno=Course.Tno and Course.Cno=Score.Cno); +``` + +19 查询“男”教师及其所上的课程。 + +```mysql +select Tname,Cname from Teacher,Course where Tsex='男' and Teacher.Tno=Course.Tno; +``` + +20 查询最高分同学的Sno、Cno和Degree列。 + +```mysql +select sno,cno,degree from score where degree = (select max(degree) from score); +``` + +21 查询和“李军”同性别的所有同学的Sname. + +```mysql +select sname from student where ssex = (select ssex from student where sname = '李军'); +``` + +22 查询和“李军”同性别并同班的同学Sname. + +```mysql +select sname from student where ssex = (select ssex from student where sname = '李军') and class = (select class from student where sname = '李军'); +``` + +23 查询所有选修“计算机导论”课程的“男”同学的成绩表。 + +```mysql +select sname,ssex,degree from student s,course c,score sc where s.sno=sc.sno and sc.cno=c.cno and c.cname = '计算机导论' and s.ssex = '男'; +``` + -- Gitee From 9aadde42b3e36cdabbbca38eeb1dfcc65ae154f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=96=E5=BF=83=E5=A6=8D?= <12071525+lai-xinyan@user.noreply.gitee.com> Date: Wed, 1 Mar 2023 14:39:33 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=2003?= =?UTF-8?q?=E8=B5=96=E5=BF=83=E5=A6=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\350\247\204\350\214\203\347\255\211.md" | 87 --- .../2.17 MySQL\350\257\255\345\217\245.md" | 624 ------------------ .../2.21 \347\272\246\346\235\237.md" | 599 ----------------- ...14\350\277\220\347\256\227\347\254\246.md" | 361 ---------- 4 files changed, 1671 deletions(-) delete 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" delete mode 100644 "03\350\265\226\345\277\203\345\246\215/2.17 MySQL\350\257\255\345\217\245.md" delete mode 100644 "03\350\265\226\345\277\203\345\246\215/2.21 \347\272\246\346\235\237.md" delete mode 100644 "03\350\265\226\345\277\203\345\246\215/2.23 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.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" deleted file mode 100644 index 9ece599..0000000 --- "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 8584ca5..0000000 --- "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 5031aef..0000000 --- "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; -``` diff --git "a/03\350\265\226\345\277\203\345\246\215/2.23 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" "b/03\350\265\226\345\277\203\345\246\215/2.23 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" deleted file mode 100644 index 6b0181a..0000000 --- "a/03\350\265\226\345\277\203\345\246\215/2.23 \346\237\245\350\257\242select\350\257\255\345\217\245\345\222\214\350\277\220\347\256\227\347\254\246.md" +++ /dev/null @@ -1,361 +0,0 @@ -# 2.23 查询select语句和运算符 - -### select语句格式: - -```mysql -SELECT 字段列表 FROM 表名称; - -SELECT 字段列表 FROM 表名称 WHERE 条件; -``` - -### 使用别名(临时名称) - -```mysql -select 字段名1 as "别名1", 字段名2 as "别名2" from 表名称 as 别名; -``` - -- 列的别名有空格时,请加双引号。**==列的别名==中没有空格时,双引号可以加也可以不加**。 -- ==**表的别名不能加双引号**==,表的别名中间不能包含空格。 -- as大小写都可以,as也完全可以省略。 - -```mysql -示例: -mysql> select id "学号",name "姓名" from student; -+------+------+ -| 学号 | 姓名 | -+------+------+ -| 1 | 张三 | -| 2 | 李四 | -+------+------+ -2 rows in set (0.00 sec) - -mysql> select id 学号,name 姓名 from student; -+------+------+ -| 学号 | 姓名 | -+------+------+ -| 1 | 张三 | -| 2 | 李四 | -+------+------+ -2 rows in set (0.00 sec) -``` - -### 结果去重 - -mysql可以在查询结果中使用distinct关键字去重。 - -```mysql -select distinct 字段列表 from 表名称 【where 条件】; - -示例: -select distinct did from t_employee; -``` - -### 算术运算符 - -```mysql -加:+ - 在MySQL +就是求和,没有字符串拼接 -减:- -乘:* -除:/ div(只保留整数部分) - div:两个数相除只保留整数部分 - /:数学中的除 -模:% mod - -mysql中没有 +=等运算符 -``` - -### 比较运算符 - -```mysql -大于:> -小于:< -大于等于:>= -小于等于:>= -等于:= 不能用于null判断 -不等于:!= 或 <> 不能用于null判断 -判断是null 用 is null 或 用 <=> null -判断不是null is not null -``` - -### 区间或集合范围比较运算符 - -```mysql -区间范围:between x and y - not between x and y -集合范围:in (x,x,x) - not in(x,x,x) -between ... and ... 结果包含两端的边界 - -示例: -#查询薪资在[10000,15000] -select * from t_employee where salary>=10000 && salary<=15000; -select * from t_employee where salary between 10000 and 15000; - -#查询籍贯在这几个地方的 -select * from t_employee where work_place in ('北京', '浙江', '江西'); - -#查询薪资不在[10000,15000] -select * from t_employee where salary not between 10000 and 15000; - -#查询籍贯不在这几个地方的 -select * from t_employee where work_place not in ('北京', '浙江', '江西'); -``` - -### 模糊匹配比较运算符 - -%:代表任意个字符 - -_:代表一个字符,如果两个下划线代表两个字符 - -```mysql -示例: -#查询名字中包含'冰'字 -select * from t_employee where ename like '%冰%'; - -#查询名字以‘雷'结尾的 -select * from t_employee where ename like '%远'; - -#查询名字以’李'开头 -select * from t_employee where ename like '李%'; - -#查询名字有冰这个字,但是冰的前面只能有1个字 -select * from t_employee where ename like '_冰%'; - -#查询当前mysql数据库的字符集情况 -show variables like '%character%'; -``` - -### 逻辑运算符 - -```mysql -逻辑与:&& 或 and -逻辑或:|| 或 or -逻辑非:! 或 not -逻辑异或: xor - -示例: -#查询薪资高于15000,并且性别是男的员工 -select * from t_employee where salary>15000 and gender='男'; -select * from t_employee where salary>15000 && gender='男'; - -select * from t_employee where salary>15000 & gender='男';#错误得不到值 &按位与 -select * from t_employee where (salary>15000) & (gender='男'); - -#查询薪资高于15000,或者did为1的员工 -select * from t_employee where salary>15000 or did = 1; -select * from t_employee where salary>15000 || did = 1; - -#查询薪资不在[15000,20000]范围的 -select * from t_employee where salary not between 15000 and 20000; -select * from t_employee where !(salary between 15000 and 20000); - -#查询薪资高于15000,或者did为1的员工,两者只能满足其一 -select * from t_employee where salary>15000 xor did = 1; -select * from t_employee where (salary>15000) ^ (did = 1); -``` - -### 关于null值的问题、 - -```mysql -#(1)判断时 -xx is null -xx is not null -xx <=> null - -#(2)计算时 -ifnull(xx,代替值) 当xx是null时,用代替值计算 - -示例: -#查询员工的实发工资,实发工资 = 薪资 + 薪资 * 奖金比例 -select ename , salary + salary * commission_pct "实发工资" from t_employee; #失败,当commission_pct为null,结果都为null - -select ename ,salary , commission_pct, salary + salary * ifnull(commission_pct,0) "实发工资" from t_employee; -``` - -### 位运算符 - -```mysql -左移:<< -右移:>> -按位与:& -按位或:| -按位异或:^ -按位取反:~ -``` - - - -# 作业 - -## 第1题:员工表 - -| **id** | **name** | **sex** | **tel** | **addr** | **salary** | -| ------ | -------- | ------- | ------------ | -------- | ---------- | -| 10001 | 张一一 | 男 | 13456789000 | 广东韶关 | 10010.58 | -| 10002 | 刘小红 | 女 | 13454319000 | 广东江门 | 12010.21 | -| 10003 | 李四 | 男 | 0751-1234567 | 广东佛山 | 10040.11 | -| 10004 | 刘小强 | 男 | 0755-5555555 | 广东深圳 | 15010.23 | -| 10005 | 王艳 | 女 | NULL | 广东广州 | 14050.16 | - -```mysql -CREATE DATABASE test03 CHARSET utf8; -USE test03; - -CREATE TABLE employee( - id INT, - `name` VARCHAR(20), - sex VARCHAR(20), - tel VARCHAR(20), - addr VARCHAR(50), - salary FLOAT -); - -INSERT INTO employee(id,`name`,sex,tel,addr,salary)VALUES -(10001,'张一一','男','13456789000','广东韶关',10010.58), -(10002,'刘小红','女','13454319000','广东江门',12010.21), -(10003,'李四','男','0751-1234567','广东佛山',10040.11), -(10004,'刘小强','男','0755-5555555','广东深圳',15010.23), -(10005,'王艳','男',NULL,'广东广州',14050.16); -``` - -**要求1:**查询出薪资在12000~13000之间的员工信息。 - -```mysql -SELECT * FROM employee WHERE salary BETWEEN 12000 AND 13000; -``` - -**要求2:**查询出姓“刘”的员工的工号,姓名,家庭住址。 - -```mysql -SELECT id,`name`,addr FROM employee WHERE `name` LIKE '刘%'; -``` - -**要求3:**将“李四”的家庭住址改为“广东韶关” - -```mysql -UPDATE employee SET addr = '广东韶关' WHERE `name` = '李四'; -``` - -**要求4:**查询出名字中带“小”的员工 - -```mysql -SELECT `name` FROM employee WHERE `name` LIKE '%小%'; -``` - -**要求5:**查询出薪资高于11000的男员工信息 - -```mysql -SELECT * FROM employee WHERE salary>11000 AND sex='男'; -``` - -**要求6:**查询没有登记电话号码的员工 - -```mysql -SELECT `name` FROM employee WHERE tel is NULL; -``` - -**要求7:**查询薪资高于12000或者家是广东深圳、广州的男员工 - -```mysql -SELECT `name` FROM employee WHERE sex = '男' AND salary = 12000 OR addr = '广东深圳' OR addr='广东广州'; -``` - -**要求8:**查询每个员工的年薪,显示“姓名、年薪” - -```mysql -SELECT `name`,salary FROM employee; -``` - - - -## 第2题:国家信息表 - -countries_info表中存储了国家名称、所属大陆、面积、人口和 GDP 值。 - -```mysql -DROP TABLE IF EXISTS `countries_info`; -CREATE TABLE `countries_info`( - `name` VARCHAR(100), - `continent` VARCHAR(100), - `area` INT, - population INT, - gdp BIGINT -); - -INSERT INTO countries_info VALUES -('Afghanistan','Asia',652230,25500100,20343000000), -('Albania','Europe',28748,2831741,12960000000), -('Algeria','Africa',2381741,37100000,188681000000), -('Andorra','Europe',468,78115,3712000000), -('Angola','Africa',1246700,20609294,100990000000); -``` - -表数据样例: - -```mysql -+-------------+-----------+---------+------------+--------------+ -| name | continent | area | population | gdp | -+-------------+-----------+---------+------------+--------------+ -| Afghanistan | Asia | 652230 | 25500100 | 20343000000 | -| Albania | Europe | 28748 | 2831741 | 12960000000 | -| Algeria | Africa | 2381741 | 37100000 | 188681000000 | -| Andorra | Europe | 468 | 78115 | 3712000000 | -| Angola | Africa | 1246700 | 20609294 | 100990000000 | -+-------------+-----------+---------+------------+--------------+ -``` - -**要求1:** 查询大国 的国家名称、人口和面积。 - -如果一个国家满足下述两个条件之一,则认为该国是 大国 : - -- 面积至少为 300万平方公里(即,3000000 km2) - -- 人口至少为 2500 万(即 25000000) - - ```mysql - SELECT `name`,area,population FROM countries_info WHERE area>3000000 OR population>=25000000; - ``` - -**要求2:**查询属于亚洲的国家名称、所属大陆、面积、人口和 GDP 值 - -```mysql -SELECT * FROM countries_info WHERE continent = 'Asia'; -``` - -**要求3:**查询国土面积不足1万平方公里且人口不走10万人的国家信息 - -```mysql -SELECT * FROM countries_info WHERE area<10000 AND population<100000; -``` - -**要求4:**查询国家名字中包含“o“字母的国家信息 - -```mysql -SELECT * FROM countries_info WHERE `name` LIKE '%o%'; -``` - -**要求5:**查询GDP值超过10000000000的国家信息 - -```mysql -SELECT * FROM countries_info WHERE gdp>10000000000; -``` - -**要求6:**查询每个国家的人均贡献GDP值(GDP/人口总数)并显示为“国家名、人口、GDP值、人均贡献GDP值” - -```mysql -SELECT `name` 国家名,population 人口,gdp GDP值,gdp/population AS 人均贡献GDP值 FROM countries_info; -``` - -**要求7:**查询人均贡献GDP值低于1000的国家信息。 - -```mysql -SELECT * FROM countries_info WHERE gdp/population<1000; -``` - -**要求8:**查询每个国家的人均国土面积(面积/人口总数)并显示为“国家名、面积、人口、人均国土面积值” - -```mysql -SELECT `name` 国家名,population 人口,gdp GDP值,area/population AS 人均国土面积值 FROM countries_info; -``` - -- Gitee