diff --git "a/27 \345\210\230\347\225\231/20230218 MySQL\344\275\234\344\270\232.md" "b/27 \345\210\230\347\225\231/20230218 MySQL\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..0c4dd10f0f8c77710efc5625f56e5836d055a1b4 --- /dev/null +++ "b/27 \345\210\230\347\225\231/20230218 MySQL\344\275\234\344\270\232.md" @@ -0,0 +1,322 @@ +```SQL +笔记 +数据库是什么 +DBMS 的重要性无法多人共享数据无法提供操作大量数据所需的格式实现读取自动化需要编程技术能力无法应对突发事故DBMS 的种类层次性数据库最古老的数据库之一,因为突出的缺点,所以很少使用了 + +数据库分类 + +早期:层次模型、网状模型、关系模型, + +随着时间的推移和市场竞争,最终,基于关系模型的关系型数据库获得了绝对市场份额。 + +目前市场上主要分: + +关系型数据库、非关系型数据库两大类 +关系型数据库 +采用行列二维表结构来管理数据库,类似Excel的结构,使用专用的SQL语言对数据进行控制。关系数据库管理系统的常见种类Oracle ==> 甲骨文SQL Servce ==> 微软DB2 ==> IBMPostgreSQL ==> 开源MySQL ==> 开源 + +非关系型数据库,可看成传统关系型数据库的功能阉割版本,基于键值对存储数据,通过减少很少用的功能,来提高性能。 + +面向对象的数据库 +XML数据库键值存储系统DB2RedisMongoDBSQL 语句及其种类DDL(数据定义语言)create ==> 创建数据库或者表等对象drop ==> 删除数据库或者表等对象alter ==> 修改数据库或者表等对象的结构 + +DML(数据操作语言)select ==> 查询表中数据insert ==> 向表中插入数据update ==> 更新表中数据delete ==> 删除表中数据DCL(数据控制语言)commit ==> 决定对数据库中的数据进行变更rollback ==> 取消对数据库中的数据进行变更grant ==> 赋予用户操作权限revoke ==> 取消用户的操作权限SQL 的基本书写规则SQL 语句要以;结尾关键字不区分大小写,但是表中数据区分大小写关键字大写表名的首字母大写列明等小写常数的书写方式是固定的遇到字符串、日期等类型需要用到''单词间需要使用空格分割命名规则数据库和表的名称可以使用英文、数据以及下划线名称必须以英文作为开头名称不能重复 + +数据库有了,要怎么管理呢? + +DBMS:数据库管理系统 ( DataBase Management System )是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。 + +MySQL、Oracle、SqlServer都是数据库管理系统(DBMS,Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。 + +SQL是什么? + +SQL是结构化查询语言(Structure Query Language),专门用来操作/访问数据库的通用语言。 +数据类型 +integer数字型,但是不能存放小数 + +char定长字符串类型,指定最大长度,不足使用空格填充varchar可变长度字符串类型,指定最大长度,但是不足不填充 + +data存储日期,年/月/日 以上内容是对通用数据库以及sql语句相关的知识点介绍,本文不做过多的赘述,本文主要针对关系型数据库:MySQL 来进行各方面的知识点总结。 + +表的关系 +MySQL是关系型数据库管理系统,而在关系数据库管理系统中,很多表之间是有关系的,表之间的关系分为一对一关系、一对多关系和多对多关系。 + +一对一 +该关系中第一个表中的一个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。 + +一对多 +第一个表中的一个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关 + +多对多 +该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。**通常两个表的多对多关系会借助第三张表,转换为两个一对多的关系。 + +使用cmd命令连接 + +(1)-p与密码之间不能有空格,其他参数名与参数值之间可以有空格也可以没有空格 + +(2)密码建议在下一行输入 + +3)如果是连本机:-hlocalhost就可以省略,如果端口号没有修改:-P3306也可以省略 + +作业 +*| 字段名 | 数据类型 | +*| --- | --- | +*| c_num | int(11) | +*| c_name | varchar(50) | +*| c_contact | varchar(50) | +*| c_city | varchar(50) | +*| c_birth | date | + +*1、创建数据库test01_market + +c_citycreate database test01_market charset utf8; +use test01_market; +create table customers( +c_num int(11), +c_name varchar(50), +c_contact varchar(50), +c_city varchar(50), +c_birth date +); + +2、创建表格customers + +**要求3:**将c_contact字段移动到c_birth字段后面 + +alter table customers modify c_contact varchar(50) after c_birth; + +**要求4:**将c_name字段数据类型改为 varchar(70) + +alter table customers modify c_name varchar(70); + +**要求5:**将c_contact字段改名为c_phone + +alter table customers change c_contact c_phone varchar(50); + +**要求6:**增加c_gender字段到c_name后面,数据类型为char(1) + +alter table customers add column c_gender char(1); +alter table customers modify c_gender varchar(50) after c_name ; + +**要求7:**将表名改为customers_info + +alter table customers rename to customers_info; + +**要求8:**删除字段 + +alter table customers_info drop column c_city; + +*1、创建数据库test02_library + +CREATE DATABASE test02_library; +alter database test02_library charset utf8; +show CREATE DATABASE test02_library; +use test02_library; + +*2、创建表格books + +show CREATE TABLE books; +alter table books charset=utf8; + +| *-- | 字段名 | 字段说明 | 数据类型 | 允许为空 | 唯一 | +| --- | ------- | ---- | ------------ | ---- | --- | +| -- | b_id | 书编号 | int(11) | 否 | 是 | +| -- | b_name | 书名 | varchar(50) | 否 | 否 | +| -- | authors | 作者 | varchar(100) | 否 | 否 | +| -- | price | 价格 | float | 否 | 否 | +| -- | pubdate | 出版日期 | year | 否 | 否 | +| -- | note | 说明 | varchar(100) | 是 | 否 | +| -- | num | 库存 | int(11) | 否 | 否 | + +CREATE TABLE books( +b_id int(1)ZEROFILL not null comment 书编号 , +b_name varchar(50) not null comment 书名, +authors1 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 库存 +); +ALTER TABLE books MODIFY b_id int(1)not null auto_increment; + +-- 3、向books表中插入记录 + +-- 1) 指定所有字段名称插入第一条记录 + +INSERT into books(b_id,b_name,authors1,price,pubdate,note,num) VALUES(1,'Tal of AAA','Dickes',23,1995,'novel','11'); + +-- 2)不指定字段名称插入第二记录 + +INSERT into books VALUES(2,'EmmaT','Jane lura',35,1993,'joke','22'); + +-- 3)同时插入多条记录(剩下的所有记录) +INSERT into books VALUES(3,'Story of Jane','Jane Tim',40,2001,'novel','0'); +INSERT into books VALUES(4,'Lovey Day','George Byron',20,2005,'novel','30'); +INSERT into books VALUES(5,'Old land','Honore Blade',30,2010,'law','0'); +INSERT into books VALUES(6,'The Battle','Upton Sara',30,1999,'medicine','40'); +INSERT into books VALUES(7,'Rose Hood','Richard haggard',28,2008,'cartoon','28'); +SELECT + +*from books; +-- 4、将小说类型(novel)的书的价格都增加5。 + +UPDATE books set price=price+5 WHERE note='novel'; + +*5、将名称为EmmaT的书的价格改为40。 + +UPDATE books set price=40 WHERE b_name='emmat'; + +*6、删除库存为0的记录 + +DELETE from books WHERE num=0; + +-- 1、创建数据库test03_bookstore + +CREATE database test03_bookstore CHARACTER set utf8; +use test03_bookstore; +drop DATABASE 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 | | +-- +----------+--------------+------+-----+---------+----------------+ +CREATE TABLE book( +id int auto_increment not null PRIMARY key, +title varchar(100) not null , +author varchar(100) not null , +price DOUBLE(11,2) not null , +sales int not null , +stock int 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 | +-- +----+---------------+------------+-------+-------+-------+----------------------------+ +-- ``` +insert into book VALUES(1,'解忧杂货店 ','东野圭吾',27.20,102,98,' upload/books/解忧杂货店.jpg'); +insert into book VALUES(2,' 边城','沈从文',23.00,102,98,'upload/books/边城.jpg'); +SELECT *from book; +-- 3、创建用户表users,并插入数据 +CREATE table users( +id int auto_increment not null PRIMARY key, +username varchar(100) not null UNIQUE KEY, +`password` VARCHAR(100) not null, +email varchar(100) +); +-- ```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 +insert into users VALUES(1,'admin','112233','admin@mxdx.com') +SELECT *from users; +show CREATE TABLE users; + +-- +----+----------+----------------------------------+--------------------+ +-- | id | username | password | email | +-- +----+----------+----------------------------------+--------------------+ +-- | 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 not null, +total_amount DOUBLE(11,2) not null, +state int not null, +user_id int +); +desc orders; +alter table orders add index(user_id); +-- 尝试添加部分模拟数据,参考示例如下: +insert into orders VALUES('15294258455691','2018-06-20 00:30:45',2,52.20,0,1); +-- ```mysql +-- +----------------+---------------------+-------------+--------------+-------+---------+ +-- | id | order_time | total_count | total_amount | state | user_id | +-- +----------------+---------------------+-------------+--------------+-------+---------+ +-- | 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 not null auto_increment PRIMARY KEY, +count int 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 | +-- +----+-------+--------+------------+----------+-------+------------+----------------+ +-- +insert into order_items VALUES(1,1,27.20,'解忧杂货店','东野圭吾',27.20, 'static/img/default.jpg','15294258455691'); +insert into order_items VALUES(2,1,23.00,'边城','沈从文',23.00,'static/img/default.jpg','15294258455691'); +``` + diff --git "a/27 \345\210\230\347\225\231/20230221 \347\272\246\346\235\237.md" "b/27 \345\210\230\347\225\231/20230221 \347\272\246\346\235\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..0bd9f319cc338aba686c11c924c39ff7d6dbfe94 --- /dev/null +++ "b/27 \345\210\230\347\225\231/20230221 \347\272\246\346\235\237.md" @@ -0,0 +1,322 @@ +```sql +笔记 +数据库是什么 +DBMS 的重要性无法多人共享数据无法提供操作大量数据所需的格式实现读取自动化需要编程技术能力无法应对突发事故DBMS 的种类层次性数据库最古老的数据库之一,因为突出的缺点,所以很少使用了 + +数据库分类 + +早期:层次模型、网状模型、关系模型, + +随着时间的推移和市场竞争,最终,基于关系模型的关系型数据库获得了绝对市场份额。 + +目前市场上主要分: + +关系型数据库、非关系型数据库两大类 +关系型数据库 +采用行列二维表结构来管理数据库,类似Excel的结构,使用专用的SQL语言对数据进行控制。关系数据库管理系统的常见种类Oracle ==> 甲骨文SQL Servce ==> 微软DB2 ==> IBMPostgreSQL ==> 开源MySQL ==> 开源 + +非关系型数据库,可看成传统关系型数据库的功能阉割版本,基于键值对存储数据,通过减少很少用的功能,来提高性能。 + +面向对象的数据库 +XML数据库键值存储系统DB2RedisMongoDBSQL 语句及其种类DDL(数据定义语言)create ==> 创建数据库或者表等对象drop ==> 删除数据库或者表等对象alter ==> 修改数据库或者表等对象的结构 + +DML(数据操作语言)select ==> 查询表中数据insert ==> 向表中插入数据update ==> 更新表中数据delete ==> 删除表中数据DCL(数据控制语言)commit ==> 决定对数据库中的数据进行变更rollback ==> 取消对数据库中的数据进行变更grant ==> 赋予用户操作权限revoke ==> 取消用户的操作权限SQL 的基本书写规则SQL 语句要以;结尾关键字不区分大小写,但是表中数据区分大小写关键字大写表名的首字母大写列明等小写常数的书写方式是固定的遇到字符串、日期等类型需要用到''单词间需要使用空格分割命名规则数据库和表的名称可以使用英文、数据以及下划线名称必须以英文作为开头名称不能重复 + +数据库有了,要怎么管理呢? + +DBMS:数据库管理系统 ( DataBase Management System )是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。 + +MySQL、Oracle、SqlServer都是数据库管理系统(DBMS,Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。 + +SQL是什么? + +SQL是结构化查询语言(Structure Query Language),专门用来操作/访问数据库的通用语言。 +数据类型 +integer数字型,但是不能存放小数 + +char定长字符串类型,指定最大长度,不足使用空格填充varchar可变长度字符串类型,指定最大长度,但是不足不填充 + +data存储日期,年/月/日 以上内容是对通用数据库以及sql语句相关的知识点介绍,本文不做过多的赘述,本文主要针对关系型数据库:MySQL 来进行各方面的知识点总结。 + +表的关系 +MySQL是关系型数据库管理系统,而在关系数据库管理系统中,很多表之间是有关系的,表之间的关系分为一对一关系、一对多关系和多对多关系。 + +一对一 +该关系中第一个表中的一个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。 + +一对多 +第一个表中的一个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关 + +多对多 +该关系中第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。**通常两个表的多对多关系会借助第三张表,转换为两个一对多的关系。 + +使用cmd命令连接 + +(1)-p与密码之间不能有空格,其他参数名与参数值之间可以有空格也可以没有空格 + +(2)密码建议在下一行输入 + +3)如果是连本机:-hlocalhost就可以省略,如果端口号没有修改:-P3306也可以省略 + +作业 +*| 字段名 | 数据类型 | +*| --- | --- | +*| c_num | int(11) | +*| c_name | varchar(50) | +*| c_contact | varchar(50) | +*| c_city | varchar(50) | +*| c_birth | date | + +*1、创建数据库test01_market + +c_citycreate database test01_market charset utf8; +use test01_market; +create table customers( +c_num int(11), +c_name varchar(50), +c_contact varchar(50), +c_city varchar(50), +c_birth date +); + +2、创建表格customers + +**要求3:**将c_contact字段移动到c_birth字段后面 + +alter table customers modify c_contact varchar(50) after c_birth; + +**要求4:**将c_name字段数据类型改为 varchar(70) + +alter table customers modify c_name varchar(70); + +**要求5:**将c_contact字段改名为c_phone + +alter table customers change c_contact c_phone varchar(50); + +**要求6:**增加c_gender字段到c_name后面,数据类型为char(1) + +alter table customers add column c_gender char(1); +alter table customers modify c_gender varchar(50) after c_name ; + +**要求7:**将表名改为customers_info + +alter table customers rename to customers_info; + +**要求8:**删除字段 + +alter table customers_info drop column c_city; + +*1、创建数据库test02_library + +CREATE DATABASE test02_library; +alter database test02_library charset utf8; +show CREATE DATABASE test02_library; +use test02_library; + +*2、创建表格books + +show CREATE TABLE books; +alter table books charset=utf8; + +| *-- | 字段名 | 字段说明 | 数据类型 | 允许为空 | 唯一 | +| --- | ------- | ---- | ------------ | ---- | --- | +| -- | b_id | 书编号 | int(11) | 否 | 是 | +| -- | b_name | 书名 | varchar(50) | 否 | 否 | +| -- | authors | 作者 | varchar(100) | 否 | 否 | +| -- | price | 价格 | float | 否 | 否 | +| -- | pubdate | 出版日期 | year | 否 | 否 | +| -- | note | 说明 | varchar(100) | 是 | 否 | +| -- | num | 库存 | int(11) | 否 | 否 | + +CREATE TABLE books( +b_id int(1)ZEROFILL not null comment 书编号 , +b_name varchar(50) not null comment 书名, +authors1 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 库存 +); +ALTER TABLE books MODIFY b_id int(1)not null auto_increment; + +-- 3、向books表中插入记录 + +-- 1) 指定所有字段名称插入第一条记录 + +INSERT into books(b_id,b_name,authors1,price,pubdate,note,num) VALUES(1,'Tal of AAA','Dickes',23,1995,'novel','11'); + +-- 2)不指定字段名称插入第二记录 + +INSERT into books VALUES(2,'EmmaT','Jane lura',35,1993,'joke','22'); + +-- 3)同时插入多条记录(剩下的所有记录) +INSERT into books VALUES(3,'Story of Jane','Jane Tim',40,2001,'novel','0'); +INSERT into books VALUES(4,'Lovey Day','George Byron',20,2005,'novel','30'); +INSERT into books VALUES(5,'Old land','Honore Blade',30,2010,'law','0'); +INSERT into books VALUES(6,'The Battle','Upton Sara',30,1999,'medicine','40'); +INSERT into books VALUES(7,'Rose Hood','Richard haggard',28,2008,'cartoon','28'); +SELECT + +*from books; +-- 4、将小说类型(novel)的书的价格都增加5。 + +UPDATE books set price=price+5 WHERE note='novel'; + +*5、将名称为EmmaT的书的价格改为40。 + +UPDATE books set price=40 WHERE b_name='emmat'; + +*6、删除库存为0的记录 + +DELETE from books WHERE num=0; + +-- 1、创建数据库test03_bookstore + +CREATE database test03_bookstore CHARACTER set utf8; +use test03_bookstore; +drop DATABASE 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 | | +-- +----------+--------------+------+-----+---------+----------------+ +CREATE TABLE book( +id int auto_increment not null PRIMARY key, +title varchar(100) not null , +author varchar(100) not null , +price DOUBLE(11,2) not null , +sales int not null , +stock int 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 | +-- +----+---------------+------------+-------+-------+-------+----------------------------+ +-- ``` +insert into book VALUES(1,'解忧杂货店 ','东野圭吾',27.20,102,98,' upload/books/解忧杂货店.jpg'); +insert into book VALUES(2,' 边城','沈从文',23.00,102,98,'upload/books/边城.jpg'); +SELECT *from book; +-- 3、创建用户表users,并插入数据 +CREATE table users( +id int auto_increment not null PRIMARY key, +username varchar(100) not null UNIQUE KEY, +`password` VARCHAR(100) not null, +email varchar(100) +); +-- ```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 +insert into users VALUES(1,'admin','112233','admin@mxdx.com') +SELECT *from users; +show CREATE TABLE users; + +-- +----+----------+----------------------------------+--------------------+ +-- | id | username | password | email | +-- +----+----------+----------------------------------+--------------------+ +-- | 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 not null, +total_amount DOUBLE(11,2) not null, +state int not null, +user_id int +); +desc orders; +alter table orders add index(user_id); +-- 尝试添加部分模拟数据,参考示例如下: +insert into orders VALUES('15294258455691','2018-06-20 00:30:45',2,52.20,0,1); +-- ```mysql +-- +----------------+---------------------+-------------+--------------+-------+---------+ +-- | id | order_time | total_count | total_amount | state | user_id | +-- +----------------+---------------------+-------------+--------------+-------+---------+ +-- | 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 not null auto_increment PRIMARY KEY, +count int 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 | +-- +----+-------+--------+------------+----------+-------+------------+----------------+ +-- +insert into order_items VALUES(1,1,27.20,'解忧杂货店','东野圭吾',27.20, 'static/img/default.jpg','15294258455691'); +insert into order_items VALUES(2,1,23.00,'边城','沈从文',23.00,'static/img/default.jpg','15294258455691'); +``` + diff --git "a/27 \345\210\230\347\225\231/20230228 \345\205\263\350\201\224.md" "b/27 \345\210\230\347\225\231/20230228 \345\205\263\350\201\224.md" new file mode 100644 index 0000000000000000000000000000000000000000..8af9f32c4343c2f8f5dec03916b791a511c10e95 --- /dev/null +++ "b/27 \345\210\230\347\225\231/20230228 \345\205\263\350\201\224.md" @@ -0,0 +1,162 @@ +```sql +笔记 +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、两个表要一起查询,要有前提条件:有关联 +就是有相同逻辑意义和数据类型的字段。 + +3、如何实现7种查询结果 +(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 + +4、内连接 inner join +A表 inner join B表 on 关联条件 + +# 关联查询:两个或更多个表一起查询。 + +# 关联查询:两个或更多个表一起查询。 + + +作业 +create database class6 charset utf8; +use class6; +create table Student( + Sno varchar (20) not null,#学号(主码) + Sname varchar (20) not null,#学生姓名 + Ssex varchar (20) not null,#学生性别 + Sbirthday datetime,#学生出生年月 + Class varchar (20)#学生所在班级 +); +create table Course( + Cno varchar (20) not null,#课程号(主码) + Cname varchar (20) not null,#课程编号 + Tno varchar (20)not NULL#教工编号(外码) +); +create table Score( + Sno varchar(20) not null,#学号 + Cno varchar(20) not null,#课程号 + Degree Decimal(4,1)#成绩 +); +create table Teacher( + Tno varchar (20) not null,#教工编号(主码) + Tname varchar (20) not null,#教工姓名 + Tsex varchar (20) not null,#教工性别 + Tbirthday datetime,#教工出生年月 + Prof varchar (20),#职称 + Depart varchar (20) not null#教工所在部门 +); +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); +insert into Course VALUES +('3-105','计算机导论',825), +('3-245','操作系统',804), +('6-166','数字电路',856), +('9-888','高等数学',831); +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); +insert into Teacher VALUES +(804,'李诚','男','1958-12-2','副教授','计算机系'), +(856,'张旭','男','1969-3-12','讲师','电子工程系'), +(825,'王萍','女','1972-5-5','助教','计算机系'), +(831,'刘冰','女','1977-8-14','助教','电子工程系'); +-- 1,查询所有学生,都学了哪些课程,要显示学生信息和课程信息 +select + * + from Student,Course,Score +where Student.Sno=Score.Sno AND Course.Cno=Score.Cno; +-- 2,查询没有学生的教师的所有信息 +SELECT + * + from Course,Score,Teacher + where (Teacher.Tno=Course.Tno AND Course.Cno=Score.Cno); +#4. 查询 +#① 查询Score表中的最高分的学生学号和课程号。 +select Sno,Cno from Score where Degree in (select MAX(Degree) from Score); +#② 查询所有学生的Sname、Cno和Degree列。 +select Sname,Cno,Degree from Student,Score where Student.Sno=Score.Sno; +#③ 查询所有学生的Sno、Cname和Degree列。 +select Sno,Cname,Degree from Course,Score where Course.Cno=Score.Cno; +#④ 查询所有学生的Sname、Cname和Degree列。 +select Sname,Cname,Degree from Student,Course,Score where Student.Sno=Score.Sno AND Course.Cno=Score.Cno; +#⑤ 查询“95033”班学生的平均分。 +select AVG(Degree) from Student,Score where Student.Sno=Score.Sno AND Class=95033; +#⑥ 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 +select * from Student,Score where Student.Sno=Score.Sno and Score.Degree>(select Degree from Score where Cno='3-105' and Sno='109'); +#⑦ 查询score中选学多门课程的同学中分数为非最高分成绩的记录。 +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”的成绩的所有记录。 +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列。 +select Sno,Sname,Sbirthday from Student where year(student.Sbirthday)=(select year(Sbirthday) from student where Sno='108'); +#⑩ 查询“张旭“教师任课的学生成绩。 +select Sname,Degree from Student,Score where Student.Sno=Score.Sno and Cno ='6-166'; +#11 查询选修某课程的同学人数多于5人的教师姓名。 +select Tname from Teacher where Tno in (select Tno from Course where Cno in (select Cno from Score group by Cno having COUNT(*)>5)); +#12 查询出“计算机系“教师所教课程的成绩表。 +select sno,Cno ,Degree from Score where Cno in (select Cno from Course where Tno in (select tno from Teacher where Depart='计算机系')); +#13 查询“计算机系”与“电子工程系“不同职称的教师的Tname和Prof。 +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从高到低次序排序。 +select Cno,Sno,Degree from Score a where (select Degree from Score b where Cno='3-105' and b.Sno=a.Sno)>(select Degree from Score c where Cno='3-245' and c.Sno=a.Sno) order by Degree desc; +#15 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. +select Cno,Sno,Degree from Score a where (select Degree from Score b where Cno='3-105' and b.Sno=a.Sno)>(select Degree from Score c where Cno='3-245' and c.Sno=a.Sno); +#16 查询成绩比该课程平均成绩低的同学的成绩表。 +select Sno,Cno,Degree from Score a where a.Degree<(select AVG(Degree) from Score b where a.Cno=b.Cno); +#17 查询所有任课教师的Tname和Depart. +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. +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 查询“男”教师及其所上的课程。 +select Tname,Cname from Teacher,Course where Tsex='男' and Teacher.Tno=Course.Tno; +#20 查询最高分同学的Sno、Cno和Degree列。 +select Sno,Cno,Degree from Score where Degree=(select MAX(Degree)from Score); +#21 查询和“李军”同性别的所有同学的Sname. +select Sname from student where Ssex=(select Ssex from student where Sname='李军') and Sname not in ('李军'); +#22 查询和“李军”同性别并同班的同学Sname. +select Sname from student where Ssex=(select Ssex from student where Sname='李军') and Sname not in ('李军') and Class=(select Class from student where Sname='李军'); +#23 查询所有选修“计算机导论”课程的“男”同学的成绩表。 +select Sno,Degree from Score where Sno in (select Sno from student where Ssex='男') and Cno in (select Cno from Course where Cname='计算机导论'); +``` + diff --git "a/27 \345\210\230\347\225\231/20230311 \344\275\234\344\270\232.md" "b/27 \345\210\230\347\225\231/20230311 \344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..eae00823d9c4f600692d2ba308c37e2326321fb5 --- /dev/null +++ "b/27 \345\210\230\347\225\231/20230311 \344\275\234\344\270\232.md" @@ -0,0 +1,116 @@ +```sql +create database class1 charset utf8; +use class1; + +create table stuinfo( + stuNo varchar(20), + stuName varchar(10), + stuAge int, + stuAddress varchar(20), + stuSeat int, + stuSex int + ); + +insert into stuinfo values +('s2501','张秋利',20,'美国硅谷',1,1), +('s2502','李斯文',18,'湖北武汉',2,0), +('s2503','马文才',22,'湖南长沙',3,1), +('s2504','欧阳俊雄',21,'湖北武汉',4,0), +('s2505','梅超风',20,'湖北武汉',5,1), +('s2506','陈旋风',19,'美国硅谷',6,1), +('s2507','陈风',20,'美国硅谷',7,0); + +create table stuexam( + examNo int, + stuNo varchar(10), + writtenExam int, + labExam int +); + +insert into stuexam VALUES +(1,'s2501',50,70), +(2,'s2502',60,65), +(3,'s2503',86,85), +(4,'s2504',40,80), +(5,'s2505',70,90), +(6,'s2506',85,90); + +-- 按图片所给的数据进行数据表的建立和数据插入,然后进行以下查询操作 +-- +-- 1.查询学生信息表(stuinfo)中所有列信息,给每列取上中文名称 +-- +select stuNo 学号,stuName 姓名,stuAge 年龄,stuAddress 地址,stuSeat 座号,stuSex 性别 from stuinfo; +-- 2.查询学生信息表(stuinfo)中的姓名,年龄和地址三列的信息 +-- +select stuName 姓名,stuAge 年龄,stuAddress 地址 from stuinfo; +-- 3.查询学生分数表(stuexam)中的学号,笔试和机试三列的信息,并为这三列取中文名字 +-- +select stuNo 学号,writtenExam 笔试,labExam 机试 from stuexam; +-- 5.查询学生分数表(stuexam)中的学生的学号,笔试,机试以及总分这四列的信息 +-- +select stuNo 学号,writtenExam 笔试,labExam 机试,writtenExam+labExam 总分 from stuexam; +-- 6.查询学生信息表(stuInfo)中学生来自哪几个地方 +-- +select stuAddress from stuinfo group by stuAddress; +-- 7.查询学生信息表(stuInfo)中学生有哪几种年龄,并为该列取对应的中文列名 +-- +select stuAge 年龄 from stuinfo group by stuage; +-- 8.查询学生信息表(stuInfo)中前3行记录 +-- +select * from stuinfo where stuNo<='s2503'; +-- 9.查询学生信息表(stuInfo)中前4个学生的姓名和座位号 +-- +select stuName 姓名,stuSeat 座号 from stuinfo where stuseat<=4; +-- 11.将地址是湖北武汉,年龄是20的学生的所有信息查询出来 +-- +select * from stuinfo where stuaddress='湖北武汉' and stuage=20; +-- 12.将机试成绩在60-80之间的信息查询出来,并按照机试成绩降序排列 +-- +select * from stuexam where labExam>=60 or labExam<=80 order by labExam desc; +-- 13.查询来自湖北武汉或者湖南长沙的学生的所有信息 +-- +select * from stuinfo where stuAddress='湖北武汉' or stuAddress='湖南长沙'; +-- 14.查询出笔试成绩不在70-90之间的信息,并按照笔试成绩升序排列 +-- +select * from stuexam where writtenExam<70 or writtenExam>90 order by writtenExam; +-- 15.查询年龄没有写的学生所有信息 +-- +select * from stuinfo where stuAge is null; +-- 16.查询年龄写了的学生所有信息 +-- +select * from stuinfo where stuAge is not null; + +-- 17.查询姓张的学生信息 +-- +select * from stuinfo where stuName like '张%'; +-- 18.查询学生地址中有‘湖’字的信息 +-- +select * from stuinfo where stuaddress like '%湖%'; +-- 19.查询姓张但名为一个字的学生信息 +-- +select * from stuinfo where stuname like '张_'; +-- 20.查询姓名中第三个字为‘俊’的学生的信息,‘俊’后面有多少个字不限制 +-- +select * from stuinfo where stuname like '__俊%'; +-- 21.按学生的年龄降序显示所有学生信息 +-- +select * from stuinfo order by stuage desc; +-- 22.按学生的年龄降序和座位号升序来显示所有学生的信息 +-- +select * from stuinfo order by stuage desc,stuSeat; +-- 23显示笔试第一名的学生的考试号,学号,笔试成绩和机试成绩 +-- +select * from stuexam where writtenexam=(select max(writtenexam) from stuexam); +-- 24.显示机试倒数第一名的学生的考试号,学号,笔试成绩和机试成绩 +-- +select * from stuexam where labexam=(select min(labexam) from stuexam); +-- 25.查询每个地方的学生的平均年龄 +-- +select stuaddress, round(avg(stuage),2) from stuinfo group by stuaddress; +-- 26.查询男女生的分别的年龄总和 +-- +select stusex,sum(stuage) from stuinfo group by stusex; +-- 27.查询每个地方的男女生的平均年龄和年龄的总和 +select stuaddress,stusex,round(avg(stuage),2),sum(stuage) from stuinfo group by stuaddress,stusex; +``` + diff --git "a/27 \345\210\230\347\225\231/20230311 \344\275\234\344\270\2322.md" "b/27 \345\210\230\347\225\231/20230311 \344\275\234\344\270\2322.md" new file mode 100644 index 0000000000000000000000000000000000000000..2cdf2bfc63d0fbe560742e4f3bb12ea093c51e2a --- /dev/null +++ "b/27 \345\210\230\347\225\231/20230311 \344\275\234\344\270\2322.md" @@ -0,0 +1,125 @@ +```sql +CREATE DATABASE if not exists xiaoshuo charset utf8; +use xiaoshuo; +CREATE TABLE if not exists vip( + vip_id VARCHAR(20) PRIMARY KEY COMMENT '等级编号', + vip_name VARCHAR(20) NOT NULL UNIQUE KEY COMMENT '等级名称' +); + +CREATE TABLE if not EXISTS author( + author_id int PRIMARY KEY COMMENT '作家编号', + author_name VARCHAR(20) NOT NULL UNIQUE KEY COMMENT '作家姓名', + credits int COMMENT '积分', + vip_id VARCHAR(20) NOT NULL COMMENT '等级编号', + FOREIGN KEY (vip_id) REFERENCES vip(vip_id) +); + + +CREATE TABLE if not EXISTS type( + type_id VARCHAR(20) PRIMARY KEY COMMENT '类型编号', + type_name VARCHAR(20) NOT NULL UNIQUE KEY COMMENT'类型名称' + +); + +CREATE TABLE if not exists story( + story_id int PRIMARY KEY auto_increment COMMENT '作品编号', + author_id int COMMent '作家编号', + FOREIGN key (author_id) REFERENCES author(author_id), + type_id VARCHAR(20) COMMENT '类型编号', + FOREIGN KEY (type_id) REFERENCES type(type_id), + story_name VARCHAR(50) COMMENT '作品名称', + views_number int COMMENT '浏览量' +); +INSERT INTO vip VALUES +('VIP01','青铜作家'), +('VIP02','白银作家'), +('VIP03','黄金作家'), +('VIP04','砖石作家'); + +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'); + +INSERT INTO type VALUES +('L01','玄幻'), +('L02','奇幻'), +('L03','武侠'), +('L04','仙侠'), +('L05','都市'); + + +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','镜面管理局',3216), +(9,1004,'L02','关于我成为灭魂师之后',1147), +(10,1004,'L05','公子别秀',2078); + + + + +ALTER TABLE story MODIFY story_name VARCHAR(40); +ALTER TABLE author add author_sex char(10) DEFAULT '男'; +UPDATE author set author_sex='女' WHERE author_id=1005 or author_id=1007; +INSERT INTO story VALUES(null,1005,'L05','拜登夸我很帅',854); +UPDATE story set views_number =views_number +100 WHERE story_name='拖拉机大战蜘蛛侠'; +DELETE FROM story WHERE story_name='皇上滚开本宫只劫财'; +SELECT * FROM story WHERE views_number>8000; +SELECT * FROM author a LEFT JOIN vip b on a.vip_id=b.vip_id WHERE b.vip_id>'VIP03' and a.credits>1000 ; +SELECT * FROM author WHERE author_name like '杜%'; +SELECT * FROM author WHERE credits BETWEEN 100 and 1000 ORDER BY credits desc; +SELECT SUM(views_number) as 总流量,MAX(views_number) as最高流量,MIN(views_number) as 最小流量,AVG(views_number) as 平均流量 FROM story; + +-- 13. 查询各种等级的作家的平均积分和作家数量,并对查询结果使用中文别名。(3分) +SELECT avg(credits) 平均积分,COUNT(author_id) 作家数量 FROM vip a RIGHT JOIN author b on a.vip_id=b.vip_id GROUP BY a.vip_id; + +-- 14. 查询小说数量大于等于2的分类编号和小说数量。(4分) + +SELECT b.type_id,count(story_name) FROM type a right JOIN story b on a.type_id=b.type_id GROUP BY b.type_id HAVING count(story_name)>=2 ; + +-- 15. 查询所有小说中浏览量最少的书的作品编号、作品名称和类型编号、浏览量。(4分) + + SELECT story_id,story_name,type_id,views_number FROM story WHERE views_number in(SELECT min(views_number) FROM story); + +-- 16. 查询积分比刘产高的作者所有信息。(5分) + + SELECT * FROM author WHERE credits>(SELECT credits FROM author WHERE author_name='刘产'); +-- 17. 查询出哪些白银作家是没有写小说的,显示这些作家的姓名、等级名称。(8分) +SELECT b.author_name,a.vip_name FROM vip a RIGHT JOIN author b on a.vip_id=b.vip_id left JOIN story c on b.author_id=c.author_id WHERE vip_name='白银作家' and story_name is NULL; + +18. 找出写过作品浏览量大于5000的作家的所有作品中浏览量不到1000的作品信息(8分) +SELECT * FROM +(SELECT author_id,story_name,views_number FROM story WHERE author_id in(SELECT author_id FROM story WHERE views_number >5000)) ww WHERE views_number <1000; + + + + + + + +SELECT * FROM +(SELECT author_id,story_name,views_number FROM story WHERE author_id in(SELECT author_id FROM story WHERE views_number>5000)) num WHERE views_number<1000; + +-- 19. 查询所有小说的小说编号、小说名称、浏览量、分类名称、作者姓名、作者积分、作者等级名称,结果 +-- 字段要用中文别名,并按浏览量降序排列,如果浏览量一样的,再按积分降序排列。 + +SELECT a.story_id 小说编号, a.story_name 小说名称,a.views_number 浏览量,b.type_name 分类名称,c.author_name 作者姓名,c.credits 作者积分,d.vip_name 作者等级名称 FROM story a JOIN type b on a.type_id=b.type_id JOIN author c on a.author_id=c.author_id JOIN vip d on c.vip_id=d.vip_id ORDER BY views_number desc,credits desc; + + + + +DESC story; +SELECT * FROM story; +desc author; +``` + diff --git "a/27 \345\210\230\347\225\231/20230321 \350\257\276\345\240\202\347\273\203\344\271\240.md" "b/27 \345\210\230\347\225\231/20230321 \350\257\276\345\240\202\347\273\203\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..9f0f95acda3789b38417b205db1e5631ef2a868a --- /dev/null +++ "b/27 \345\210\230\347\225\231/20230321 \350\257\276\345\240\202\347\273\203\344\271\240.md" @@ -0,0 +1,257 @@ +```sql +0.创建数据库练习 + 1.直接创建数据库db3 + CREATE database db3 charset utf8; + 2.判断是否存在并创建数据库db4 +CREATE database if not EXISTS db4 charset utf8; + 3.查看所有的数据库 + show databases; + 4.删除db3数据库 + drop database db3; + 5.查看正在使用的数据库 +SELECT database(); + 6.使用db4数据库 + use db4; + +1.创建表练习 + +- 需求:设计一张学生表,请注重数据类型、长度的合理性 + + 1.编号 + 2.姓名,姓名最长不超过10个汉字 + 3.性别,因为取值只有两种可能,因此最多一个汉字 + 4.生日,取值为年月日 + 5.入学成绩,小数点后保留两位 + 6.邮件地址,最大长度不超过 64 + 7.家庭联系电话,不一定是手机号码,可能会出现 - 等字符 + 8.学生状态(用数字表示,正常、休学、毕业...) + create table stu( + id int, + sname char(10), + sex char, + drither date, + rxcj double(5,2), + addres char(64), + phone varchar(11), + szt set ('正常','休学','毕业') + ); + drop table stu; + 2.更改表练习 + -- 1.修改stu表名为student + alter table stu rename to student; + -- 2.给学生表添加一列remark,类型为varchar(20) + ALTER table student add remark varchar(20); + -- 3.修改remark列的类型是varchar(100) + ALTER table student MODIFY remark varchar(100); + -- 4.修改remark列的名变为intro,类型varchar(30) + alter table student change remark intro varchar(30); + -- 5.删除intro列 + alter table student drop intro; + 3.添加数据 + -- 1.创建表 + create table que( + id int, + name varchar(30), + age int, + sex enum('男','女')); + + -- 2.插入部分数据,给id name age sex赋值 + /* + 1.在mysql中插入字符数据,数据使用单引号或者双引号都可以,建议使用单引号 + 2.在mysql中插入的数据是date类型,那么将数据书写在单引号或者双引号都可以 + */ + + -- 3.插入所有的字段,不写字段名 + insert into que(id,age,sex)values(1,19,'男'),(2,18,'女'),(3,19,'男'),(4,20,'女'); + -- 4.插入所有的字段,写出字段名 + insert into que(id,name,age,sex)values(1,'刘云',19,'男'),(2,'杨梅',18,'女'),(3,'熊大',19,'男'),(4,'诺云',20,'女'); + -- 5.批量插入数据 + insert into que values(5,'志雄','200','男'); + -- 插入数据注意 + -- 6.插入数据时 省略列名,那么如果不需要给列赋值那么使用null + insert into que VALUES(6,'文任务',null,'男'); + +4.修改数据 + + +-- 1.修改数据:修改性别都变为女、 +update que set sex='女'; +-- 2.修改数据:带条件修改id是2的学生性别变为男 +update que set sex='男'where id=2; + +SELECT *from que; + -- 3.一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京 + update que set age=26,sex='男' where id=3; + +5.删除数据 + -- 1.带条件删除数据,删除id是3的记录 + delete from que where id=3; + + +-- 2.带条件删除数据,删除id是1和2的记录 id in(1,2) : 表示id的值是1或者2 +delete from que where id in(1,2); + +-- 3.不带条件删除 +delete from que; +-- 还可以使用:DDL +-- 这里的table可以省略 + +6.查询数据 +-- 1.查询多个字段 +SELECT*from que; +-- * 表示所有字段 + +-- 2.写出查询每列的名称 + +SELECT id,name,age,sex from que; + -- 3.查询表中name和age列,name列的别名为姓名,age列的别名为年龄 + select name 姓名, age 年龄 from que; + -- 使用as起给字段和表起别名 + -- as可以省略 + +-- 4.去重 +select distinct age from que; +-- 对age去重 + +-- 对age和address去重 +SELECT distinct age,name from que; +-- 如果多个字段一起去重,如果所有的字段值全部一样才会去重 + + + +7.带条件的查询 + -- 1.查询数学成绩大于80学生 +SELECT * from student where shuxuescore>80; + -- 2.查询英语成绩小于等于80学生 +SELECT * from student where yingyuscore<80; + +-- 3.查询年龄等于20的学生 + +SELECT* from student where age=20; + -- 4.查询年龄不等于20的学生 + SELECT*from student where age !=20; + -- 5.查询年龄大于35并且性别是男的学生 +select * from student where age>35 and sex='男'; + -- 6.查询年龄大于35或者性别是男的学生 +SELECT * from student where age>35 or sex='男'; + -- 7.查询id是1 3 5的学生 +SELECT * from student where id in(1,3,5); +-- 8.查询id不是1 3 5的学生 + SELECT * from student where id not in(1,3,5); + -- not in 是in的取反,表示不在什么其中 + +-- 范围查询 +-- 9.英语成绩在75和90之间 + +select *from student where yyscore between 75 and 90; + +-- 模糊查询 使用like +-- 10.查询姓赵的学生 +SELECT *from student where name like '赵%'; +-- name like '赵%' 表示name的值以赵开始,后面是什么都可以 +-- %在模糊查询中表示任意个数的字符 + +-- 11.查询包含岩 +-- name like '%岩%' 表示name的值只要含有岩即可,前后%表示匹配任意多个字符 + +SELECT *from student where name like '%岩%'; + -- 12.查询姓赵并且是三个字的学生 + -- _下划线在模糊查询中表示单个字符 + +-- 排序 +-- desc表示降序 +-- 13.按照年龄降序排序 + +select *from student ORDER BY age desc; + -- 14.先按照年龄降序排序,如果年龄相同在按照数学降序排序 +select * from b1 ORDER BY age desc,math desc; + -- 15.先按照年龄降序排序,如果年龄相同在按照数学升序排序 +select * from b1 ORDER BY age desc,math asc; + +-- 聚合函数 +-- 16.查询学生总数即有多少名学生 + +select count(id) from b1; + -- 17.查询数学成绩总分数 +select sum(math) from b1; + -- 18.查询数学成绩最高分数 +select max(math) from b1; + -- 19.统计数学和英语总和值 + -- 实现一:分别统计数学和英语的每个总成绩,然后进行相加 + +-- 实现二:分别统计每个人的数学和英语成绩,然后将每个人的数学和英语成绩相加 +/* + 结果是:380 少了柳岩的90 + sum(math+english): + 问题原因: + + + +​ 解决上述问题:使用mysql自带函数:ifnull(字段值,默认值) +​ 说明: +​ ifnull(字段值,默认值) +​ 如果字段值是null,那么使用默认值作为ifnull函数的整体结果 +​ 如果字段值不是null,那么使用字段值作为ifnull函数的整体结果 +​ 举例: +​ ifnull(english,0): +​ 1)假设english的值是null===>ifnull(null,0)===>整体结果是0 +​ 2)假设english的值是80===>ifnull(80,0)===>整体结果是80 +*/select ifnull(sum(math+english),0) from b1; + + +​ + +-- 分组 + -- 准备数据 + create table car( + id int, + color char(2), + price float + ); + +​ insert into car(id,color,price) values(1,'黄色',16); +​ insert into car(id,color,price) values(2,'黄色',16); +​ insert into car(id,color,price) values(3,'蓝色',5); +​ insert into car(id,color,price) values(4,'红色',60); +​ insert into car(id,color,price) values(5,'白色',8); +​ insert into car(id,color,price) values(6,'红色',60); + +​ -- 1.查询每种颜色车辆的总价 +​ select sum(price) from car group by price; +​ -- 2.查询每种颜色车辆总价大于30车辆的颜色和总价 +​ select color,sum(price) from car GROUP BY price HAVING sum(price)>30 +​ -- 3.注意:分组查询的结果最好是分组字段和聚合函数,不要是其他字段 + +​ -- 4.where后面不能使用聚合函数 报错的 + +​ -- 小结:where是在分组前筛选,having是在分组后筛选 +​ -- 5.查询车的单价大于15的每种颜色车辆总价大于30车辆的颜色和总价 +​ select color,sum(price) from car where price>15 GROUP BY color HAVING sum(price)>30; + +-- 分页 + -- 1.分页查询数据,每页显示2条数据 + -- 第一页 + -- 0 表示起始索引,对应第一行数据 + -- 2表示每页显示2条数据 + +select * from car limit 0,2; + +​ -- 当起始索引是0的情况下可以不写索引0,写法如下, +​ -- 下面的2表示每页显示的数据行数 + +​ -- 第二页 +​ -- 第一个2表示起始索引,对应三行数据 +​ -- 第二个2表示每页显示两条数据,对于第二个参数每个公司基本是固定的,最后一页剩下几行数据 +​ -- 就会显示几行数据 + +select * from car limit 2,2; + -- 第三页 + /* + 公式: 起始索引 = (当前页码-1)*每页显示的条数 + 0 1 2 + 2 2 2 + 4 3 2 +select * from car LIMIT 4,2; + */ +``` + diff --git "a/27 \345\210\230\347\225\231/2023227 \346\237\245\350\257\242.md" "b/27 \345\210\230\347\225\231/2023227 \346\237\245\350\257\242.md" new file mode 100644 index 0000000000000000000000000000000000000000..78e6cd7d14a0642a0e887823d2e67bc65e8432bc --- /dev/null +++ "b/27 \345\210\230\347\225\231/2023227 \346\237\245\350\257\242.md" @@ -0,0 +1,169 @@ +```sql +一.笔记 +#select语句的最简单形式,查看某个常量、变量、表达式的结果 +SELECT 1; +SELECT 1+1; +SELECT NOW(); + +#查看某个表的数据 +#select * from 表名称; #前提是选择好了,针对哪个库操作,否则会报 No database selected错误 +#select * from 数据库名.表名称; +#*表示所有行所有列 +SELECT * FROM stu; + +#查看某些列的数据 +#select 字段列表 from 【数据库名.】表名称; + +SELECT `name` FROM stu; +SELECT id,`name` FROM stu; + +#查看某些行的数据 +SELECT * FROM stu WHERE `name` = '张三'; + +#查看某些行某些列的数据 +#查看张三的学号 +SELECT id FROM stu WHERE `name` = '张三'; + +#给查询结果取别名 +SELECT id AS 学号, `name` AS 姓名 FROM stu; +SELECT id 学号, `name` 姓名 FROM stu; +SELECT id "学 号", `name` "姓 名" FROM stu; + +#给表取别名 +SELECT id AS 学号, `name` AS 姓名 FROM stu 学生表; +SELECT id AS 学号, `name` AS 姓名 FROM stu "学生表"; #错误,表别名是不能加双引号 + +#mysql可以在查询结果中使用distinct关键字去重。 +#select distinct 字段列表 from 表名称 [where 条件]; + +第6章 mysql的运算符 +1、算术运算符 +加:+ +减:- +乘:* +除:/ 正常除 + div 只保留整数部分 +模:% + +*/ +SELECT 1+2; +SELECT 2-1; +SELECT 2*8; +SELECT 9/2; +SELECT 9 DIV 2; +SELECT 9.3 DIV 2; +SELECT 9%2; + +/* +大于:> +小于:< +大于等于:>= +小于等于:>= +等于:= 不能用于null判断 +不等于:!= 或 <> 不能用于null判断 +*/ +SELECT 1=1; +SELECT * FROM stu WHERE id = 1; +SELECT * FROM stu WHERE id == 1;#错误 Java中才有== +SELECT * FROM stu WHERE `name` = NULL; #错误,null值的判断不能用= +SELECT * FROM stu WHERE `name` IS NULL; +SELECT * FROM stu WHERE `name` <=> NULL; + +SELECT * FROM stu WHERE `name` != NULL;#错误,null值的判断不能用!= +SELECT * FROM stu WHERE `name` IS NOT NULL; +SELECT * FROM stu WHERE !(`name` <=> NULL); + +SELECT * FROM stu WHERE id != 1; +SELECT * FROM stu WHERE id <> 1; + +查询薪资高于15000的员工信息 +SELECT * FROM t_employee WHERE salary > 15000; + +查询不是1号部门的员工 +SELECT * FROM t_employee WHERE did != 1; + +查询所有的男员工信息 +SELECT * FROM t_employee WHERE gender = '男'; +区间范围:between x and y + not between x and y +集合范围:in (x,x,x) + not in(x,x,x) +查询薪资在[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; + +查询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 ename LIKE '%冰%'; + +查询名字中包含3个字,最后一个是“冰”字 的员工 +SELECT * FROM t_employee WHERE ename LIKE '__冰'; +逻辑与:&& 或 and +逻辑或:|| 或 or +逻辑非:! 或 not +逻辑异或: xor +二.作业 +第一题 +create database ab charset utf8; +use ab; +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); +select*from employee where salary>=12000 and salary<=13000; +select name,tel,addr from employee where name like '刘%'; +update employee set addr='广东韶关' where name='李四'; +select name from employee where name like '%小%'; +select* from employee where salary>11000 and sex like '男'; +select*from employee where tel is null; +select*from employee where (salary>12000 OR addr='广东深圳' OR addr='广东广州') and sex='男'; +select name 姓名 ,salary*12 年薪 from employee; +第二题 +create database jf charset utf8; +use jf; +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); +select*from countries_info where area>3000000 or population>=25000000; +select*from countries_info where continent like 'asia'; +select*from countries_info where area<10000 and population<1000000; +select*from countries_info where name like '%o%'; +select*from countries_info where gdp>10000000000; +select name 国家,population 人口,gdp GDP值,gdp/population 人均GDP值 from countries_info; +select*from countries_info where gdp/population<1000; +select name 国家,area 面积,population 人口,area/population 人均国土面积值 from countries_info; +``` +