From 42b1cfbcb87dca9b5b01c3b374b51e36d24205b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=97=B6=E5=AD=A6=E5=AE=89?= <2820601363@qq.com> Date: Thu, 16 Mar 2023 21:04:54 +0800 Subject: [PATCH] zuoye --- ...73\345\236\213\347\254\224\350\256\260.md" | 243 ++++++++++ ...0230220 DDL\345\222\214DML\350\257\255.md" | 378 +++++++++++++++ ...53\345\200\274\344\275\234\344\270\232.md" | 459 ++++++++++++++++++ ...2_\350\277\220\347\256\227\347\254\246.md" | 253 ++++++++++ ...63\350\201\224\346\237\245\350\257\242.md" | 301 ++++++++++++ ...8 \345\255\220\346\237\245\350\257\242.md" | 200 ++++++++ ...09\345\244\247\344\275\234\344\270\232.md" | 187 +++++++ .../20230316\344\275\234\344\270\232.md" | 61 +++ 8 files changed, 2082 insertions(+) create mode 100644 "40 \346\227\266\345\255\246\345\256\211/20230219 \346\225\260\346\215\256\347\261\273\345\236\213\347\254\224\350\256\260.md" create mode 100644 "40 \346\227\266\345\255\246\345\256\211/20230220 DDL\345\222\214DML\350\257\255.md" create mode 100644 "40 \346\227\266\345\255\246\345\256\211/20230222 DDL\345\222\214DML_\345\273\272\350\241\250\344\270\216\345\241\253\345\200\274\344\275\234\344\270\232.md" create mode 100644 "40 \346\227\266\345\255\246\345\256\211/20230223 \345\237\272\347\241\200\346\237\245\350\257\242_\350\277\220\347\256\227\347\254\246.md" create mode 100644 "40 \346\227\266\345\255\246\345\256\211/20230301 \345\205\263\350\201\224\346\237\245\350\257\242.md" create mode 100644 "40 \346\227\266\345\255\246\345\256\211/20230308 \345\255\220\346\237\245\350\257\242.md" create mode 100644 "40 \346\227\266\345\255\246\345\256\211/20230309\345\244\247\344\275\234\344\270\232.md" create mode 100644 "40 \346\227\266\345\255\246\345\256\211/20230316\344\275\234\344\270\232.md" diff --git "a/40 \346\227\266\345\255\246\345\256\211/20230219 \346\225\260\346\215\256\347\261\273\345\236\213\347\254\224\350\256\260.md" "b/40 \346\227\266\345\255\246\345\256\211/20230219 \346\225\260\346\215\256\347\261\273\345\236\213\347\254\224\350\256\260.md" new file mode 100644 index 0000000..5e2134e --- /dev/null +++ "b/40 \346\227\266\345\255\246\345\256\211/20230219 \346\225\260\346\215\256\347\261\273\345\236\213\347\254\224\350\256\260.md" @@ -0,0 +1,243 @@ +# MySQL语法 + +1.不分大小写 + +2.一般以;结尾 + +3.库名,表名,字段名(列名),支持英文字母,_,数字 + +4.名称中不要用空格 + +5.名称中,不用sql语句的关键字 + +6.‘ “ `(反引号|飘号),用来标记名称 + +7.--注释,#注释内容,/* */多行注释,(ctel+/) + +8.数值直接写,不用符号包裹,字符串和时间数型用单引号包裹 + +### 数据类型 + +1.约束类型 + +2.规范数据空间的占用(内存) + +## 类型 + +#### 数值型 小数+整数 + +1.整形 int(M)这里的M不是限制长度,单独使用毫无意义,配合zerofill使用(补0) + +2.浮点 float(M,N) double(M,N) M表示限制整数+小数只能存放M长度,N限制小数的长度。如果小数的部分超过了N,会自动截断,并四舍五入。 + +3.定点 decimal(M,N) 默认(10,0),其他同上 + +#### 字符型 + +1.固定长度的 char 默认是1,最大是255 + +2.可变长度的 varchar(M) 这里的M不可缺省 + +#### 时间类型 + +1.data 年月日 + +2.time 时分秒 + +3.year 年 + +4.datatime + +5.timestamp 时间戳 + +#### enum枚举类型 + +类似单选框中的选项,只能选一个。 enum(1,2,3,4,5) + +#### set集合类型 + +类似多选框,可以选0个或是多个,但也只能选里面有的。set(1,2,3,4,5) + +### #一些数据库的属性 + +1.unsigned 无符号的,表示正数不能负数 + +2.null 允许为空。not null 不允许为空。 + +3.default 默认值 + +4.auto_increment 自增 + +## # DDL + +创建数据库 + +```MYSQL +create database 数据库名 charset 字符集; +``` + +查看所有数据库 + +```mysql +show databases; +``` + +查看数据库的定义语句 + +```mysql +show create database +``` + +修改数据库编码 + +```mysql +#修改数据库字符集和校对规则 +ALTER DATABASE 数据库名称 CHARACTER SET 字符集名称 COLLATE 字符集对应校对规则; +``` + +删除数据库 + +```mysql +drop database 数据库名; +``` + +使用数据库 + +```mysql +use 数据库名; +``` + +查看数据库中的所有表格 + +```mysql +use 数据库名; +show tables; +或 +show tables from 数据库名; +``` + +查看指定字段 + +~~~ mysql +select 字段名 [字段名,字段名] from 表格名; +select 字段名 [字段名,字段名] from 表格名 where 条件; +~~~ + + + +创建表格 + +```mysql +create table 数据表名称( + 字段名1 数据类型, + 字段名2 数据类型 + ... +); +``` + +查看表的定义信息 + +```mysql +show create table 表名称; +``` + +查看表结构 + +```mysql +desc 表名称; +``` + +修改表名称 + +```mysql +alter table 旧表名 rename [to] 新表名; +rename table 旧表名称 to 新表名称; +``` + +删除表格 + +```mysql +drop table 表名称; +``` + +删除字段 + +```mysql +alter table 表名称 drop [column] 字段名称; +``` + +增加字段 + +```mysql +alter table 表名称 add [column] 字段名称 数据类型; +alter table 表名称 add [column] 字段名称 数据类型 first; +alter table 表名称 add [column] 字段名称 数据类型 after 另一个字段; +``` + +修改字段的数据类型 + +```mysql +alter table 表名称 modify [column] 字段名称 新的数据类型; +``` + +修改字段名称 + +```mysql +alter table 表名称 change [column] 旧字段名称 新的字段名称 新的数据类型; +``` + +修改字段位置 + +```mysql +alter table 表名称 modify [column] 字段名称 数据类型 first; +alter table 表名称 modify [column] 字段名称 数据类型 after 另一个字段; +``` + +# DML + +添加一条记录到表中 + +```mysql +insert into 表名称 values(值列表);#值列表中的值的顺序、类型、个数必须与表结构一一对应 + +insert into 表名称 (字段列表) values(值列表); +``` + +添加多条记录到表中 + +```mysql +insert into 表名称 values(值列表1),(值列表2),(值列表3); #值列表中的值的顺序、类型、个数必须与表结构一一对应 + +insert into 表名称 (字段列表) values(值列表1),(值列表2),(值列表3); +``` + +修改所有行 + +```mysql +update 表名称 set 字段名1 = 值, 字段名2 = 值; #给所有行修改 +``` + +修改部分行 + +```mysql +update 表名称 set 字段名1 = 值, 字段名2 = 值 where 条件; #给满足条件的行修改 +``` + +删除部分行的数据 + +```mysql +delete from 表名称 where 条件; +``` + +删除整张表的数据,表结构留下 + +```mysql +delete from 表名称; +``` + +截断表,清空表中的数据,只留有表结构 + +```mysql +truncate 表名称; +``` + diff --git "a/40 \346\227\266\345\255\246\345\256\211/20230220 DDL\345\222\214DML\350\257\255.md" "b/40 \346\227\266\345\255\246\345\256\211/20230220 DDL\345\222\214DML\350\257\255.md" new file mode 100644 index 0000000..1f1ff66 --- /dev/null +++ "b/40 \346\227\266\345\255\246\345\256\211/20230220 DDL\345\222\214DML\350\257\255.md" @@ -0,0 +1,378 @@ +# 笔记 + +if not exists 如果不存在 +例:如果没有该名称的数据库则创建名为该名称的数据库,否则跳过 +if existe 如果存在 +例:如果该数据库存在则删除该数据库否则跳过 +修改数据库的编码 +alter database 数据库名 character set 新的数据库名; +添加一个表字段 +alter table 表名称 add 字段名 数据类型; +删除一个字段 +alter table 表名称 change 旧字段名 新字段名 数据类型; +修改一个字段的数据类型 +alter table 表名称 modify 字段名称 新数据类型; + +update 表名称 set 字段名=值 ......无条件执行 + +update 表名称 set 字段名=值.......where 条件 + +删除整个表数据 + +delete from 表名称 delete form 表名称 where 条件 + +修改 + +删除字段 + +alter table 表名称 drop column 字段名 + +增加字段 + +alter table 表名称 add column 字段名 数据类型 after 条件 + +## 第1题 + +1、创建数据库test01_market + +~~~ MYSQL +CREATE DATABASE text01_market; +~~~ + +2、创建表格customers + +~~~ mysql + CREATE TABLE customers( +c_num INT(11), +c_name VARCHAR(50), +c_contact varchar(50), +c_city varchar(50), +c_birth DATE +); +~~~ + + + +| 字段名 | 数据类型 | +| --------- | ----------- | +| 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(1) AFTER c_name; +~~~ + +**要求7:**将表名改为customers_info + +~~~ mysql +ALTER TABLE customers RENAME customers_info; +~~~ + +**要求8:**删除字段c_city + +```mysql +ALTER TABLE customers_info DROP c_city;x  +``` + +## 第2题 + +1、创建数据库test02_library + +~~~ mysql +CREATE DATABASE text02_library; +~~~ + +2、创建表格books + +~~~ mysql +CREATE TABLE books( +b_id int(11), +b_name VARCHAR(50), +`authors` VARCHAR(100), +price FLOAT, +pubdate year, +note VARCHAR(100), +num INT(11) +); +~~~ + + + +| 字段名 | 字段说明 | 数据类型 | 允许为空 | 唯一 | +| ------- | -------- | ------------- | -------- | ---- | +| b_id | 书编号 | int(11) | 否 | 是 | +| b_name | 书名 | varchar(50) | 否 | 否 | +| authors | 作者 | varchar(100) | 否 | 否 | +| price | 价格 | float | 否 | 否 | +| pubdate | 出版日期 | year | 否 | 否 | +| note | 说明 | varchar(100) | 是 | 否 | +| num | 库存 | int(11) | 否 | 否 | + +3、向books表中插入记录 + +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); +~~~ + + + +| 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 | + +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 text03_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), +title VARCHAR(100), +author VARCHAR(100), +price DOUBLE(11,2), +sales INT(11), +syock int(11), +img_path VARCHAR(100) +); +~~~ + + + +尝试添加部分模拟数据,参考示例如下: + +```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 | ++----+---------------+------------+-------+-------+-------+----------------------------+ +``` + +~~~ mysql +INSERT INTO book VALUES (1,'解忧杂货店','解忧杂货店',27.20,102,98,'static/img/default.jpg'),(2,'边城','沈从文',23.00,102,98,'static/img/default.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 | | ++----------+--------------+------+-----+---------+----------------+ +``` + +~~~ mysql +CREATE TABLE users( +id INT(11), +username VARCHAR(100), +`password` VARCHAR(100), +email VARCHAR(100) +); +~~~ + + + +尝试添加部分模拟数据,参考示例如下: + +```mysql ++----+----------+----------------------------------+--------------------+ +| id | username | password | email | ++----+----------+----------------------------------+--------------------+ +| 1 | admin | 112233 | admin@mxdx.com | ++----+----------+----------------------------------+--------------------+ +``` + +~~~ mysql +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 | | ++--------------+--------------+------+-----+---------+-------+ +``` + +~~~ mysql +CREATE TABLE orders( +id varchar(100), +order_time datetime, +total_count int(11), +total_amount double(11,2), +state int(11), +user_id int(11) +); +~~~ + +尝试添加部分模拟数据,参考示例如下: + +```mysql ++----------------+---------------------+-------------+--------------+-------+---------+ +| id | order_time | total_count | total_amount | state | user_id | ++----------------+---------------------+-------------+--------------+-------+---------+ +| 15294258455691 | 2018-06-20 00:30:45 | 2 | 50.20 | 0 | 1 | ++----------------+---------------------+-------------+--------------+-------+---------+ +``` + +~~~ mysql +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 | | ++----------+--------------+------+-----+---------+----------------+ +``` + +~~~ mysql +CREATE TABLE order_items( +id int(11), +`count` int(11), +amount DOUBLE(11,2), +title varchar(100), +author varchar(100), +price double(11,2), +img_path varchar(100), +order_id varchar(100) +); +~~~ + + + +尝试添加部分模拟数据,参考示例如下: + +```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 | ++----+-------+--------+------------+----------+-------+------------+----------------+ +``` + +参考答案: + +```mysql +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/40 \346\227\266\345\255\246\345\256\211/20230222 DDL\345\222\214DML_\345\273\272\350\241\250\344\270\216\345\241\253\345\200\274\344\275\234\344\270\232.md" "b/40 \346\227\266\345\255\246\345\256\211/20230222 DDL\345\222\214DML_\345\273\272\350\241\250\344\270\216\345\241\253\345\200\274\344\275\234\344\270\232.md" new file mode 100644 index 0000000..ab0aca0 --- /dev/null +++ "b/40 \346\227\266\345\255\246\345\256\211/20230222 DDL\345\222\214DML_\345\273\272\350\241\250\344\270\216\345\241\253\345\200\274\344\275\234\344\270\232.md" @@ -0,0 +1,459 @@ +# 笔记 + +#### 1.非空约束 + + not null (表示这个字段必须填写) + +#### 2.默认约束 + +default (当你不给值时,系统自动以默认值增充) #非空+默认值约束 + +#### 3.主键约束 + +primary key (非空,唯一 就是值不能重复,同一个表中只能有一个主键) + +#### 4.唯一约束 + +unique key (值不能重复,可以为空,一个表中可以有多个字段可设唯一) + +#### 5.自增约束 + +auto_increment #前提是主键 + +(不给值,给0或者给null值,会自动在原来最大数基础上+1,给了值,就以给的值为准。) + +#### 6.外键约束 + +foreign key (约束两个表的关系,或者是一个表的两个字段之间的关系) + +格式: foreign key (从表的字段) references 主表(被依赖字段); + + 1.主表(父表)和从表(子表) # 主表:被依赖,被参考。 从表:依赖别人的,参考别人的。 + + 2.外键的建立和指定要在从表中定义 + + ##### 要求 + +A.主表必须先存在。 + +B.主表被依赖字段必须有索引,所以通常是主键列或唯一键列才能作为被依赖字段。 + +C.删除表时,要么先删除从表,在删除主表。要么先解除外键约束,才能删除。 + +D.从表的依赖字段的数据,必须在主表被依赖字段中选择,添加与修改都是这样。 + +E.主表被依赖字段的数据不能轻易的删除和修改,要看是否被引用。 + +#外键的约束等级为 on update/delete cascade/(set null) + + + +## 第1题 + +1、创建数据库test01_company + +~~~ mysql +CREATE DATABASE text01_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 mobile 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 text02db; +~~~ + + + +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), +`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 | | + +~~~ mysql +INSERT into pet VALUES('Fluffy','harold','Cat','f',2003,2010),('Claws','gwen','Cat','m',2004,NULL),('Buffy',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 `death`IS NULL; +~~~ + + + +7、 查询没有主人的宠物的名字; + +~~~ mysql +SELECT `name` FROM pet where `owner` IS null; +~~~ + + + +8、 查询已经死了的cat的姓名,主人,以及去世时间; + +~~~ mysql +select `name`,`owner`,death from pet WHERE death=2010; +~~~ + + + +9、 删除已经死亡的狗 + +~~~ mysql +delete from pet where species='Dog' and death='2009'; +~~~ + + + +10、查询所有宠物信息 + +```mysql +select * from pet; +``` + +## 第3题 + +1、创建数据库:test03_company + +```sql +create database test03_company charset utf8; +``` + +2、在此数据库下创建如下3表,数据类型,宽度,是否为空根据实际情况自己定义。 + +A. 部门表(department):部门编号(depid),部门名称(depname),部门简介(deinfo);其中部门编号为主键。 + +```mysql +use test03_company ; +create table department( + depid int primary key auto_increment, + depname char(10) not null unique key, + deinfo varchar(200) +); +``` + +B. 雇员表(employee):雇员编号(empid),姓名(name),性别(sex),职称(title),出生日期(birthday),所在部门编号(depid);其中 + +* ​ 雇员编号为主键; +* ​ 部门编号为外键,外键约束等级为(on update cascade 和on delete set null); +* ​ 性别默认为男; + +```mysql +create table employee( +empid int primary key, +name varchar(10), +sex enum('男','女') not null default'男', +title varchar(10), +birthday date, +depid int, +CONSTRAINT department foreign key(depid) references department(depid) +); +``` + +C. 工资表(salary):雇员编号(empid),基本工资(basesalary),职务工资(titlesalary),扣除(deduction)。其中雇员编号为主键。 + +3、给工资表(salary)的雇员编号(empid)增加外键约束,外键约束等级为(on update cascade 和on delete cascade) + +~~~ mysql +create table salary( +empid int primary key, +basesalary double, +titlesalary double, +deduction double, +foreign key(empid) references employee(empid) +); +~~~ + + + +4、添加数据如下: + +部门表: + +| 部门编号 | 部门名称 | 部门简介 | +| -------- | -------- | ------------ | +| 111 | 生产部 | Null | +| 222 | 销售部 | Null | +| 333 | 人事部 | 人力资源管理 | + +~~~ mysql +INSERT INTO department(depid,depname,deinfo) VALUES (111,'生产部',NULL),(222,'销售部',NULL),(333,'人事部','人力资源管理'); +~~~ + + + + 雇员表: + +| 雇员编号 | 姓名 | 性别 | 职称 | 出生日期 | 所在部门编号 | +| -------- | ---- | ---- | ---------- | ---------- | ------------ | +| 1001 | 张三 | 男 | 高级工程师 | 1975-1-1 | 111 | +| 1002 | 李四 | 女 | 助工 | 1985-1-1 | 1114 | +| 1003 | 王五 | 男 | 工程师 | 1978-11-11 | 222 | +| 1004 | 张六 | 男 | 工程师 | 1999-1-1 | 222 | + +~~~ mysql +INSERT into employee(empid,`name`,sex,title,birthday,depid) 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(empid,basesalary,titlesalary,deduction) VALUES(1001,2200,1100,200),(1002,1200,200,NULL),(1003,2990,700,200),(1004,1950,700,150); +~~~ + + + +## 第4题 + +1、创建一个数据库:test04_school + +~~~ mysql +CREATE DATABASE text04_scgool; +~~~ + + + +2、创建如下表格 + +表1 Department表的定义 + +| **字段名** | **字段描述** | **数据类型** | **主键** | **外键** | **非空** | **唯一** | +| ---------- | ------------ | ------------ | -------- | -------- | -------- | -------- | +| DepNo | 部门号 | int(10) | 是 | 否 | 是 | 是 | +| DepName | 部门名称 | varchar(20) | 否 | 否 | 是 | 否 | +| DepNote | 部门备注 | Varchar(50) | 否 | 否 | 否 | 否 | + +~~~ mysql +CREATE TABLE Department( +DepNo int(10) PRIMARY KEY NOT NULL UNIQUE, +DepName VARCHAR(20) NOT NULL, +DepNote VARCHAR(50) +); +~~~ + + + +表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 primary key not null unique, +`Name` varchar(30) not null, +Sex VARCHAR(4), Birth date, +DepNo int, +Salary float, +Address VARCHAR(100), +foreign key(DepNo) references Department(DepNo) +); +~~~ + + + +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 | 重庆市南岸区 | + +~~~ mysql +insert into Department VALUES (601,'软件技术系','软件技术等专业'),(602,'网络技术系','多媒体技术等专业'),(603,'艺术设计系','广告艺术设计等专业'),(604,'管理工程系','连锁经营管理等专业'); +~~~ + + + +~~~ 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/40 \346\227\266\345\255\246\345\256\211/20230223 \345\237\272\347\241\200\346\237\245\350\257\242_\350\277\220\347\256\227\347\254\246.md" "b/40 \346\227\266\345\255\246\345\256\211/20230223 \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..36e15ef --- /dev/null +++ "b/40 \346\227\266\345\255\246\345\256\211/20230223 \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,253 @@ +# 笔记 + +## DQL + +结果去重 + +一个列里数据出现了好几次重复的值时,如果只想保留一个,就可以去重。 + +~~~mysql +select distinct 字段列表 from 表名称 where 条件; +-- distinct 只能出现在第一个字段前面 +~~~ + +### 别名 + +~~~ mysql +select 字段名 [as] 别名 from 表名; +-- as 可有可无 +-- 别名的引号可以省略 +~~~ + +列的别名有空格时,加双引号,没有空格双引号可加可不加 + +表的别名不用加双引号,表的别名不能有空格 + +~~~ mysql +select * from 表明 as 别名; +~~~ + +### 模糊查询 + +### like + +%;代表任意个字符 + +—;代表一个字符,两个下划线就是两个字符 + +### 逻辑查询 + +### xor + +两者只能满足其中一个,不能同时满足,不能同时不满足。 + +## 运算符 + +div (保留整数部分) + +安全等于 <=> 可以用于null的运算 + +模,% (取余) + +不等于,!= 或 <> 不能用于null判断 + +## 区间 + +区间范围 + +~~~mysql +between x and y +~~~ + +不在这区间 + +~~~sql +not between x and y +~~~ + +集合范围 + +~~~sql +in (x,y,z),有其中一个就行 +not in(x,y,z),不在这其中 +~~~ + + + + + +## 第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之间的员工信息。 + +~~~ mysql +select * from employee where salary BETWEEN 12000 and 13000; +~~~ + + + +**要求2:**查询出姓“刘”的员工的工号,姓名,家庭住址。 + +~~~ masql +select id,`name`,addr from employee where `name` LIKE '%刘%'; +~~~ + +**要求3:**将“李四”的家庭住址改为“广东韶关” + +~~~ mysql +UPDATE employee set addr='广东韶关' where `name`='李四'; +~~~ + +**要求4:**查询出名字中带“小”的员工 + +~~~ mysql +SELECT * from employee where `name` LIKE '%小%'; +~~~ + +**要求5:**查询出薪资高于11000的男员工信息 + +~~~ mysql +select * from employee where salary > 11000 and sex='男'; +~~~ + +**要求6:**查询没有登记电话号码的员工 + +~~~ mysql +select * from employee where tel is null; +~~~ + +**要求7:**查询薪资高于12000或者家是广东深圳、广州的男员工 + +~~~ mysql +select * from employee where salary>12000 or addr='广东深圳' or sex='男'; +~~~ + +**要求8:**查询每个员工的年薪,显示“姓名、年薪” + +```mysql +select salary*12 年薪 , `name` 姓名 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 or 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 人均贡献GDP值 from `countries_info`; +~~~ + +**要求7:**查询人均贡献GDP值低于1000的国家信息。 + +~~~ mysql +select * from `countries_info` where gdp/population<1000; +~~~ + +**要求8:**查询每个国家的人均国土面积(面积/人口总数)并显示为“国家名、面积、人口、人均国土面积值” + +```mysql +select `name` 国家名,area 面积,population 人口, area/population 人均国土面积值 from `countries_info`; +``` + diff --git "a/40 \346\227\266\345\255\246\345\256\211/20230301 \345\205\263\350\201\224\346\237\245\350\257\242.md" "b/40 \346\227\266\345\255\246\345\256\211/20230301 \345\205\263\350\201\224\346\237\245\350\257\242.md" new file mode 100644 index 0000000..023f74f --- /dev/null +++ "b/40 \346\227\266\345\255\246\345\256\211/20230301 \345\205\263\350\201\224\346\237\245\350\257\242.md" @@ -0,0 +1,301 @@ + + +# 笔记 + +Avg()平均值 Sum()求和 Max()最大值 + +Min()最小值 count()统计记录器 + +count(*)统计全部,count*(字段)统计非null的值 + +### 关联查询 + +关联查询:两个或更多个表一起查询。 + +又称为联合查询,多表查询 + +1、关联查询的结果一共有7种: + +两个表的记录分为四种: + +①A表中的记录能在B表中找到对应的记录 + +②A表中的记录在B表中找不到对应的记录 + +③B表中的记录可以在A表找到对应的记录 + +④B表中的记录在A表中找不到对应的记录 + +(1)A∩B ①③ + +(2)A ①② + +(3)A-A∩B ② + +(4)B ③④ + +(5)B-A∩B ④ + +(6)A∪B ①②③④ + +(7)A∪B-A∩B **②④** + +2.两个表要一起查询,要有前提条件:有关联 + +内连接:a inner join b on a.字段=b.字段 ab相同数据 + +左全连接:a left join b on a.字段=b.字段 where a.字段 is null 不重复的a数据 + +右全连接:a right join b on a.字段=b.字段 where b.字段 is null 不重复的b数据 + +左连接:a left join b on a.字段=b.字段 全a数据 + +右连接:a right join b on a.字段=b.字段 全b数据 + +# 作业 + +表(一)Student (学生表) + +~~~ mysql +create table Student( +Sno varchar (20) not null primary key, +Sname varchar (20) not null, +Ssex varchar (20) not null, +Sbirthday datetime, +Class varchar (20) +); + +~~~ + + + +表(二)Course(课程表) + +~~~ mysql +create table Course( +Cno varchar (20) not null primary key, +Cname varchar (20) not null, +Tno varchar (20) not null, +foreign key(Tno) references Teacher(Tno) +); + +~~~ + + + +表(三)Score(成绩表) + +~~~ mysql +create table Score( +Sno varchar (20) not null, +foreign key(Sno) references Student(Sno), +Cno varchar (20), +foreign key(Cno) references Course(Cno), +Degree Decimal(4,1) +); + +~~~ + + + +表(四)Teacher(教师表) + +~~~ mysql +create table Teacher( +Tno varchar (20) not null primary key, +Tname varchar (20) not null, +Tsex varchar (20) not null, +Tbirthday datetime, +Profvarchar (20), +Depart varchar (20) not null +); + +~~~ + + + +1,查询所有学生,都学了哪些课程,要显示学生信息和课程信息/ + +~~~ mysql +select score.Sno,score.Cno from score INNER JOIN course INNER JOIN student on score.Sno=student.Sno and course.Cno=score.Cno; +~~~ + + 2,查询没有学生的教师的所有信息 + +表(一)Student + +~~~ mysql +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' ); + +~~~ + + + +表(二)Course + +~~~ sql +INSERT INTO course VALUES +('3-105','计算机导论','825'), +('3-245','操作系统','804'), +('6-166','数字电路','856'), +('9-888','高等数学','831'); + +~~~ + + + +表(三)Score + +~~~ sql +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'); + +~~~ + + + +表(四)Teacher + +~~~ sql +INSERT INTO teacher VALUES + ('804', '曾华', '男', '1977-9-1', '95033' ), + ('856', '匡明', '男', '1975-10-2', '95031' ), + ('825', '王丽', '女', '1976-1-23', '95033' ), + ('831', '李军', '男', '1976-2-20', '95033' ); + +~~~ + + + +查询Score表中的最高分的学生学号和课程号。 + +~~~ sql +select Sno,Cno from Score; +~~~ + + + +查询所有学生的Sname、Cno和Degree列。 + +~~~ sql + SELECT student.Sname,score.Cno,score.Degree FROM student INNER JOIN score ON student.Sno=score.Sno; + +~~~ + + + +查询所有学生的Sno、Cname和Degree列。 + +~~~ sql +SELECT score.Sno,course.Cname,score.Degree from course INNER JOIN score on score.Cno=course.Cno; +~~~ + + + +查询所有学生的Sname、Cname和Degree列。 + +~~~ sql +SELECT student.Sname,course.Cname,score.Degree FROM student INNER JOIN course INNER JOIN score on student.Sno=score.Sno and course.Cno=score.Cno; +~~~ + + + +查询“95033”班学生的平均分。 + +查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 + +~~~ sql +select * from Score where Cno='3-105' and degree>(select degree from score where sno='109' and cno='3-105'); +~~~ + + + +查询score中选学多门课程的同学中分数为非最高分成绩的记录。 + +查询成绩高于学号为“109”、课程号为“3-105”的成绩的所有记录。 + +~~~ sql +select * from score INNER JOIN student INNER JOIN course on score.Sno=student.Sno and course.Cno=score.Sno where Degree>(score.Sno='109') and score.Cno='3-105'; +~~~ + +查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 + +查询“张旭“教师任课的学生成绩。 + +~~~ sql +select Score.degree from Score inner join Course inner join Teacher ON +Score.Cno=Course.Cno and Course.Tno=Teacher.Tno where Teacher.Tname='张旭'; + +~~~ + + + +查询选修某课程的同学人数多于5人的教师姓名。 + +查询出“计算机系“教师所教课程的成绩表。 + +~~~ sql +SELECT score.Degree FROM teacher INNER JOIN course INNER JOIN score on teacher.Tno=course.Tno and course.Cno=score.Cno where teacher.Depart='计算机系'; +~~~ + + + +查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 + +查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 + +查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. + +查询成绩比该课程平均成绩低的同学的成绩表。 + +查询所有任课教师的Tname和Depart. + +查询所有未讲课的教师的Tname和Depart. + +查询“男”教师及其所上的课程。 + +~~~ sql +select Tname,Cname from Teacher inner join Course on +Teacher.Tno=Course.Tno +where +Tsex='男'; + +~~~ + + + +查询最高分同学的Sno、Cno和Degree列。 + +查询和“李军”同性别的所有同学的Sname. + +查询和“李军”同性别并同班的同学Sname. + +查询所有选修“计算机导论”课程的“男”同学的成绩表。 + +~~~ sql +select Degree from Course inner join Score inner join Student on +Course.Cno=Score.Cno and Score.Sno=Student.Sno +where +Ssex='男' +and +Cname=(select Cname from Course where Cname='计算机导论') ; + +~~~ + diff --git "a/40 \346\227\266\345\255\246\345\256\211/20230308 \345\255\220\346\237\245\350\257\242.md" "b/40 \346\227\266\345\255\246\345\256\211/20230308 \345\255\220\346\237\245\350\257\242.md" new file mode 100644 index 0000000..e12d2b2 --- /dev/null +++ "b/40 \346\227\266\345\255\246\345\256\211/20230308 \345\255\220\346\237\245\350\257\242.md" @@ -0,0 +1,200 @@ +# 笔记 + +7大字句 +1. from : 从哪些表中筛选 +2. on : 关联多表查询时,去除笛卡尔积 +3. where : 从表中筛选的条件 +4. group by : 分组依据 +5. having:在统计结果中再次筛选 +6. order by: 排序 +7. limit:分页 +必须按照(1)~(7)的顺序 编写字句 + +having子句也写条件 +where的条件是针对原表中的记录的筛选。where后面不能出现分组函数。 +having子句是对统计结果(分组函数计算后)的筛选。having可以加分组函数。 + +### 子查询 + +嵌套在其他sql语句中的查询语句 + +子查询通常先运行,所以要用()包括起来 + +子查询的运行结果可以作为其语句条件,数据源等 + +## select 1 from 2 where 3 + +# 作业 + +在如图的数据表上完成以下题目 +表一 + +~~~ sql +CREATE TABLE `stuinfo` ( + `stuN0` varchar(20) NOT NULL, + `stuName` varchar(20) DEFAULT NULL, + `stuSex` varchar(10) DEFAULT NULL, + `stuAge` int(11) DEFAULT NULL, + `stuAddress` varchar(20) DEFAULT NULL, + `stuseat` int(11) DEFAULT NULL, + PRIMARY KEY (`stuN0`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +~~~ + +表二 + +~~~ sql +CREATE TABLE `stuexam` ( + `examN0` int(11) NOT NULL, + `stuN0` varchar(20) DEFAULT NULL, + `wittenExam` int(11) DEFAULT NULL, + `labExam` int(11) DEFAULT NULL, + PRIMARY KEY (`examN0`), + KEY `stuN0` (`stuN0`), + CONSTRAINT `stuexam_ibfk_1` FOREIGN KEY (`stuN0`) REFERENCES `stuinfo` (`stuN0`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +~~~ + +表三 + +~~~ sql +CREATE TABLE `stumarks` ( + `examN0` int(11) DEFAULT NULL, + `stuID` varchar(20) DEFAULT NULL, + `score` int(11) DEFAULT NULL, + KEY `examN0` (`examN0`), + CONSTRAINT `stumarks_ibfk_1` FOREIGN KEY (`examN0`) REFERENCES `stuexam` (`examN0`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +~~~ + + +添加数据 + + +1. ~~~ sql + INSERT into stuinfo VALUES ('s2501','张秋利','男',20,'美国硅谷',1),('s2502','李斯文','女',18,'湖北武汉',2),('s2503','马文才','男',18,'湖南长沙',3),('s2504','欧阳俊雄','女',21,'湖北武汉',4),('s2505','梅超风','男',16,'湖北武汉',5),('s2506','陈旋风','男',19,'美国硅谷',6); + + ~~~sql + +2. + +INSERT INTO stuExam VALUES +(1,'s2501',50,70), +(2,'s2502',60,65), +(3,'s2503',86,70), +(4,'s2504',40,80), +(5,'s2505',70,85), +(6,'s2506',85,90); + ~~~ + +3. + +~~~ sql +INSERT INTO stuMarks VALUES +(1,'s2501',88), +(2,'s2501',92), +(3,'s2501',53), +(4,'s2502',60), +(5,'s2502',99), +(6,'s2503',82); +~~~ + +1.查询出年龄比班上平均年龄大的学生的信息 + +~~~ sql +SELECT * from stuinfo where stuAge >(select avg(stuAge) from stuinfo); +~~~ + +2.查询出每个学生的学号,姓名,性别和选修课程的最高分(stuMarks) + +~~~ sql +select t.stuN0,t.stuName,t.stuSex,max(score) from stumarks s left join stuinfo t on s.stuID=t.stuN0 group by s.stuID; +~~~ + +3.查询出每个学生的学号,姓名,性别和考试平均分(stuExam) + +~~~ sql + +~~~ + +4.查询性别是男并且年龄大于等于20的学生的信息(用两种方法实现:普通查询和子查询) + +~~~ sql +SELECT * from stuinfo where stuSex='男' and stuAge>=20; + +~~~ + +~~~ sql +SELECT * from stuinfo where stuAge=(SELECT stuAge from stuinfo where stuSex='男' and stuAge>=20); + +~~~ + + + +5.查询出年龄比所有男生年龄都大的女生的信息 + +~~~ sql +SELECT * from stuinfo where stuSex='女'and stuAge> all (SELECT stuAge from stuinfo where stuSex='男'); + +~~~ + + + +6.查询出所有选修课程都及格的学生的信息 (stuMarks) + +~~~ sql +SELECT * from stuinfo LEFT JOIN stumarks on stuinfo.stuN0=stumarks.stuID WHERE score>60 GROUP BY stuid; +~~~ + + + +7.查询出参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) + +~~~ sql +SELECT * from stuinfo a LEFT JOIN stumarks s on a.stuN0=s.stuID where s.score is not null; +~~~ + + + +8.查询出没有参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) + +~~~ sql +SELECT * from stuinfo a LEFT JOIN stumarks s on a.stuN0=s.stuID where s.score is null; +~~~ + + + +9.将有一门成绩成绩大于90分的学生的基本信息查询出来(stuMarks) + +~~~ sql +SELECT * from stuinfo LEFT JOIN stumarks on stuinfo.stuN0=stumarks.stuID where score>90; +~~~ + + + +10.查询出平均成绩在80分以上的学生的基本信息(stuMarks) + + + +11.查询出某同学所有考试成绩比“张秋利”同学所有分数都高的学生基本信息(stuMarks) + +~~~ sql +SELECT a.* from stuinfo a LEFT JOIN stumarks s on a.stuN0=s.stuID where s.score >(SELECT score from stumarks where stuID='s2501') GROUP BY stuID; +~~~ + + + +12.查询出某同学所有考试成绩只需要比“张秋利”同学某个分数高的学生基本信息(stuMarks) + +13.查询班上比所有男生年龄都要大的女生的信息 + +~~~ sql +SELECT * from stuinfo where stuSex='女'and stuAge> all (SELECT stuAge from stuinfo where stuSex='男'); +~~~ + +14.查询出只要比某个男生年龄大的女生的信息 + +~~~ sql +select * from stuinfo where stusex = '女' and stuage > (select min(stuage) from stuinfo where stusex = '男'); +~~~ + diff --git "a/40 \346\227\266\345\255\246\345\256\211/20230309\345\244\247\344\275\234\344\270\232.md" "b/40 \346\227\266\345\255\246\345\256\211/20230309\345\244\247\344\275\234\344\270\232.md" new file mode 100644 index 0000000..315dffa --- /dev/null +++ "b/40 \346\227\266\345\255\246\345\256\211/20230309\345\244\247\344\275\234\344\270\232.md" @@ -0,0 +1,187 @@ +你在一个软件公司上班,今天公司接一个新业务。要用MySQL给一个小说网站设计一个数据库。 +数据库名:xiaoshuo + +~~~ sql +CREATE database xiaoshuo charset utf8; +use xiaoshuo; +~~~ + + 作家信息表 ( author ) + +~~~ sql +CREATE TABLE `author` ( + `author_id` int(11) NOT NULL, + `author_name` varchar(20) NOT NULL, + `credits` int(11) DEFAULT NULL, + `vip_id` varchar(20) NOT NULL, + PRIMARY KEY (`author_id`), + KEY `vip_id` (`vip_id`), + CONSTRAINT `author_ibfk_1` FOREIGN KEY (`vip_id`) REFERENCES `vip` (`vip_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + + +~~~ + + 作家等级信息表 ( vip ) + +~~~ sql +CREATE TABLE `vip` ( + `vip_id` varchar(20) NOT NULL, + `vip_name` varchar(20) NOT NULL, + PRIMARY KEY (`vip_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +~~~ + +. 小说作品信息表 ( story ) + +~~~ sql +CREATE TABLE `story` ( + `story_id` int(11) NOT NULL AUTO_INCREMENT, + `author_id` int(11) DEFAULT NULL, + `type_id` varchar(20) DEFAULT NULL, + `story_name` varchar(50) DEFAULT NULL, + `views_number` int(11) DEFAULT NULL, + PRIMARY KEY (`story_id`), + KEY `author_id` (`author_id`), + KEY `type_id` (`type_id`), + CONSTRAINT `story_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `author` (`author_id`), + CONSTRAINT `story_ibfk_2` FOREIGN KEY (`type_id`) REFERENCES `type` (`type_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +~~~ + + 小说作品类型表 ( type ) + +~~~ sql +CREATE TABLE `type` ( + `type_id` varchar(20) NOT NULL, + `type_name` varchar(20) NOT NULL, + PRIMARY KEY (`type_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +~~~ + +## 表格 + +~~~ sql + +CREATE TABLE author( +author_id INT, +author_name VARCHAR(20), +credits int, +vip_id VARCHAR(20) +); + +CREATE TABLE vip( +vip_id VARCHAR(20), +vip_name VARCHAR(20) +); + + +CREATE TABLE story( +story_id INT, +author_id int, +type_id VARCHAR(20), +story_name VARCHAR(50), +views_number int +); + +CREATE TABLE type( +type_id VARCHAR(20), +type_name VARCHAR(20) +); +~~~ + + 作家信息表 + +~~~ sql +INSERT into author VALUES +(1001,'朱逸群',600,'VIP02'), +(1002,'范建',8510,'VIP04'), +(1003,'史珍香',981,'VIP02'), +(1004,'范统',2364,'VIP02'), +(1005,'杜子腾',257,'VIP01'), +(1006,'刘产',678,'VIP02'), +(1007,'杜琦燕',438,'VIP03'); +~~~ + + 等级信息表 + +~~~ sql +INSERT into vip VALUES +('VIP01','青铜作家'), +('VIP02','白银作家'), +('VIP03','黄金作家'), +('VIP04','钻石作家'); +~~~ + +小说作品信息表 + +~~~ sql +INSERT into story VALUES +(1,1002,'L03','母猪产后与护理师的二三事',6541), +(2,1005,'L04','拖拉机大战蜘蛛侠',563), +(3,1003,'L01','这只小龙虾不正经',8754), +(4,1006,'L04','一个爹爹三个娃',36354), +(5,1006,'L01','皇上滚开本宫只劫财 ',3674), +(6,1005,'L05','给长城贴瓷砖的小太监',6541), +(7,1003,'L03','不科学御兽',1257), +(8,1005,'L01','镜面管理局',3257), +(9,1004,'L02','关于我成为灭魂师之后',1147), +(10,1004,'L05','公子别秀',2078); +~~~ + + 作品类型 + +~~~ sql +INSERT into type VALUES +('L01','玄幻'), +('L02','奇幻'), +('L03','武侠'), +('L04','仙侠'), +('L05','都市'); +~~~ + +~~~ sql +-- 2. 将story 表中的story_name字段类型改成varchar(40) 。(2分) +ALTER TABLE story MODIFY story_name VARCHAR(40); +-- 3. 在author表中增加一个性别字段 字段名:author_sex,类型: char(10),要求默认值为'男'。 (3分) +ALTER TABLE author add author_sex char(10) DEFAULT'男'; +-- 4. 将作家编号为1005、1007的作家性别改为'女' 。(2分) +UPDATE author set author_sex='女' where author_id=1005 or author_id=1007; +-- 5. 作家杜子腾,写了一篇名为《拜登夸我很帅》的都市小说,有854个浏览量,请将这条信息插入到story +-- 表。(3分) +INSERT into story(author_id,type_id,story_name,views_number) VALUES (1005,'L05','拜登夸我很帅',854); +-- 6. 《拖拉机大战蜘蛛侠》这篇小说,浏览量涨了100,请更新story表中的相关数据。(2分) +UPDATE story set views_number=views_number+100 where story_name='拖拉机大战蜘蛛侠'; +-- 7. 请删除story表的中《皇上滚开本宫只劫财》这篇小说相关数据。(2分) +DELETE from story where story_name='皇上滚开本宫只劫财'; +-- 8. 查询 浏览量大于 8000的小说的作者编号和小说作品名称。(2分) +SELECT author_id,story_name from story where views_number>8000; +-- 9. 查询积分大于1000 并且会员等级高于vip03的作家所有信息。(3分 +SELECT * from author where credits>1000 and vip_id>'vip03'; +-- 10. 查询姓名以杜字开头的作家的姓名,积分和等级编号。(3分) +SELECT * from author where author_name like '杜%'; +-- 11. 查询积分在100、1000之间的作家信息,以积分降序排列。 (3分) +SELECT * from author where credits BETWEEN 100 and 1000 ORDER BY credits desc; +-- 12. 查询出小说的总浏览量,最高浏览量,最小浏览量,平均浏览量,给字段用上中文别名。(3分) +SELECT sum(views_number) 总浏览量,max(views_number) 最高浏览量, min(views_number) 最小浏览量,avg(views_number)平均浏览量 from story; +-- 13. 查询各种等级的作家的平均积分和作家数量,并对查询结果使用中文别名。(3分) +SELECT round(avg(credits),2),count(vip_id) from author GROUP BY vip_id; +-- 14. 查询小说数量大于等于2的分类编号和小说数量。(4分) +SELECT author_id,count(author_id) a from story GROUP BY author_id HAVING a>=2; +-- 15. 查询所有小说中浏览量最少的书的作品编号、作品名称和类型编号、浏览量。(4分) +SELECT story_id,story_name,type_id,min(views_number) from story; +-- 16. 查询积分比刘产高的作者所有信息。(5分) +SELECT * from author where credits>(SELECT credits from author where author_name='刘产'); +-- 17. 查询出哪些白银作家是没有写小说的,显示这些作家的姓名、等级名称。(8分 +select author_name 姓名,vip_name 等级名称 from vip v left join author a on v.vip_id=a.vip_id left join story s on a.author_id=s.author_id where story_id is null and vip_name='白银作家'; +-- 18. 找出写过作品浏览量大于5000的作家的所有作品中浏览量不到1000的作品信息(8分) +select * from story where author_id =any (select author_id from story where views_number>5000) and views_number<1000; +-- 19. 查询所有小说的小说编号、小说名称、浏览量、分类名称、作者姓名、作者积分、作者等级名称,结果 +-- 字段要用中文别名,并按浏览量降序排列,如果浏览量一样的,再按积分降序排列。(10分 +select s.story_id 小说编号, s.story_name 小说名称, s.views_number 浏览量, t.type_id 分类名称, a.author_name 作者姓名, a.credits 作者积分, v.vip_name 作者等级 from story s left join type t on s.type_id=t.type_id left join author a on +s.author_id=a.author_id left join vip v on a.vip_id=v.vip_id order by views_number desc,credits desc +~~~ + + + diff --git "a/40 \346\227\266\345\255\246\345\256\211/20230316\344\275\234\344\270\232.md" "b/40 \346\227\266\345\255\246\345\256\211/20230316\344\275\234\344\270\232.md" new file mode 100644 index 0000000..bfeda03 --- /dev/null +++ "b/40 \346\227\266\345\255\246\345\256\211/20230316\344\275\234\344\270\232.md" @@ -0,0 +1,61 @@ +~~~ sql +CREATE DATABASE diliu CHARSET utf8; +USE diliu; +CREATE TABLE USER( +user_id INT PRIMARY key, +user_name VARCHAR(10), +user_tel varchar(20), +ordertime DATE +); + +INSERT INTO user VALUES +(1,'张三','19865645691','2023-3-13'), +(2,'李四','12345675691','2023-3-13'), +(3,'王五','12894568901','2023-3-13'), +(4,'老六','12345678691','2023-3-14'), +(5,'小七','18945678031',NULL), +(6,'老八','19345678561','2023-3-16'), +(7,'朱九','15845679911',NULL); + +CREATE TABLE `order` ( +order_id INT, +uesr_id INT, +type VARCHAR(10), +food VARCHAR(20), +number INT, +price INT, +FOREIGN key (uesr_id) REFERENCES `user`(user_id) +); + +INSERT INTO `order` VALUES +(1,1,'快餐','肯德基全家桶',1,50), +(2,1,'快餐','可乐',4,20), +(3,6,'饮料','柠檬水',2,16), +(4,2,'米饭','鱼香肉丝盖饭',5,60), +(5,2,'饮料','珍珠奶茶',3,22), +(6,3,'粉面类','螺蛳粉',4,28), +(7,4,'粉面类','凉拌面',1,10); + + +-- 1.在用户表(user)新增一个性别字段user_sex,数据类型为char。 +ALTER TABLE user ADD user_sex CHAR; +-- 2.由于顾客3退单,请把此订单删除。 +DELETE FROM `order` where uesr_id=3; +-- 3.老八的电话号码换新了,请将他的号码更新为8888888888。 +UPDATE `user` SET user_tel=8888888888 where user_name='老八'; +-- 4.查询order表里的最高金额和总金额。 +SELECT max(price),sum(price) FROM `order` +-- 5.查询每个顾客分别订购了几个类别。 +SELECT * FROM `user` a left JOIN `order` b on a.user_id=b.uesr_id where b.type is NULL; +-- 6.查询饮料的总金额 +SELECT sum(price) from `order` WHERE type='饮料' +-- 7.查询订单表(order)里的订单号,类别(type),食物(food). +SELECT type,food FROM `order` +-- 8.查询没吃饭的人的所有信息 +SELECT * from `user` a LEFT JOIN `order` b on a.user_id=b.uesr_id where b.food is null; +-- 9.查询姓老的人的全部信息及订单信息 +SELECT * from `user` a left join `order` b on a.user_id=b.uesr_id where user_name like '老%' +-- 10.查询总金额大于20的订单里最大值的用户信息,使用降序 +SELECT a.* from `user` a left join `order` b on a.user_id=b.uesr_id where price>20 and price=(SELECT max(price) FROM `order`) ORDER BY price +~~~ + -- Gitee