From 67845b29c25028d608983767caae6496201dc10b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?5=E5=8F=B7=E6=9E=97=E4=BC=9F=E5=BD=AC?= <2401916501@qq.com> Date: Wed, 22 Feb 2023 00:22:41 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E2=80=9C=E7=BA=A6=E6=9D=9F=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E5=92=8C=E7=AC=94=E8=AE=B0=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...56\345\272\223\347\261\273\345\236\213.md" | 0 .../20230218 DDL\345\222\214DMLl.md" | 0 ...60\345\222\214\344\275\234\344\270\232.md" | 681 ++++++++++++++++++ 3 files changed, 681 insertions(+) rename "05 \346\236\227\344\274\237\345\275\254/2.16\346\225\260\346\215\256\345\272\223\347\261\273\345\236\213.md" => "05 \346\236\227\344\274\237\345\275\254/20230216 \346\225\260\346\215\256\345\272\223\347\261\273\345\236\213.md" (100%) rename "05 \346\236\227\344\274\237\345\275\254/2.18DDL\345\222\214DMLl.md" => "05 \346\236\227\344\274\237\345\275\254/20230218 DDL\345\222\214DMLl.md" (100%) create mode 100644 "05 \346\236\227\344\274\237\345\275\254/20230220 \347\272\246\346\235\237\347\254\224\350\256\260\345\222\214\344\275\234\344\270\232.md" diff --git "a/05 \346\236\227\344\274\237\345\275\254/2.16\346\225\260\346\215\256\345\272\223\347\261\273\345\236\213.md" "b/05 \346\236\227\344\274\237\345\275\254/20230216 \346\225\260\346\215\256\345\272\223\347\261\273\345\236\213.md" similarity index 100% rename from "05 \346\236\227\344\274\237\345\275\254/2.16\346\225\260\346\215\256\345\272\223\347\261\273\345\236\213.md" rename to "05 \346\236\227\344\274\237\345\275\254/20230216 \346\225\260\346\215\256\345\272\223\347\261\273\345\236\213.md" diff --git "a/05 \346\236\227\344\274\237\345\275\254/2.18DDL\345\222\214DMLl.md" "b/05 \346\236\227\344\274\237\345\275\254/20230218 DDL\345\222\214DMLl.md" similarity index 100% rename from "05 \346\236\227\344\274\237\345\275\254/2.18DDL\345\222\214DMLl.md" rename to "05 \346\236\227\344\274\237\345\275\254/20230218 DDL\345\222\214DMLl.md" diff --git "a/05 \346\236\227\344\274\237\345\275\254/20230220 \347\272\246\346\235\237\347\254\224\350\256\260\345\222\214\344\275\234\344\270\232.md" "b/05 \346\236\227\344\274\237\345\275\254/20230220 \347\272\246\346\235\237\347\254\224\350\256\260\345\222\214\344\275\234\344\270\232.md" new file mode 100644 index 0000000..7d8835b --- /dev/null +++ "b/05 \346\236\227\344\274\237\345\275\254/20230220 \347\272\246\346\235\237\347\254\224\350\256\260\345\222\214\344\275\234\344\270\232.md" @@ -0,0 +1,681 @@ +# 一、笔记 + +约束类型:主建、唯一、非空、默认、自增、外键 + +1、主键约束 +(1)关键字是primary key +(2)特点 +A:每一个表只能有一个主键约束 +B:主键约束的字段值是不允许为null +C: 也不允许重复的 + +```mysql +CREATE TABLE course( + cid INT PRIMARY KEY, #住键 + cname VARCHAR(50), + description VARCHAR(100) +); +INSERT INTO stu VALUES(1,'张三','10086'); # 添加数据 +INSERT INTO stu VALUES(2,'李四','10010'); + + + +#复合主键 +CREATE TABLE xuanke( + sid INT , + cid INT, + score INT, + PRIMARY KEY(sid,cid) #它俩的组合不能为NULL,并且唯一 +); + + +#建表后增加主键约束 +ALTER TABLE 表名称 ADD PRIMARY KEY(字段列表); +#如果想要删除主键约束 +ALTER TABLE 表名称 DROP PRIMARY KEY; +``` + + + +2、唯一键约束: +(1)关键字:unique key +(2)特点 +A:允许为null +B: 不能重复 +B:一个表可以有多个唯一键约束 + +```mysql +CREATE TABLE stu2( + sid INT PRIMARY KEY, + sname VARCHAR(20), + birthday DATE, + score INT, + gender ENUM('男','女'), + weight DOUBLE(4,1), + tel CHAR(11) UNIQUE KEY #唯一约束 # 手机号不能重复,可为空 +); + +#添加数据 +INSERT INTO stu2(sid,sname,tel) VALUES +(1,'张三',NULL), #如果没有可以为null +(2,'李四','10086'); + +#建表后增加唯一键约束 +ALTER TABLE 表名称 ADD UNIQUE KEY (字段列表); +``` + + + + + +3、非空约束 +如果某个字段,不要求唯一,但是要求非空。那么就可以给字段加非空约束。 + +```mysql +CREATE TABLE student( + sid INT PRIMARY KEY, + sname VARCHAR(20), + birthday DATE, + score INT NOT NULL, #非空约束 + gender ENUM('男','女'), + weight DOUBLE(4,1), + tel CHAR(11) UNIQUE KEY +); + + #删除score的非空约束 + ALTER TABLE 表名 MODIFY 字段 数据类型; + + #增加非空约束 + ALTER TABLE 表名 MODIFY 字段 数据类型 NOT NULL; + + +``` + +4、默认值约束 +如果某个字段,在添加数据时未指定值时,希望不要用NULL处理,而是按照一个默认值处理, +就可以使用默认值约束。 +例如:学生性别,在未指定时,默认按照 男 处理 + +```mysql +CREATE TABLE stu3( + 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 #唯一键约束 +); + +#删除gender的默认值约束,保留非空约束 + ALTER TABLE 表名 MODIFY 字段名 ENUM('男','女') NOT NULL; + + #删除gender的非空约束,保留默认值约束 + ALTER TABLE 表名 MODIFY 字段名 ENUM('男','女') DEFAULT '男'; + + #保留非空和默认值约束 + + ALTER TABLE 表名 MODIFY 字段名 ENUM('男','女') DEFAULT '男' NOT NULL; + +``` + +```mysql + +#查看一个表的约束名等信息,查看系统库“information_schema”的“table_constraints” + +SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称'; + +SELECT * FROM information_schema.table_constraints WHERE table_name= 'student'; +``` + +5、检查约束 (MySQL5.7不支持CHECK约束,在MySQL8.0中开始支持CHECK约束) + +```mysql +CREATE TABLE student( + sid INT PRIMARY KEY, #主键约束 + sname VARCHAR(20) , + age INT CHECK (age>=18 && age<=35) +); +INSERT INTO student VALUES(1,'张三',25); +INSERT INTO student VALUES(2,'李四',45); +``` + + + +6、外键约束 +约束两个表的关系,或者是一个表的两个字段之间的关系。 + +(1)主表(父表)和从表(子表) +主表:被依赖,被参考 +从表:依赖别人的,参考别人的 + +例如:员工表(从)和部门表(主) + +例如:学生表、课程表和选课表 +选课表中的学号,它的值是依赖于学生表的学号。 +选课表是从表, +学生表是主表。 +选课表中的课程编号,它的值是依赖于课程表的课程编号。 +选课表是从表, +课程表示主表。 + +(2)外键的建立和指定要在从表中定义 +(3)关键字 foreign key + +```mysql +格式 foreign key (从表的字段) references 主表(被依赖字段【主键】) on update/delete cascade /(set null) +外键约束等级为 on update/delete cascade /(set null) + +例 +部门表 +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) #外键写法 +); +#emp依赖于dept表 +``` + + + +7、自增属性 +维护某个字段的值自动增长的一个属性。 +它的要求: +(1)一个表最多只能有一个字段是自增的 +(2)自增的字段必须是整数类型 +(3)自增的字段必须是键约束的字段(通常是主键、唯一键) + +自增字段赋值为null和0的时候,会自增, +如果赋值为其他的值,按照你指定的值来。 + +```mysql +CREATE TABLE stu5( + sid INT AUTO_INCREMENT primary key, + sname VARCHAR(20) +); +-- 自增字段赋值为null和0的时候,会自增, +-- 如果赋值为其他的值,按照你指定的值来。 +INSERT INTO stu5 VALUES(NULL,'张三'); +INSERT INTO stu5 VALUES(NULL,'李四'); +INSERT INTO stu5 VALUES(0,'王五'); +INSERT INTO stu5 VALUES(-1,'赵六'); +INSERT INTO stu5 VALUES(70,'王八'); +INSERT INTO stu5 VALUES(NULL,'小九'); + +ALTER TABLE 表名称 AUTO_INCREMENT = 起始值; +ALTER TABLE stu5 AUTO_INCREMENT = 1001; +``` + + + +# 二、作业 + +## 第1题 + +1、创建数据库test01_company + +2、创建表格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) | + +**要求4:**将表employees的mobile字段修改到code字段后面。 + +**要求5:**将表employees的birth字段改名为birthday; + +**要求6:**修改sex字段,数据类型为char(1)。 + +**要求7:**删除字段note; + +**要求8:**增加字段名favoriate_activity,数据类型为varchar(100); + +**要求9:**将表employees的名称修改为 employees_info + +#### 第一题答案 + +```mysql + +# 1、创建数据库test01_company + create database test01_company charset utf8; +# 2、创建表格offices +use test01_company; +create table offices( + officeCode int, + city varchar(30), + address varchar(50), + country varchar(50), + postalCode varchar(25) +); #插入表结构 +desc offices; #查看表结构 +# | 字段名 | 数据类型 | +# | ---------- | ----------- | +# | officeCode | int | +# | city | varchar(30) | +# | address | varchar(50) | +# | country | varchar(50) | +# | postalCode | varchar(25) | +# +# 3、创建表格employees +create table employees( + empNum int, + lastName varchar(50), + firstName varchar(50), + mobile varchar(25), + code int, + jobTitle varchar(50), + birth date, + Note varchar(255), + Sex varchar(5) + ); +desc 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字段后面。 +alter table employees modify mobile varchar(25) after code; #modify after 修改字段的位置(放在code后面) +desc employees; +# **要求5:**将表employees的birth字段改名为birthday; +alter table employees change birth birthday date; #修改字段名 change +desc employees; +# **要求6:**修改sex字段,数据类型为char(1)。 +alter table employees modify Sex char(1); #修改字段的数据类型 modify +# **要求7:**删除字段note; +alter table employees drop column Note; #删除字段 drop column +desc employees; +# **要求8:**增加字段名favoriate_activity,数据类型为varchar(100); +alter table employees add column favoriate_activity varchar(100); #增加一个字段 add column +desc employees; +# **要求9:**将表employees的名称修改为 employees_info +alter table employees rename to employees_info; +show tables ; +``` + + + +## 第2题 + +1、创建数据库test02dbs + +2、创建表格pet + +| 字段名 | 字段说明 | 数据类型 | +| ------- | -------- | ----------- | +| name | 宠物名称 | varchar(20) | +| owner | 宠物主人 | varchar(20) | +| species | 种类 | varchar(20) | +| sex | 性别 | char(1) | +| birth | 出生日期 | year | +| death | 死亡日期 | year | + +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 | | + +4、 添加字段主人的生日owner_birth。 + +5、 将名称为Claws的猫的主人改为kevin + +6、 将没有死的狗的主人改为duck + +7、 查询没有主人的宠物的名字; + +8、 查询已经死了的cat的姓名,主人,以及去世时间; + +9、 删除已经死亡的狗 + +10、查询所有宠物信息 + +#### 第二题答案 + +```mysql +# +# 1、创建数据库test02db +create database test02db charset utf8; +# 2、创建表格pet +use test02db; +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'死亡日期' +); +desc pet; +# | 字段名 | 字段说明 | 数据类型 | +# | ------- | -------- | ----------- | +# | name | 宠物名称 | varchar(20) | +# | owner | 宠物主人 | varchar(20) | +# | species | 种类 | varchar(20) | +# | sex | 性别 | char(1) | +# | birth | 出生日期 | year | +# | death | 死亡日期 | year | +# +# 3、添加记录 +insert into pet values('Fluffy','harold','Cat','f',2003,2010); +insert into pet (name, owner, species, sex, birth)values('Claws' , 'gwen', 'Cat', 'm', '2004'); +insert into pet (name, species, sex, birth)values('Buffy' ,' Dog','f',2009 ); +insert into pet (name, owner, species, sex, birth)values('Fang', 'benny','Dog','m',2000 ); +insert into pet values('bowser','diane','Dog','m', 2003,2009 ); +insert into pet (name, species, sex, birth)values('Chirpy' , 'Bird','f' ,2008 ); +select *from pet; +# | 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 | | +# +# 4、 添加字段主人的生日owner_birth。 +alter table pet add column owner_birth year; #添加字段 +alter table pet drop column owner_birth; #删除字段 +desc pet; +# 5、 将名称为Claws的猫的主人改为kevin +update pet set owner='kevin' where name='Claws'; #修改数据名 +select *from pet; +# 6、 将没有死的狗的主人改为duck +update pet set owner='duck' where death is not null ; +select *from pet; +# 7、 查询没有主人的宠物的名字; +select *from pet where owner is null; +# 8、 查询已经死了的cat的姓名,主人,以及去世时间; +select *from pet where species='cat'and death is null; +# 9、 删除已经死亡的狗 +delete from pet where species='Dog' and death is null ; +select *from pet; +# 10、查询所有宠物信息 +select owner from pet; +# #### 第二题答案 +``` + +## 第3题 + +1、创建数据库:test03_company + +2、在此数据库下创建如下3表,数据类型,宽度,是否为空根据实际情况自己定义。 + +A. 部门表(department):部门编号(depid),部门名称(depname),部门简介(deinfo);其中部门编号为主键。 + +B. 雇员表(emoloyee):雇员编号(empid),姓名(name),性别(sex),职称(title),出生日期(birthday),所在部门编号(depid);其中 + +* ​ 雇员编号为主键; +* ​ 部门编号为外键,外键约束等级为(on update cascade 和on delete set null); +* ​ 性别默认为男; + +C. 工资表(salary):雇员编号(empid),基本工资(basesalary),职务工资(titlesalary),扣除(deduction)。其中雇员编号为主键。 + +3、给工资表(salary)的雇员编号(empid)增加外键约束,外键约束等级为(on update cascade 和on delete cascade) + +4、添加数据如下: + +部门表: + +| 部门编号 | 部门名称 | 部门简介 | +| -------- | -------- | ------------ | +| 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 | + + 工资表: + +| 雇员编号 | 基本工资 | 职务工资 | 扣除 | +| -------- | -------- | -------- | ---- | +| 1001 | 2200 | 1100 | 200 | +| 1002 | 1200 | 200 | NULL | +| 1003 | 2900 | 700 | 200 | +| 1004 | 1950 | 700 | 150 | + +#### 第三题答案 + +```mysql +# 1、创建数据库:test03_company + create database test03_company charset utf8; +# 2、在此数据库下创建如下3表,数据类型,宽度,是否为空根据实际情况自己定义。 +# A. 部门表(department):部门编号(depid),部门名称(depname),部门简介(deinfo);其中部门编号为主键。 +use test03_company; +create table department( + depid int primary key comment '部门编号', + depname varchar(50) comment '部门名称', + deinfo varchar(50) comment '部门简介' +); +alter table department; +select *from department; +# B. 雇员表(emoloyee):雇员编号(empid),姓名(name),性别(sex),职称(title),出生日期(birthday),所在部门编号(depid);其中 +# +# * ​ 雇员编号为主键; +# * ​ 部门编号为外键,外键约束等级为(on update cascade 和on delete set null); +# * ​ 性别默认为男; + +create table emoloyee( + empid int primary key comment '雇员编号', + name varchar(10) not null comment'姓名', + title varchar(50) comment'职称', + birthday date comment'部门简介', + sex enum('男','女') default '男' not null , + depid int comment '部门编号', + 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) +create table salary( + empid int primary key comment'雇员编号', + basesalary float not null comment '基本工资', + titlesalary float not null comment '职务工资', + deduction float comment '扣除', + foreign key(empid) references emoloyee(empid) on update cascade on delete cascade +); +# +# 4、添加数据如下: + +# 部门表: +insert into department (depid, depname) values (111,'生产部'); +insert into department (depid, depname) values (222,'销售部'); +insert into department (depid, depname,deinfo) values (222,'销售部''人力资源管理'); +# | 部门编号 | 部门名称 | 部门简介 | +# | -------- | -------- | ------------ | +# | 111 | 生产部 | Null | +# | 222 | 销售部 | Null | +# | 333 | 人事部 | 人力资源管理 | +# +# 雇员表:# B. 雇员表(emoloyee):雇员编号(empid),姓名(name),性别(sex),职称(title),出生日期(birthday),所在部门编号(depid);其中 +insert into emoloyee values(1001,'张三','男','高级工程师','1975-1-1','111'); +insert into emoloyee values(1002,'李四','女','助工','1985-1-1','111'); +insert into emoloyee values(1003,'王五','男','工程师','1978-1-1','222'); +insert into emoloyee values(1004,'张六','男','工程师','1999-1-1','222'); +# | 雇员编号 | 姓名 | 性别 | 职称 | 出生日期 | 所在部门编号 | +# | -------- | ---- | ---- | ---------- | ---------- | ------------ | +# | 1001 | 张三 | 男 | 高级工程师 | 1975-1-1 | 111 | +# | 1002 | 李四 | 女 | 助工 | 1985-1-1 | 111 | +# | 1003 | 王五 | 男 | 工程师 | 1978-11-11 | 222 | +# | 1004 | 张六 | 男 | 工程师 | 1999-1-1 | 222 | +# +# 工资表:工资表(salary):雇员编号(empid),基本工资(basesalary),职务工资(titlesalary),扣除(deduction)。 +insert into salary values(1001,2200,1100,200); +insert into salary (empid,basesalary,titlesalary)values(1002,1200,200); +insert into salary values(1004,1950,700,150); +# | 雇员编号 | 基本工资 | 职务工资 | 扣除 | +# | -------- | -------- | -------- | ---- | +# | 1001 | 2200 | 1100 | 200 | +# | 1002 | 1200 | 200 | NULL | +# | 1003 | 2900 | 700 | 200 | +# | 1004 | 1950 | 700 | 150 | +``` + + + +## 第4题 + +1、创建一个数据库:test04_school + +2、创建如下表格 + +表1 Department表的定义 + +| **字段名** | **字段描述** | **数据类型** | **主键** | **外键** | **非空** | **唯一** | +| ---------- | ------------ | ------------ | -------- | -------- | -------- | -------- | +| DepNo | 部门号 | int(10) | 是 | 否 | 是 | 是 | +| DepName | 部门名称 | varchar(20) | 否 | 否 | 是 | 否 | +| DepNote | 部门备注 | Varchar(50) | 否 | 否 | 否 | 否 | + +表2 Teacher表的定义 + +| **字段名** | **字段描述** | **数据类型** | **主键** | **外键** | **非空** | **唯一** | +| ---------- | ------------ | ------------ | -------- | -------- | -------- | -------- | +| Number | 教工号 | int | 是 | 否 | 是 | 是 | +| Name | 姓名 | varchar(30) | 否 | 否 | 是 | 否 | +| Sex | 性别 | varchar(4) | 否 | 否 | 否 | 否 | +| Birth | 出生日期 | date | 否 | 否 | 否 | 否 | +| DepNo | 部门号 | int | 否 | 是 | 否 | 否 | +| Salary | 工资 | float | 否 | 否 | 否 | 否 | +| Address | 家庭住址 | varchar(100) | 否 | 否 | 否 | 否 | + +3、添加记录 + +| **DepNo** | **DepName** | **DepNote** | +| --------- | ----------- | ------------------ | +| 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 | 重庆市南岸区 | + +4、用SELECT语句查询Teacher表的所有记录。 + +#### 第四题答案 + +```mysql +# 1、创建一个数据库:test04_school +create database test04_school charset utf8; +# 2、创建如下表格 +use test04_school; +# 表1 Department表的定义 +create table Department( + DepNo int(10) primary key unique key comment'部门号' not null, + DepName varchar(20) not null comment '部门名称', + DepNote varchar(50) + ); +desc Department; +# | **字段名** | **字段描述** | **数据类型** | **主键** | **外键** | **非空** | **唯一** | +# | ---------- | ------------ | ------------ | -------- | -------- | -------- | -------- | +# | DepNo | 部门号 | int(10) | 是 | 否 | 是 | 是 | +# | DepName | 部门名称 | varchar(20) | 否 | 否 | 是 | 否 | +# | DepNote | 部门备注 | Varchar(50) | 否 | 否 | 否 | 否 | +# +# 表2 Teacher表的定义 + +create table Teacher( + Number int primary key not null unique key comment '教工号', + Name varchar(30) not null comment '姓名', + Sex varchar(4) comment '出生日期', + Birth date comment '出生日期', + DepNo int comment'部门号', + Salary float comment'工资', + Adderss varchar(100) comment '家庭住址', + foreign key (DepNo) references Department(DepNo) on update cascade on delete cascade +); +# | **字段名** | **字段描述** | **数据类型** | **主键** | **外键** | **非空** | **唯一** | +# | ---------- | ------------ | ------------ | -------- | -------- | -------- | -------- | +# | Number | 教工号 | int | 是 | 否 | 是 | 是 | +# | Name | 姓名 | varchar(30) | 否 | 否 | 是 | 否 | +# | Sex | 性别 | varchar(4) | 否 | 否 | 否 | 否 | +# | Birth | 出生日期 | date | 否 | 否 | 否 | 否 | +# | DepNo | 部门号 | int | 否 | 是 | 否 | 否 | +# | Salary | 工资 | float | 否 | 否 | 否 | 否 | +# | Address | 家庭住址 | varchar(100) | 否 | 否 | 否 | 否 | + +# 3、添加记录 +insert into Department values +(601,'软件技术系','软件技术等专业'), +(602,'网络技术系','多媒体技术专业'), +(603,'艺术设计系','广告艺术设计专业'), +(604,'管理工程系','连锁经营管理等专业'); +select *from Department; +# | **DepNo** | **DepName** | **DepNote** | +# | --------- | ----------- | ------------------ | +# | 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 | 重庆市南岸区 | + +insert into Teacher values +(2001,'Tom','女','1970-01-10',602,4500,'四川省锦阳市'), +(2002,'Lucy','男','1983-12-18',601,2500,'北京市昌平市'), +(2003,'Mike','男','1990-12-10',604,1500,'重庆市渝中区'), +(2004,'James','女','1980-6-10',602,3500,'四川省成都市'), +(2005,'Jack','男','1970-01-10',603,1200,'重庆市南岸区'); +# 4、用SELECT语句查询Teacher表的所有记录。 +select *from Teacher; +``` + + + + + -- Gitee From 1b19a6a6a0c2765862abc24e0edd455b9f06df30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?5=E5=8F=B7=E6=9E=97=E4=BC=9F=E5=BD=AC?= <2401916501@qq.com> Date: Wed, 22 Feb 2023 23:29:53 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E4=B8=8E=E7=AE=97=E6=95=B0=E8=BF=90=E7=AE=97=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...2_\350\277\220\347\256\227\347\254\246.md" | 437 ++++++++++++++++++ 1 file changed, 437 insertions(+) create mode 100644 "05 \346\236\227\344\274\237\345\275\254/20230222 \345\237\272\347\241\200\346\237\245\350\257\242_\350\277\220\347\256\227\347\254\246.md" diff --git "a/05 \346\236\227\344\274\237\345\275\254/20230222 \345\237\272\347\241\200\346\237\245\350\257\242_\350\277\220\347\256\227\347\254\246.md" "b/05 \346\236\227\344\274\237\345\275\254/20230222 \345\237\272\347\241\200\346\237\245\350\257\242_\350\277\220\347\256\227\347\254\246.md" new file mode 100644 index 0000000..d0f674f --- /dev/null +++ "b/05 \346\236\227\344\274\237\345\275\254/20230222 \345\237\272\347\241\200\346\237\245\350\257\242_\350\277\220\347\256\227\347\254\246.md" @@ -0,0 +1,437 @@ +# 一、笔记 + +### Mysql的运算符 + +1、算术运算符 +加:+ +减:- +乘:* +除:/ 正常除,有小数 + div 只保留整数部分 +模:% + +```mysql +SELECT 1+2; # 3 +SELECT 2-1; #1 +SELECT 2*8;# 16 +SELECT 9/2;# 4.5 +SELECT 9 DIV 2; ## 4 DIV也是除法,不过商只取整数,小数直接删除 +SELECT 9.9 DIV 2; # 4 +SELECT 9%2; # 1 +``` + +大于:> +小于:< +大于等于:>= 大于或于等于都满足 +小于等于:<= 小于或等于 +等于:= 不能用于null判断 id = null 因为null是特殊类型。它与任何类型做运算,结果都是null +不等于:!= 或 <> 不能用于null判断 + +```mysql +SELECT 1=1;# 1 +SELECT * FROM t_employee WHERE eid = 1; +SELECT * FROM t_employee WHERE eid == 1;# 报错。java才是== +SELECT * FROM t_employee WHERE `commission_pct` = NULL; # 不报错,但结果返回null +SELECT * FROM t_employee WHERE `commission_pct` IS NULL; # is not null +SELECT * FROM t_employee WHERE `commission_pct` <=> NULL;# <=> 安全等于 + +SELECT * FROM t_employee WHERE `commission_pct` != NULL;#null值的判断不能用!=,返回null +SELECT * FROM t_employee WHERE `commission_pct` IS NOT NULL; +SELECT * FROM t_employee WHERE !(`commission_pct` <=> NULL); +SELECT * FROM t_employee WHERE !(!(`commission_pct` IS NULL)); + + + + +#查询薪资高于15000的员工信息 +select * from t_employee where salary > 15000; + + +#查询不是1号部门的员工 +select * from t_employee where did !=1; +select * from t_employee where !(did =1); + + +#查询所有的男员工信息 +select * from t_employee where gender = '男'; +``` + +2、区间或集合范围比较运算符 + +```mysql +区间范围:between x and y : 包含两端 between 10 and 20 [10,20] 10<= 值 <=20 + not between x and y +集合范围:in (x,x,x) : 只要在这个范围就行 in (1,2,3) + not in(x,x,x) +``` + + + +```mysql +#查询薪资在[10000,15000]之间的员工 +select * from t_employee where salary between 10000 and 15000; + +#查询薪资不在[10000,15000]之间的员工 +select * from t_employee where salary not between 10000 and 15000; +select * from t_employee where !(salary between 10000 and 15000); + +#查询1,2,3部门的员工 +select * from t_employee where did in (1,2,3); + +#查询不是1,2,3部门的员工 +select * from t_employee where did not in (1,2,3); +select * from t_employee where !(did in (1,2,3)); + +``` + +3、%:代表任意个字符 + +​ _:代表一个字符,如果两个下划线代表两个字符 + +```mysql +#查询名字中包含“熊”字 的员工 +select * from t_employee where ename like "%熊%"; + +#查询名字中包含3个字,最后一个是“雨”字 的员工 +select * from t_employee where ename like "__雨"; +select * from t_employee where ename like "_雨"; +select * from t_employee where ename like "%雨%"; +select * from t_employee where ename like "_雨_"; +``` + +4、逻辑运算符 + +```mysql +逻辑与:&& 或 and 并且 +逻辑或:|| 或 or 或者 +逻辑非:! 或 not 不是 (取反) +逻辑异或: xor 两者只能满足其中一个,不能同时满足,不能同时不满足 +``` + + + +```mysql +查询薪资高于15000的男员工 +select * from t_employee where salary >15000 and gender = '男'; +select * from t_employee where salary >15000 && gender = '男'; + +#查询薪资高于15000,或者他是男员工 +select * from t_employee where salary >15000 or gender = '男'; +select * from t_employee where salary >15000 || gender = '男'; + + +#查询薪资低于10000,或者入职日期在2016-1-1之前的员工 +select * from t_employee where salary < 10000 or hiredate < '2016-1-1'; + +#查询入职日期不在 2016-1-1之前的员工 +select * from t_employee where hiredate >= '2016-1-1'; +select * from t_employee where !(hiredate < '2016-1-1'); + + + +#查询薪资低于10000,但是入职日期是在2016-1-1之后的员工 salary < 10000 and hiredate > '2016-1-1' +#或薪资大于等于10000,但是入职日期是在2016-1-1之前的员工 salary >= 10000 and hiredate < '2016-1-1' +select * from t_employee +where (salary < 10000 and hiredate > '2016-1-1') +or (salary >= 10000 and hiredate < '2016-1-1'); + + +/* +分析:要么满足薪资低于10000,要么满足入职日期在2016-1-1之前 <10000 xor <2016-1-1 +只能满足一个。 +*/ +select * from t_employee +WHERE +salary < 10000 xor hiredate < '2016-1-1'; + +``` + + + + + +判断时xx is null +xx is not null +xx <=> null 相当于 xx is null + +```mysql +select * from t_employee where commission_pct is not null ; +select * from t_employee where commission_pct <=> null ; +``` + +(2)计算时ifnull(xx,代替值) 当xx是null时,用代替值计算 ifnull(commission_pct,0) + +#计算所有员工的实发工资 +/* +实发工资 = 工资+ 工资*奖金比例 = 工资*(1+比例) +奖金:工资*奖金比例 +实发工资 = salary * (1+奖金比例) +*/ + +```mysql +select ename 姓名,salary 工资,commission_pct 奖金比例, salary*(1+commission_pct) 实发工资 from t_employee ; + +select ename 姓名,salary 工资,commission_pct 奖金比例, salary*(1+ifnull(commission_pct,0)) 实发工资 from t_employee ; +``` + +## 模糊匹配比较运算符 + + + +```mysql +大于:> +小于:< +大于等于:>= +小于等于:>= +等于:= 不能用于null判断 +不等于:!= 或 <> 不能用于null判断 +判断是null 用 is null 或 用 <=> null +判断不是null is not null +``` + +%:代表任意个字符 + +_:代表一个字符,如果两个下划线代表两个字符 + +```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 '_冰%'; +#查询员工的姓名、薪资、奖金比例、实发工资 +#实发工资 = 薪资 + 薪资 * 奖金比例 +select ename as 姓名, +salary as 薪资, +commission_pct as 奖金比例, +salary + salary * commission_pct as 实发工资 +from t_employee; + +#NULL在mysql中比较和计算都有特殊性,所有的计算遇到的null都是null。 +#实发工资 = 薪资 + 薪资 * 奖金比例 +select ename as 姓名, +salary as 薪资, +commission_pct as 奖金比例, +salary + salary * ifnull(commission_pct,0) as 实发工资 +from t_employee; +``` + + + +# 二、作业 + +## 第1题:员工表 + +```mysql +drop table if exists `employee`; +#创建employee表 +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); +``` + + + +| **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 | + +**要求1:**查询出薪资在12000~13000之间的员工信息。 + +**要求2:**查询出姓“刘”的员工的工号,姓名,家庭住址。 + +**要求3:**将“李四”的家庭住址改为“广东韶关” + +**要求4:**查询出名字中带“小”的员工 + +**要求5:**查询出薪资高于11000的男员工信息 + +**要求6:**查询没有登记电话号码的员工 + +**要求7:**查询薪资高于12000或者家是广东深圳、广州的男员工 + +**要求8:**查询每个员工的年薪,显示“姓名、年薪” + +###### 答案: + +```mysql +create database user charset utf8; +use USER; + +drop table if exists `employee`; +#创建employee表 +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); +-- +-- | **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 | +-- +-#要求1:**查询出薪资在12000~13000之间的员工信息。 +select *from employee where salary>=12000 AND salary<=13000 ; + +#要求2:**查询出姓“刘”的员工的工号,姓名,家庭住址。 +select id,name,addr from employee where name like"刘_"; +select id,name,addr from employee where name like "刘__" ; + +#要求3:**将“李四”的家庭住址改为“广东韶关” +update employee set addr='广东韶关' where name='李四'; +SELECT *from employee ; + +#要求4:**查询出名字中带“小”的员工 +select name from employee where name like '%小%'; + +##要求5:**查询出薪资高于11000的男员工信息 +select *from employee WHERE salary>11000; + +#要求6:**查询没有登记电话号码的员工 +SELECT name from employee where tel is NULL; + +#要求7:**查询薪资高于12000或者家是广东深圳、广州的男员工 +select name from employee WHERE salary>12000 or((addr='广东深圳' or addr='广东广州')and sex ='男'); +#要求8:**查询每个员工的年薪,显示“姓名、年薪” +select name as 姓名, salary * 12 as 年薪 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) + +**要求2:**查询属于亚洲的国家名称、所属大陆、面积、人口和 GDP 值 + +**要求3:**查询国土面积不足1万平方公里且人口不走10万人的国家信息 + +**要求4:**查询国家名字中包含“o“字母的国家信息 + +**要求5:**查询GDP值超过10000000000的国家信息 + +**要求6:**查询每个国家的人均贡献GDP值(GDP/人口总数)并显示为“国家名、人口、GDP值、人均贡献GDP值” + +**要求7:**查询人均贡献GDP值低于1000的国家信息。 + +**要求8:**查询每个国家的人均国土面积(面积/人口总数)并显示为“国家名、面积、人口、人均国土面积值” + +###### 答案: + +```mysql +create database countries_info charset utf8; +use 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); + +-- **要求1:** 查询大国 的国家名称、人口和面积。 +select name 国家名称 ,area 人口,population 面积 from countries_info where population >= 25000000 or area >= 3000000; +-- 如果一个国家满足下述两个条件之一,则认为该国是 大国 : +-- - 面积至少为 300万平方公里(即,3000000 km2) +-- - 人口至少为 2500 万(即 25000000) + +-- **要求2:**查询属于亚洲的国家名称、所属大陆、面积、人口和 GDP 值 +select name 国家名称, continent 所属大陆,area 面积, population 人口, gdp GDP +from countries_info where continent = 'Asia' ; +-- **要求3:**查询国土面积不足1万平方公里且人口不足10万人的国家信息 +select * FROM countries_info where area <10000 and population <100000; +-- **要求4:**查询国家名字中包含“o“字母的国家信息 +select *from countries_info WHERE name like '%o%'; +-- **要求5:**查询GDP值超过10000000000的国家信息 +select *from countries_info where gdp> 1000000000; +-- **要求6:**查询每个国家的人均贡献GDP值(GDP/人口总数)并显示为“国家名、人口、GDP值、人均贡献GDP值” +select name 国家名, population 人口,gdp GDP值, gdp/population as 人均贡献GDP值 from countries_info ; +-- **要求7:**查询人均贡献GDP值低于1000的国家信息。 +SELECT *from countries_info where gdp/population<1000; +-- **要求8:**查询每个国家的人均国土面积(面积/人口总数)并显示为“国家名、面积、人口、人均国土面积值” +select name 国家名, area 面积, population 人口, area/population 人均贡献GDP值 from countries_info ; +``` + -- Gitee