diff --git "a/42 \345\270\270\351\223\255\350\277\234/20230218 DDL\345\222\214DML\350\257\255\345\217\245\347\273\203\344\271\240\345\222\214\347\254\224\350\256\260.md" "b/42 \345\270\270\351\223\255\350\277\234/20230218 DDL\345\222\214DML\350\257\255\345\217\245\347\273\203\344\271\240\345\222\214\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..3e2e8f3c007a972efa65489a20252f940c82ce00 --- /dev/null +++ "b/42 \345\270\270\351\223\255\350\277\234/20230218 DDL\345\222\214DML\350\257\255\345\217\245\347\273\203\344\271\240\345\222\214\347\254\224\350\256\260.md" @@ -0,0 +1,365 @@ +# 一、笔记 + +## 1、DDL语句 + + + +```sql +#1、数据库的查看: +show databases; + +#2、创建自己的数据库: +create database ikun(数据库名称); + +#3、删除自己的数据库: +drop database ikun(数据库名称); + +#4、查看某个数据库的详细定义: +show create database ikun(数据库名称); + +#5、修改数据库的编码: +alter database 数据库名称 character set 新的字符集名称 collate 校对规则(如utf8); +``` + +## 1)、校对规则 可以理解成排序规则 + +```sql +#如: +alter database ikun charset utf8; + +#一般先要指定在哪个数据库中堆表进行操作 +#使用哪个数据库 +use 数据库名 + +#查看当前数据库下面: +show tables; +``` + +## 2)、当前数据库下面,查看另一个数据库下面,当前用户可以查看的表有哪些 + +```sql +show tables from mxdx; +#创建表格 +create table 表名称( +字段名1 数据类型, +字段名2 数据类型, +字段名3 数据类型 +) +#如: +create table ikun( +id int, +name varchar(5), +birthday date, +age int, +tel char(11) +) + +#查看表结构: +DESC 表名称; +#如: +DESC + +#查看表的详细定义 +show create table ikun; + +#删除表格 +drop table ikun; +``` + +## 3)、有关表的修改的各种操作 + +```sql +#修改表的字符集合校对规则 +alter table 表名称 charset = 新字符集 collate = 新校对规则; +#如: +alter table ikun charset = utf8; #修改字符集编码,只有之后的操作有效 + +#删除一个字段名称: +alter table 表名称 change 旧字段名称 新的字段名称 数据类型; +#如: +alter table ikun change iikun kunkun char(11); + +#修改一个字段的数据类型 +alter table 表名称 modify 字段名称 新数据类型; +#如: +alter table ikun modify iikun int; + +#修改字段的位置,顺序 +alter table 表名称 modify 字段名称 数据类型 after 另一个字段; #放在ID后面 +alter table 表名称 modify 字段名称 数据类型 first; #放在第一位 +#如: +alter table ikun modify ikunkun int after rap; +alter table ikun modify ikunkun int first; + +#放在最后一位: +alter table ikun modify ikunkun int after rap; + +#重命名表 +alter table 表名称 rename to 新名称; +#如: +alter table ikun rename to ikunkun; +``` + +## 1、DML语句 + +1)、增删改 + +```sql +alter table ikun rename to ikunkun;#将iku重命为ikunkun + +#添加语句 +insert into 表名称 values(值列表);#要求值列表的数量,顺序要与表结构一一对于 +#如: +insert into ikun values(1,'蔡徐坤',85.5,'女','110',165,'2003-05-05'); + +#添加语句,可以指定部分字段赋值 +insert into 表名称(字段列表) values(值列表);#值列表只需要和前面的字段列表数量,顺序一一对应就可以 +#如: +insert into ikun(id,name) values(2,'李四'); + +#一条insert语句可以同时添加多行纪律 +insert into 表名称 values(值列表),(值列表),(值列表),...; +insert into 表名称(字段列表) values(值列表),(值列表),(值列表),...; +#如: +insert into ikun (id,name) VALUES (3,'王五'),(4,'赵六'),(5,'头七'); +insert into ikun VALUES(6,'合金坤',85.5,'女',85.9,'110',165.5,'2003-05-05'),(7,'金多多',85.5,'女',85.9,'110',165.5,'2003-05-05'); + +#修改 +update 表名称 set 字段名 = 值, 字段名 = 值 , 字段名 = 值, +#如: +6 合金坤 85.50 女 85.90 110 165.50 2003-05-05 +update ikun set id=66,`name`='土坤'; # 无条件 + +update 表名称 set 字段名 = 值, 字段名 = 值, 字段名 = 值 where 条件; +#如:修改李四王五的体重为86 +Update ikun set weight = 86 where name = '李四' or name = '王五'; +update ikun set weight = 86 where name = '李四' or name = '王五'; + +#删除整个表的数据 +delete from 表名称; +#如: +delete from sushan; + +#删除部分行 +delete from 表名称 where 条件; +#如: +delete from ikun where id = xiaoheizi; + +#删除weight列的数据 +update ikun set name = null; + +#删除weight列的定义 +alter table ikun drop name; +``` + + + +# 2、作业 + +## 作业1 + +```sql +-- 创建数据库test01_market +create database test01_market + +-- 创建表格customers +create table customers( +c_num int, +c_name VARCHAR(50), +c_contact VARCHAR(50), +c_city VARCHAR(50), +c_birth VARCHAR(50) +); + +-- 将c_contact字段移动到c_birth字段后面 +ALTER TABLE customers MODIFY c_contact VARCHAR(50) AFTER c_birth; + +-- 将c_name字段数据类型改为 varchar(70) +ALTER TABLE customers MODIFY COLUMN c_name VARCHAR(70); + +-- 将c_contact字段改名为c_phone +ALTER TABLE customers CHANGE c_contact c_phone VARCHAR(50); + +-- 增加c_gender字段到c_name后面,数据类型为char(1) +ALTER TABLE customers add c_gender char(1) AFTER c_name; + +-- 将表名改为 +ALTER TABLE customers RENAME TO customers_info; + +-- 删除字段c_city +ALTER TABLE customers_info DROP c_city; +``` + +## 作业2 + +```sql +-- 创建数据库test02_library +create database test02_library + +-- 创建表格books +create TABLE books( +b_id int(11), +b_name VARCHAR(50), +authors VARCHAR(50), +price float, +pubdate year, +note VARCHAR(100), +num INT(11) +); +ALTER TABLE books MODIFY b_id int(11) not NULL; +ALTER TABLE books MODIFY b_name VARCHAR(50) not null; +ALTER TABLE books MODIFY authors VARCHAR(50) not null; +ALTER TABLE books MODIFY price float not null; +ALTER TABLE books MODIFY pubdate year not null; +ALTER TABLE books MODIFY num INT(11) not null; +Alter Table books Add Primary Key(b_id); +alter table books modify column b_id int(11) comment '书编号'; +alter table books modify column b_name VARCHAR(50) comment '书名'; +alter table books modify column authors VARCHAR(50) comment '作者'; +alter table books modify column price float comment '价格'; +alter table books modify column pubdate year comment '出版日期'; +alter table books modify column note VARCHAR(100) comment '说明'; +alter table books modify column num INT(11) comment '库存'; +``` + +![image-20230218140424295](C:\Users\Administrator.DESKTOP-D8B8N9S\AppData\Roaming\Typora\typora-user-images\image-20230218140424295.png) + +```sql +-- 向books表中插入记录 +-- 指定所有字段名称插入第一条记录 +INSERT INTO books (b_id,b_name,authors,price,pubdate,note,num)VALUES(1,'Tal of AAA','Dickes',23,1995,'novel',11); + +-- 不指定字段名称插入第二记录 +INSERT INTO books VALUES(2,'EmmaT','Jane lura',35,1993,'joke',22); + +-- 同时插入多条记录(剩下的所有记录) +INSERT INTO books +VALUES(5,'Old land','Honore Blade',24,1995,'novel',63), + (6,'The Battle','Upton Sara',30,1989,'novel',13), + (7,'Rose Hood','Richard haggard',28,2005,'novel',13); + +-- 将小说类型(novel)的书的价格都增加5。 +UPDATE books SET price = price + 5 WHERE note='novel'; + +-- 将名称为EmmaT的书的价格改为40。 +UPDATE books SET price = 40 WHERE b_name ='EmmaT'; + +-- 删除库存为0的记录 +DELETE FROM books where num = 0; +``` + +## 作业3 + +```sql +-- 创建book表 +CREATE TABLE book( +id int(11) NOT NULL, +title VARCHAR(100) NOT NULL, +author VARCHAR(100) NOT NULL, +price DOUBLE(11,2) NOT NULL, +salse int(11) NOT NULL, +stock int(11) NOT NULL, +img_path VARCHAR(100) NOT NULL +) +Alter Table book Add Primary Key(id); +ALTER TABLE book MODIFY title VARCHAR(50); +-- 尝试添加部分模拟数据 +INSERT INTO book VALUES(1,'解忧杂货铺','东野圭吾',27.20 ,102,98,'upload/books/解忧杂货店.jpg'), +(2,'边城','沈从文',27.20 ,102,98,'upload/books/解忧杂货店.jpg'); + +-- 创建用户表users,并插入数据 +CREATE TABLE users( +id int(11), +username VARCHAR(100), +password VARCHAR(100), +email VARCHAR(100) +) +ALTER TABLE users MODIFY id int(11) NOT NULL; +ALTER TABLE users MODIFY username VARCHAR(100) NOT NULL; +ALTER TABLE users MODIFY password VARCHAR(100) NOT NULL; +Alter Table users Add Primary Key(id); +Alter Table users Add unique key(username); +-- 尝试添加部分模拟数据 +INSERT INTO users VALUES(1,'admin','112233','admin@mxdx.com'); +show full columns from orders; + +-- 创建订单表orders +CREATE TABLE orders( +id VARCHAR(100) NOT NULL, +order_time DATETIME NOT NULL, +total_count int(11) NOT NULL, +total_amount double(11,2) NOT NULL, +state int(11) NOT NULL, +user_id int(11) NOT NULL +) +ALTER TABLE orders ADD PRIMARY KEY (id); +ALTER TABLE orders ADD UNIQUE KEY (user_id); +-- 尝试添加部分模拟数据 +INSERT INTO orders VALUES(15294258455691,'2018-06-20 00:30;45',2,50.20,0,1); + +-- 创建订单明细表order_items +CREATE TABLE order_items( +id int(11) NOT NULL, +count int(11) NOT NULL, +amount double(11,2) NOT NULL, +title varchar(100) NOT NULL, +author varchar(100) NOT NULL, +price double(11,2) NOT NULL, +img_path varchar(100) NOT NULL, +order_id varchar(100) NOT NULL +) +ALTER TABLE order_items ADD PRIMARY KEY(id); +ALTER TABLE order_items ADD UNIQUE KEY(order_id); +-- 尝试添加部分模拟数据 +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','15294258455692'); +``` + +# 作业4 + +```sql +-- 数据库class3 +CREATE DATABASE class3; + +-- 表student +CREATE TABLE student( +`学号` INT, +`姓名` CHAR(5), +`性别` CHAR(1), +`爱好` VARCHAR(20), +`住址` VARCHAR(100), +`联系方式` VARCHAR(20), +`邮箱` VARCHAR(20), +`QQ号` VARCHAR(20) +) + +-- 并新增一条自己的记录。 +INSERT INTO student VALUES(45,'陈科吉','男','ikun','团结里','13626230658','12232312311@QQ.COM','12323012311'); +``` + + + +### 作业3第一小题 + +![image-20230218160052611](C:\Users\Administrator.DESKTOP-D8B8N9S\AppData\Roaming\Typora\typora-user-images\image-20230218160052611.png) + +![image-20230218160253461](C:\Users\Administrator.DESKTOP-D8B8N9S\AppData\Roaming\Typora\typora-user-images\image-20230218160253461.png) + +### 作业3第二小题 + +![image-20230218160111387](C:\Users\Administrator.DESKTOP-D8B8N9S\AppData\Roaming\Typora\typora-user-images\image-20230218160111387.png) + +![image-20230218160423569](C:\Users\Administrator.DESKTOP-D8B8N9S\AppData\Roaming\Typora\typora-user-images\image-20230218160423569.png) + +### 作业3第三小题 + +![image-20230218160130662](C:\Users\Administrator.DESKTOP-D8B8N9S\AppData\Roaming\Typora\typora-user-images\image-20230218160130662.png) + +![image-20230218160525426](C:\Users\Administrator.DESKTOP-D8B8N9S\AppData\Roaming\Typora\typora-user-images\image-20230218160525426.png) + +### 作业3第四小题 + +![image-20230218160157514](C:\Users\Administrator.DESKTOP-D8B8N9S\AppData\Roaming\Typora\typora-user-images\image-20230218160157514.png) + +![image-20230218160617525](C:\Users\Administrator.DESKTOP-D8B8N9S\AppData\Roaming\Typora\typora-user-images\image-20230218160617525.png) \ No newline at end of file diff --git "a/42 \345\270\270\351\223\255\350\277\234/20230221 DDL\345\222\214DML\345\273\272\350\241\250\344\270\216\345\241\253\345\200\274\345\222\214\347\254\224\350\256\260.md" "b/42 \345\270\270\351\223\255\350\277\234/20230221 DDL\345\222\214DML\345\273\272\350\241\250\344\270\216\345\241\253\345\200\274\345\222\214\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..865cdb3ad9b802360c07a22c1e74784d4be5ef7d --- /dev/null +++ "b/42 \345\270\270\351\223\255\350\277\234/20230221 DDL\345\222\214DML\345\273\272\350\241\250\344\270\216\345\241\253\345\200\274\345\222\214\347\254\224\350\256\260.md" @@ -0,0 +1,371 @@ + + +# 1、笔记 + +### 约束 主键、唯一、非空、默认、自增、外键 + +### 一、主键约束 + +1、关键字是**primary key** + +2、特点 + +A:每一个表只能有一个主键约束 + +B:主键约束的字段值是不允许为null,也不允许重复 + +```sql +create table ikun( +kunkun int primary key, +aikun varchar(29) +); +#建表后增加主键约束 +alter table 表名称 add primary key(字段列表); +#如: +alter table ikun add primary key(kunkun); + +#删除主键 +alter table 表名称 drop primary key; +#如: +alter table ikun drop primary key; +``` + +### 二、唯一建约束 + +1、关键字:unique key + +2、特点 + +A:允许为null,但不能重复 + +B:一个表可以有多个唯一键约束 + +```sql +create table ikun( +kun int primary key, +name varchar(20), +birthday date, +score int, +gender enum('男','女'), +tel char(10) unique key +); +#建表后增加唯一键约束 +alter table 表名称 add unique key(字段列表); +#如: +alter table ikun add unique key(sanme); + +#删除唯一键约束 +alter table 表名称 drop index 索引名; +``` + +### 三、非空约束 + +如果某个字段,不要求唯一,但是要求非空。那么就可以给字段加非空约束。 + +```sql +create table ikun( +id int primary key, +name carchar(20), +birthday date, +score int not null, +tel char(11) unique key +); +``` + +### 四、默认值约束 + +如果某个字段,在添加数据时未指定值时,希望不要用null处理,而是按照一个默认值处理 + +就可以使用默认值约束 + +如:学生性别,在为指定时,默认按照 男 处理 + +```sql +create table ikun( +id int primary key, +name varchar(20) unique key, +birthday date, +score int not null, +gender enum('男','女')not null default '男' +); +#删除score的非空约束 +alter table ikun modify score intl; + +#增加非空约束 +ALTER TABLE ikunt MODIFY score INT NOT NULL; + +#删除gender默认值约束,保留非空约束 +alter table ikun modify gender enum('男','女') not null; + +#删除gender的非空约束,保留默认值约束 +alter table ikun modify gender enum('男','女') default '男'; + +#保留非空和默认值约束 +alter table ikun modify gender enum('男','女') default '男' not null; + +#查看一个表的约束等信息,查看系统库“information_schema”的“table_constraints” +SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称'; +SELECT * FROM information_schema.table_constraints WHERE table_name= 'student'; +``` + +### 五、外键约束 + +约束两个表的关系,或者是一个表的两个字段之间的关系 + +1、主表(父表)和从表(子表) + +主表:被依赖,被参考 + +丛表:依赖别人,参考别人 + +2、外键的建立和指定要在从表中定义 + +3、关键字foreign key + +4、格式 foreign key (从表的字段) references 主表(被依赖的字段) + +5、要求 + +主表必须先存在 + +主表被依赖字段必须有索引,所以通常是主键列或唯一键列等才能作为被依赖的字段 + +删除表时,要么先删除从表,在删除主表,要么先解除外键约束,然后各自删除 + +从表的依赖字段数据,必须在主表被依赖的字段中选择 + +主表被依赖的字段数据不能轻易的删除和修改,要看是否被引用 + +外键约束的等级为 on update/delete cascade/(set null) + +```sql +部门表 +*/ +CREATE TABLE dept( + did INT PRIMARY KEY, + dname VARCHAR(20) +); +CREATE TABLE emp( + eid INT, + ename VARCHAR(20), + deptid INT, #这里的部门编号可以和dept表中的部门编号名字不一样,但是数据类型和逻辑意义要一样 + FOREIGN KEY (deptid) REFERENCES dept(did) +); +#emp依赖于dept表 +``` + +### 六、自增属性 + +维护某个字段的值自动增长的一个属性 + +它的要求: + +一个表最多只能有一个字段是自增 + +自增的字段必须为整数类型 + +自增的字段必须是键约束的字段(通常为主键、唯一键) + +自增字段赋值为null和0的时候,会自增 + +如果赋值为其他的值,按照你指定的值来 + +```sql +CREATE DATABASE mxdx; +USE mxdx; +CREATE TABLE stu( +sid INT AUTO_INCREMENT PRIMARY KEY, +sname VARCHAR(20) +); +``` + + + +# 2、作业 + +# 作业1 + +```sql +-- 创建数据库test01_company +CREATE DATABASE test01_company; + +-- 创建表格offices +CREATE TABLE offices( +officeCode int, +city VARCHAR(30), +address VARCHAR(50), +country VARCHAR(50), +postalCode VARCHAR(25) +); + +-- 创建表格employees +CREATE TABLE employees( +empNum int(11), +lastName VARCHAR(50), +firstName VARCHAR(50), +mobile VARCHAR(25), +codr int, +jobTitle VARCHAR(50), +birth date, +Note VARCHAR(255), +Sex VARCHAR(5) +); + +-- 将表employees的mobile字段修改到code字段后面。 +ALTER TABLE employees MODIFY mobile VARCHAR(25) AFTER codr; + +-- 将表employees的birth字段改名为birthday; +ALTER TABLE employees CHANGE birth birthday datetime; + +-- 修改sex字段,数据类型为char(1)。 +ALTER TABLE employees MODIFY Sex char(1); + +-- 删除字段note; +ALTER TABLE employees DROP COLUMN note; + +-- 增加字段名favoriate_activity,数据类型为varchar(100); +ALTER TABLE employees ADD favoriate_activity VARCHAR(100); + +-- 将表employees的名称修改为 employees_info +ALTER TABLE employees RENAME TO employees_info; +``` + +# 作业2 + +```sql +-- 创建数据库test02db +CREATE DATABASE test02db; + +-- 创建数据库pet +CREATE TABLE pet( +name VARCHAR(20), +owner VARCHAR(20), +species VARCHAR(20), +sex char(1), +birth year, +death year +) + +ALTER TABLE pet modify column name VARCHAR(20) comment '宠物名称'; +ALTER TABLE pet modify column owner VARCHAR(20) comment '宠物主人'; +ALTER TABLE pet modify column species VARCHAR(20) comment '种类'; +ALTER TABLE pet modify column sex char(1) comment '性别'; +ALTER TABLE pet modify column birth year comment '出生日期'; +ALTER TABLE pet modify column death year comment '死亡日期'; + +-- 添加记录 +INSERT INTO pet VALUES('Fluffy','harold','Cat','f','2003','2010'), +('Claws','harold','Cat','f','2003',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); + +-- 添加字段主人的生日owner_birth。 +ALTER TABLE pet ADD owner_birth datetime; + +-- 将名称为Claws的猫的主人改为kevin +update pet set name = 'Kevin' WHERE name = 'Claws'; + +-- 将没有死的狗的主人改为duck +UPDATE pet set owner = 'duck' WHERE NAME = 'Buffy'; + +-- 查询没有主人的宠物的名字; +SELECT name,owner FROM pet WHERE owner is NULL; + +-- 查询已经死了的cat的姓名,主人,以及去世时间; +SELECT name,owner,species,death FROM pet WHERE death = '2010'; + +-- 删除已经死亡的狗 +DELETE FROM pet WHERE name = 'bowser'; + +-- 查询所有宠物信息 +SELECT * from pet; +``` + +# 作业3 + +```sql +-- 在此数据库下创建如下3表,数据类型,宽度,是否为空根据实际情况自己定义。 +-- A. 部门表(department):部门编号(depid),部门名称(depname),部门简介(deinfo);其中部门编号为主键。 +CREATE TABLE department( +depid INT PRIMARY KEY, +depname VARCHAR(20), +deinfo VARCHAR(20) +) +-- B. 雇员表(employee):雇员编号(empid),姓名(name),性别(sex),职称(title),出生日期(birthday),所在部门编号(depid);其中 +-- 雇员编号为主键; +-- 部门编号为外键,外键约束等级为(on update cascade 和on delete set null); +-- 性别默认为男; +CREATE TABLE employee( +empid INT PRIMARY KEY, +name VARCHAR(20), +sex CHAR(1), +title VARCHAR(20), +birthday date, +depid INT, +FOREIGN KEY (depid) REFERENCES department(depid) on update cascade on delete set null +); +-- 设置默认值 +alter table `employee` alter column `sex` set default '男'; +-- C.工资表(salary):雇员编号(empid),基本工资(basesalary),职务工资(titlesalary),扣除(deduction)。其中雇员编号为主键。 +CREATE TABLE salary( +empid INT PRIMARY KEY, +basesalary INT, +titlesalary INT, +deduction INT, +FOREIGN KEY (empid) REFERENCES employee(empid) on update cascade on delete cascade +); +-- 添加数据 +INSERT INTO department VALUES (111,'生产部',NULL), +(222,'销售部',NULL), +(333,'人事部','人力资源管理'); +INSERT INTO employee VALUES (1001,'张三','男','高级工程师','1975-1-1',111), +(1002,'李四','女','助工','1985-1-1',111), +(1003,'王五','男','工程师','1979-11-11',222), +(1004,'张六','男','工程师','1999-1-1',222); +INSERT INTO salary VALUES (1001,2200,1100,200), +(1002,1200,200,null), +(1003,2900,700,200), +(1004,1950,700,150); +``` + +# 作业4 + +```sql +-- 表1 Department表的定义 +CREATE TABLE Department( +DepNo INT(10) PRIMARY KEY NOT NULL, +DepName VARCHAR(20) NOT NULL, +DepNote VARCHAR(50) +); +ALTER TABLE Department ADD CONSTRAINT unique_DepNo UNIQUE(DepNo); +ALTER TABLE Department MODIFY COLUMN DepNo INT(10) COMMENT '部门号'; +ALTER TABLE Department MODIFY COLUMN DepName VARCHAR(20) COMMENT '部门名称'; +ALTER TABLE Department MODIFY COLUMN DepNote VARCHAR(50) COMMENT '部门备注'; +-- 表2 Teacher表的定义 +CREATE TABLE Teacher( +Number int PRIMARY KEY NOT NULL, +Name VARCHAR(30) NOT NULL, +Sex VARCHAR(4), +Birth date, +DepNo INT, +Salary FLOAT, +Address VARCHAR(100), + FOREIGN KEY(DepNo) REFERENCES Department(DepNo) +); +ALTER TABLE Teacher ADD CONSTRAINT unique_Number UNIQUE(Number); +-- 添加记录 +INSERT INTO Department VALUES (601,'软件技术系','软件技术等专业'), +(602,'网络技术系','多媒体技术等专业'), +(603,'艺术设计系','广告艺术设计等专业'), +(604,'管理工程系','连锁经营管理等专业'); +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,'重庆市南岸区'); +-- 用SELECT语句查询Teacher表的所有记录。 +SELECT * FROM Teacher; +``` + diff --git "a/42 \345\270\270\351\223\255\350\277\234/20230224 \345\237\272\347\241\200\346\237\245\350\257\242\345\222\214\350\277\220\347\256\227\347\254\246\345\222\214\347\254\224\350\256\260.md" "b/42 \345\270\270\351\223\255\350\277\234/20230224 \345\237\272\347\241\200\346\237\245\350\257\242\345\222\214\350\277\220\347\256\227\347\254\246\345\222\214\347\254\224\350\256\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..5e1a095c4b8a5eea76e915dd6760fbc4bfbc9515 --- /dev/null +++ "b/42 \345\270\270\351\223\255\350\277\234/20230224 \345\237\272\347\241\200\346\237\245\350\257\242\345\222\214\350\277\220\347\256\227\347\254\246\345\222\214\347\254\224\350\256\260.md" @@ -0,0 +1,123 @@ + + + + +# 笔记 + +## 查询 + +```sql +#查询指定字段信息 +select 字段名 from 表名称; +select 字段名 from 表名称 where 条件; +#查询所有字段 +select * from 表名称; +#查询指定字段的所有信息 +select * from 表名称 where 条件; +select * from 表名称 where between x and y; +#去重 +select distinct 字段名 from 表名称 where 条件; +#模糊查询 +select * from 表名 where 字段名 like '_';#一个下划线相当于一个字符 +select * from 表名 where 字段名 like '%';#一个%表达任意字符 +#别名 +select 字段名 as '别名1' from 表名称 as 别名; +select 字段名 别名1 from 表名称 别名; +``` + +## 运算符 + +```sql +运算符 +加号 + +减号 - +乘号 * +除号 / div +div:只保留整数部分 +模 mod % 取余 +比较运算符 +大于 > +小于 < +大于等于 >= +小于等于 <= +不等于 != ,<> +安全等于 <=> +比较运算符除了安全等于其他的不能和null比较 +区间运算符 +#区间包含范围 +between x and y; +select * from 表名称 where between x and y; +#区间不包含范围 +not between x and y; +select * from 表名称 where not between x and y; +#范围 +in(x,y,z) +select * from 表名称 where in(x,y,z); +#范围外 +not in(x,y,z) +select * from 表名称 where not in(x,y,z); +关系运算符 +或 || or +与 && and +非 ! +异或 xor +``` + +# 作业 + +## 作业1 + +```sql +create database if not exists glass charset utf8; +use glass; +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 between 12000 and 13000; +select tel 工号,name 姓名,addr 家庭住址 from employee where name like '刘%'; +update employee set addr='广东韶关' where name='李四'; +select*FROM employee where name like '%小%'; +select*from employee where sex='男'and salary>11000; +select*from employee where tel is null; +select*from employee where salary>12000 or (addr in('广东深圳','广东广州')and sex='男'); +select name,salary from employee; +``` + +## 作业2 + +```sql +use glass; +create table if NOT 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); +select name,population,area from countries_info where area>=3000000 or population>=25000000; +select*from countries_info where area<10000 and population<100000; +select*from countries_info where name like '%o%'; +select*from countries_info where gdp>10000000000; +select (gdp/population),name,,population,gdp from countries_info; +select*from countries_info where (gdp/population)<1000; +select (area/population),name,area,population from countries_info; +``` + diff --git "a/42 \345\270\270\351\223\255\350\277\234/20230228 \350\201\224\350\241\250\344\275\234\344\270\232.md" "b/42 \345\270\270\351\223\255\350\277\234/20230228 \350\201\224\350\241\250\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..1dca58d6e9be51e71596236486d0ae18312ccded --- /dev/null +++ "b/42 \345\270\270\351\223\255\350\277\234/20230228 \350\201\224\350\241\250\344\275\234\344\270\232.md" @@ -0,0 +1,164 @@ +```mysql +CREATE TABLE student( +Sno varchar (20) NOT NULL PRIMARY KEY COMMENT'学号', +Sname varchar (20) NOT NULL COMMENT'学生姓名', +Ssex varchar (20) NOT NULL COMMENT'学生性别', +Sbirthday datetime COMMENT'学生出生年月', +Class varchar (20) COMMENT'学生所在班级' +); +INSERT INTO student VALUES ('108','曾华','男','1977-9-1','95033'), +('105','匡明','男','1975-10-2','95031'), +('107','王丽','女','1976-1-23','95033'), +('101','李军','男','1976-2-20','95033'), +('109','王芳','女','1975-2-10','95031'), +('103','陆军','男','1974-6-3','95031'); +CREATE TABLE Course( +Cno varchar (20) NOT NULL PRIMARY KEY, +Cname varchar (20) NOT NULL, +Tno varchar (20) NOT NULL +); +ALTER TABLE Course ADD FOREIGN KEY (Tno) REFERENCES Teacher(Tno); +INSERT INTO Course(Cno,Cname,Tno) VALUES('3-105', '计算机导论',' 825'), +('3-245',' 操作系统', '804'), +('6-166',' 数字电路', '856'), +('9-888',' 高等数学', '831'); +CREATE TABLE Score( +Sno varchar (20) NOT NULL, +Cno varchar (20) NOT NULL, +Degree Decimal(4,1), +FOREIGN KEY(Sno) REFERENCES student(Sno), +FOREIGN KEY(Cno) REFERENCES Course(Cno) +); +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'); +CREATE TABLE Teacher( +Tno varchar (20) NOT NULL PRIMARY KEY, +Tname varchar (20) NOT NULL, +Tsex varchar (20)NOT NULL, +Tbirthday datetime, +Prof varchar (20), +Depart varchar (20)NOT NULL +); +INSERT INTO Teacher VALUES ('804','李诚','男','1958-12-2','副教授','计算机系'), +('856','张旭','男','1969-3-12','讲师' ,'电子工程系'), +('825','王萍','女','1972-5-5', '助教' ,'计算机系'), +('831','刘冰','女','1977-8-14','助教' ,'电子工程系'); +-- 1,查询所有学生,都学了哪些课程,要显示学生信息和课程信息/ +SELECT student.*,Course.* FROM student INNER JOIN Score ON student.Sno = Score.Sno LEFT JOIN Course ON Score.Cno = Course.Cno; + +-- 2,查询没有学生的教师的所有信息 +SELECT Teacher.*,Course.* FROM Teacher left JOIN Course ON Teacher.Tno = Course.Tno LEFT JOIN Score ON Course.Cno = Score.Cno LEFT JOIN Student on Student.Sno=Score.Sno WHERE Score.Sno is null; + +-- ① 查询Score表中的最高分的学生学号和课程号 +SELECT +Sno,Cno +FROM +score +WHERE +Degree = (SELECT max(Degree) FROM score); + +-- ② 查询所有学生的Sname、Cno和Degree列。 +SELECT +Sname,Cno,Degree +FROM +student +JOIN score ON student.Sno = score.Sno + +-- ③ 查询所有学生的Sno、Cname和Degree列。 +SELECT +sno,cname,degree +FROM +score +LEFT JOIN course ON score.Cno = course.Cno; +-- ④ 查询所有学生的Sname、Cname和Degree列。 +SELECT +Sname,Cname,Degree +FROM +student +LEFT JOIN score ON student.Sno = score.Sno +LEFT JOIN course ON score.Cno = course.Cno; +-- ⑤ 查询“95033”班学生的平均分 +SELECT avg(class) 95033班平均成绩 FROM student; +-- ⑥ 查询选修“3-105”课程的成绩高于“109”号同学成绩的所有同学的记录。 +SELECT * FROM student,score WHERE Cno = '3-105' AND student.Sno = score.sno AND score.Degree > '76'; +-- ⑦ 查询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 Cno = '3-105' AND student.Sno = score.Sno AND score.Degree > '76'; +-- ⑨ 查询和学号为108的同学同年出生的所有学生的Sno、Sname和Sbirthday列。 +SELECT sno,sname,sbirthday FROM student WHERE year(sbirthday) = '1977'; +-- ⑩ 查询“张旭“教师任课的学生成绩。 +SELECT degree FROM score,teacher,course WHERE teacher.Tname = '张旭' AND course.Cno = score.Cno AND teacher.Tno = course.Tno; +-- 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 where a.Depart != teacher.Depart ); +-- 14 查询选修编号为“3-105“课程且成绩至少高于选修编号为“3-245”的同学的Cno、Sno和Degree,并按Degree从高到低次序排序。 +SELECT Cno,sno,degree FROM course LEFT JOIN score ON course.Cno = score.Cno +-- 15 查询选修编号为“3-105”且成绩高于选修编号为“3-245”课程的同学的Cno、Sno和Degree. +SELECT + Cno,score.sno,degree +FROM + student +LEFT JOIN score ON student.Sno = score.Sno +WHERE + cno = '3-105' AND + Degree > (SELECT max(Degree) FROM score WHERE cno = '3-245'); +-- 16 查询成绩比该课程平均成绩低的同学的成绩表。 +SELECT Degree +FROM score +WHERE Degree < (SELECT avg(Degree) FROM score); +-- 17 查询所有任课教师的Tname和Depart. +SELECT Tname,Depart FROM teacher WHERE tno IN(SELECT tno FROM course WHERE Cno IN(SELECT cno FROM score GROUP BY cno)); +-- 18 查询所有未讲课的教师的Tname和Depart +Select tname,depart from teacher where tno not in (select tno from course where cno in (select distinct cno from score)); +-- 19 查询“男”教师及其所上的课程。 +SELECT + Tname,Tsex,Cname + FROM + teacher + LEFT JOIN course ON teacher.tno = course.Tno + WHERE Tsex = '男'; +-- 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 = '李军'); +-- 22 查询和“李军”同性别并同班的同学Sname. +SELECT +Sname,Class +FROM +student +WHERE Ssex = (SELECT Ssex FROM student WHERE sname = '李军') AND class =(SELECT Class FROM student WHERE Sname = '李军'); +-- 23 查询所有选修“计算机导论”课程的“男”同学的成绩表。 +SELECT +Sname,Cname,Degree,Ssex +FROM +course +LEFT JOIN score ON score.Cno = course.Cno +LEFT JOIN student ON score.Sno = student.Sno +WHERE +Ssex IN (SELECT Ssex FROM student WHERE Ssex = '男') +AND +cname IN (SELECT Cname FROM course WHERE Cname = '计算机导论'); +``` + diff --git "a/42 \345\270\270\351\223\255\350\277\234/20230307 \345\255\220\346\237\245\350\257\242\344\275\234\344\270\232.md" "b/42 \345\270\270\351\223\255\350\277\234/20230307 \345\255\220\346\237\245\350\257\242\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..abf11419a08ebbf81efb5e36968ddd902b33e5da --- /dev/null +++ "b/42 \345\270\270\351\223\255\350\277\234/20230307 \345\255\220\346\237\245\350\257\242\344\275\234\344\270\232.md" @@ -0,0 +1,87 @@ +```sql +CREATE TABLE stuinfo( +stuNO VARCHAR(20), +stuName VARCHAR(20), +stuSex char(1), +stuAge VARCHAR(20), +stuAddress VARCHAR(20), +stuSeat VARCHAR(20) +); +CREATE TABLE stuExam( +examNO VARCHAR(20), +stuNO VARCHAR(20), +writtenExam VARCHAR(20), +labExam VARCHAR(20) +); +CREATE TABLE stuMarks( +examNo VARCHAR(20), +stuID VARCHAR(20), +score VARCHAR(20) +); +INSERT INTO stuinfo VALUES('s2501','张秋利','男','20','美国硅谷','1'), +('s2502','李斯文','女','18','湖北武汉','2'), +('s2503','马文才','男','18','湖南长沙','3'), +('s2504','欧阳俊雄','女','21','湖北武汉','4'), +('s2505','梅超风','男','16','湖北武汉','5'), +('s2506','陈旋风','男','19','美国硅谷','6'); +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'); +INSERT INTO stumarks VALUES('1','s2501','88'), +('2','s2501','92'), +('3','s2501','53'), +('4','s2502','60'), +('5','s2502','99'), +('6','s2503','82'); +-- 在如图的数据表上完成以下题目 +-- +-- 1.查询出年龄比班上平均年龄大的学生的信息 +SELECT * FROM stuinfo WHERE stuage > (SELECT avg(stuage) FROM stuinfo); + +-- 2.查询出每个学生的学号,姓名,性别和选修课程的最高分(stuMarks) +SELECT stuID,stuName,stuSex,max(score) FROM stuinfo a +LEFT JOIN stumarks b ON a.stuNO = b.stuID +GROUP BY stuno; +-- 3.查询出每个学生的学号,姓名,性别和考试平均分(stuExam) +SELECT b.stuno,stuname,stusex,(writtenExam+labExam) / 2 考试平均分 FROM stuinfo a RIGHT JOIN stuexam b ON a.stuNO = b.stuNO +-- 4.查询性别是男并且年龄大于等于20的学生的信息(用两种方法实现:普通查询和子查询) +SELECT * FROM stuinfo WHERE stuSex = '男' AND stuAge >= '20'; +SELECT * FROM (SELECT * FROM stuinfo WHERE stusex = '男' AND stuage >= '20') as a; +-- 5.查询出年龄比所有男生年龄都大的女生的信息 +SELECT * FROM stuinfo WHERE stusex = '女' AND stuage > (SELECT max(stuage) FROM stuinfo WHERE stusex = '男'); +-- 6.查询出所有选修课程都及格的学生的信息 (stuMarks) +SELECT * FROM stuinfo RIGHT JOIN stumarks ON stuNO = stuID WHERE stuid not IN (select stuid FROM stuinfo LEFT JOIN stumarks ON stuinfo.stuNO = stumarks.stuID WHERE score<60); +-- 7.查询出参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) +SELECT * FROM stuinfo a RIGHT JOIN stumarks c ON a.stuNO = c.stuID GROUP BY stuid; + +SELECT * FROM stuinfo WHERE stuno IN (SELECT stuno FROM stuinfo a RIGHT JOIN stumarks b ON a.stuno = b.stuid GROUP BY stuno); +-- 8.查询出没有参加考试的学生的信息(用表连接,in二种方法做)(stuMarks) +SELECT * FROM stuinfo a LEFT JOIN stumarks b ON a.stuNO = b.stuID +WHERE score is NULL; + +SELECT * FROM stuinfo WHERE stuno in(SELECT stuno FROM stuinfo LEFT JOIN stumarks ON stuinfo.stuNO = stumarks.stuID WHERE score is null); + +-- 9.将有一门成绩成绩大于90分的学生的基本信息查询出来(stuMarks) +SELECT * FROM stuinfo a RIGHT JOIN stumarks b ON a.stuNO = b.stuID WHERE score>90; + +-- 10.查询出平均成绩在80分以上的学生的基本信息(stuMarks) +SELECT * FROM stumarks WHERE score in (SELECT avg(score) FROM stumarks GROUP BY stuid); + +-- 11.查询出某同学所有考试成绩比“张秋利”同学所有分数都高的学生基本信息(stuMarks) +SELECT * FROM stuinfo a RIGHT JOIN stumarks b ON a.stuNO = b.stuID +WHERE score>(select max(score) FROM stumarks a RIGHT JOIN stuinfo b ON a.stuid = b.stuno WHERE stuname = '张秋利'); + +-- 12.查询出某同学所有考试成绩只需要比“张秋利”同学某个分数高的学生基本信息(stuMarks) +SELECT * FROM stuinfo a RIGHT JOIN stumarks b ON a.stuNO = b.stuID +WHERE score>(SELECT min(score) FROM stumarks RIGHT JOIN stuinfo ON stumarks.stuID=stuinfo.stuNO WHERE stuname = '张秋利') AND stuname != '张秋利'; + +-- 13.查询班上比所有男生年龄都要大的女生的信息 +SELECT * FROM stuinfo WHERE stusex = '女' AND stuage > (SELECT max(stuage) FROM stuinfo WHERE stusex = '男'); + +-- 14.查询出只要比某个男生年龄大的女生的信息 +SELECT * FROM stuinfo WHERE stusex = '女' AND stuage > (SELECT min(stuage) FROM stuinfo WHERE stusex = '男'); +``` + diff --git "a/42 \345\270\270\351\223\255\350\277\234/20230310 \345\244\247\344\275\234\344\270\232.md" "b/42 \345\270\270\351\223\255\350\277\234/20230310 \345\244\247\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..30f565b51bbee38c9cf9c716700827e93b825c90 --- /dev/null +++ "b/42 \345\270\270\351\223\255\350\277\234/20230310 \345\244\247\344\275\234\344\270\232.md" @@ -0,0 +1,129 @@ +```sql +create databasr xiaoshuo charset utf8; +use xiaoshuo + +CREATE TABLE author( +author_id int COMMENT '作家编号' PRIMARY KEY, +author_name varchar(20) COMMENT '作家姓名' UNIQUE KEY, +credits int COMMENT '积分', +vip_id varchar(20) COMMENT '等级编号' NOT NULL, +FOREIGN KEY (vip_id) REFERENCES vip (vip_id) +); +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'); + + +CREATE TABLE vip( +vip_id varchar(20) comment '等级编号' PRIMARY KEY, +vip_name varchar(20) COMMENT '等级名称' NOT NULL UNIQUE KEY +); +INSERT INTO vip VALUES +('vip01','青铜作家'), +('vip02','白银作家'), +('vip03','黄金作家'), +('vip04','钻石作家'); + +CREATE TABLE story( +story_id int COMMENT'作品编号' PRIMARY KEY auto_increment, +author_id int COMMENT '作家编号', +type_id varchar(20)COMMENT '类型编号', +story_name varchar(50) COMMENT '作品名称', +views_number int COMMENT '浏览量', +FOREIGN KEY (author_id) REFERENCES author(author_id), +FOREIGN KEY (type_id) REFERENCES type(type_id) +); +INSERT INTO story VALUES +(1,1002,'L03','母猪产后与护理师的二三事',6541), +(2,1005,'L04','拖拉机大战蜘蛛侠',563), +(3,1003,'L01','这只小龙虾不正经',8754), +(4,1006,'L04','一个爹爹三个娃',36354), +(5,1006,'L01','皇上滚开本宫只劫财',3674); +INSERT INTO story VALUES +(6,1005,'L05','给长城贴瓷砖的小太监',6541), +(7,1003,'L03','不科学御兽',1257), +(8,1005,'L01','镜面管理局',3216), +(9,1004,'L02','关于我成为灭魂师之后',1147), +(10,1004,'L05','公子别秀',2078); + +CREATE TABLE type( +type_id varchar(20)COMMENT '类型编号' PRIMARY KEY, +type_name varchar(20) COMMENT '类型名称' NOT NULL UNIQUE KEY +); +INSERT INTO type VALUES +('L01','玄幻'), +('L02','奇幻'), +('L03','武侠'), +('L04','仙侠'), +('L05','都市'); +-- 1. 根据前面提供的表结构和表数据,创建数据库并分别创建这张四张表;并插入相关数据。(提醒:外键 +-- 请注意建表顺序和插入数据的顺序) (30分) +-- 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 +INSERT INTO story VALUES (11,10005,'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 author_name,credits,vip_id 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 avg(credits) 平均积分,count(vip_id) 作家数量 FROM author +GROUP BY vip_id +ORDER BY avg(credits) DESC; + +-- 14. 查询小说数量大于等于2的分类编号和小说数量。(4分) +SELECT type_id,count(type_id) FROM story +GROUP BY type_id +HAVING count(type_id)>=2; + +-- 15. 查询所有小说中浏览量最少的书的作品编号、作品名称和类型编号、浏览量。(4分) +SELECT story_id,story_name,type_id,views_number FROM story WHERE views_number = (SELECT 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 author a LEFT JOIN story b ON a.author_id = b.author_id +LEFT JOIN vip ON a.vip_id = vip.vip_id +WHERE story_name IS NULL AND vip_name = '白银作家'; +-- 18. 找出写过作品浏览量大于5000的作家的所有作品中浏览量不到1000的作品信息(8分) +SELECT * FROM (SELECT * FROM story WHERE author_id IN(SELECT author_id FROM story WHERE views_number > 5000)) a WHERE views_number < 1000; +-- 19. 查询所有小说的小说编号、小说名称、浏览量、分类名称、作者姓名、作者积分、作者等级名称,结果 +-- 字段要用中文别名,并按浏览量降序排列,如果浏览量一样的,再按积分降序排列。(10分) +SELECT story_id 小说编号,story_name 小说名称,views_number 浏览量,type_id 分类名称,author_name 作者姓名,credits 作者积分,vip_name 作者等级名称 FROM story a +LEFT JOIN author b ON a.author_id = b.author_id +LEFT JOIN vip c ON b.vip_id = c.vip_id +ORDER BY views_number DESC,credits DESC; +``` + diff --git "a/42 \345\270\270\351\223\255\350\277\234/20230312 \344\275\234\344\270\2321.md" "b/42 \345\270\270\351\223\255\350\277\234/20230312 \344\275\234\344\270\2321.md" new file mode 100644 index 0000000000000000000000000000000000000000..15b128d85752129804f346b49c8c637ecdafd636 --- /dev/null +++ "b/42 \345\270\270\351\223\255\350\277\234/20230312 \344\275\234\344\270\2321.md" @@ -0,0 +1,122 @@ +```sql +CREATE TABLE a ( +stuNo VARCHAR(20), +stuName VARCHAR(20), +stuAge int, +stuAddress VARCHAR(20), +stuSeat int, +stuSex char(1) +); +INSERT INTO a 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 b( +examNo int, +stuNo VARCHAR(20), +writtenExam int, +labExam int +); +INSERT INTO b 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 a; +-- 2.查询学生信息表(stuinfo)中的姓名,年龄和地址三列的信息 +-- +SELECT stuName,stuAge,stuAddress FROM a; +-- 3.查询学生分数表(stuexam)中的学号,笔试和机试三列的信息,并为这三列取中文名字 +-- +SELECT b.stuNo 学号,writtenExam 笔试,labExam 机试 FROM a left JOIN b ON a.stuNo = b.stuNo; +-- 5.查询学生分数表(stuexam)中的学生的学号,笔试,机试以及总分这四列的信息 +-- +SELECT b.stuNo 学号, writtenExam 笔试,labExam 机试,(writtenExam+labExam) 总分 FROM a LEFT JOIN b ON a.stuNo = b.stuNo; +-- 6.查询学生信息表(stuInfo)中学生来自哪几个地方 +-- +SELECT stuAddress FROM a +GROUP BY stuAddress; +-- 7.查询学生信息表(stuInfo)中学生有哪几种年龄,并为该列取对应的中文列名 +-- +SELECT stuAge 年龄 FROM a +GROUP BY stuage; +-- 8.查询学生信息表(stuInfo)中前3行记录 +-- +SELECT * FROM a +LIMIT 0,3; +-- 9.查询学生信息表(stuInfo)中前4个学生的姓名和座位号 +-- +SELECT stuName,stuSeat FROM a +LIMIT 0,4; +-- 11.将地址是湖北武汉,年龄是20的学生的所有信息查询出来 +-- +SELECT * FROM a WHERE stuAddress = '湖北武汉' AND stuAge = 20; +-- 12.将机试成绩在60-80之间的信息查询出来,并按照机试成绩降序排列 +-- +SELECT * FROM b WHERE labExam BETWEEN 60 AND 80 +ORDER BY labExam DESC; +-- 13.查询来自湖北武汉或者湖南长沙的学生的所有信息 +-- +SELECT * FROM a WHERE stuAddress = '湖北武汉' or stuAddress = '湖南长沙'; +-- 14.查询出笔试成绩不在70-90之间的信息,并按照笔试成绩升序排列 +-- +SELECT * FROM b WHERE !(writtenExam BETWEEN 70 AND 80) +ORDER BY writtenExam desc; +-- 15.查询年龄没有写的学生所有信息 +-- +SELECT * FROM a WHERE stuAge IS null; +-- 16.查询年龄写了的学生所有信息 +-- +SELECT * FROM a WHERE stuAge IS NOT NULL; +-- 17.查询姓张的学生信息 +-- +SELECT * FROM a WHERE stuName LIKE '张%'; +-- 18.查询学生地址中有‘湖’字的信息 +-- +SELECT * FROM a WHERE stuAddress LIKE '%湖%'; +-- 19.查询姓张但名为一个字的学生信息 +-- +SELECT * FROM a WHERE stuName LIKE '张_'; +-- 20.查询姓名中第三个字为‘俊’的学生的信息,‘俊’后面有多少个字不限制 +-- +SELECT * FROM a WHERE stuName LIKE '__俊%'; +-- 21.按学生的年龄降序显示所有学生信息 +-- +SELECT * FROM a +ORDER BY stuAge DESC; +-- 22.按学生的年龄降序和座位号升序来显示所有学生的信息 +-- +SELECT * FROM a +ORDER BY +stuAge DESC,stuSeat ASC; +-- 23显示笔试第一名的学生的考试号,学号,笔试成绩和机试成绩 +-- +SELECT * FROM b WHERE writtenExam IN(SELECT max(writtenExam) FROM b); +-- 24.显示机试倒数第一名的学生的考试号,学号,笔试成绩和机试成绩 +-- +SELECT * FROM b WHERE labExam IN(SELECT min(labExam) FROM b); +-- 25.查询每个地方的学生的平均年龄 +-- +SELECT stuAddress,avg(stuAge) FROM a +GROUP BY stuAddress; +-- 26.查询男女生的分别的年龄总和 +-- +SELECT stuSex,sum(stuage) FROM a +GROUP BY stusex +HAVING sum(stuage); +-- 27.查询每个地方的男女生的平均年龄和年龄的总和 +SELECT stuAddress,stuSex,avg(stuage),sum(stuage) FROM a +GROUP BY stuAddress,stuSex; +``` + diff --git "a/42 \345\270\270\351\223\255\350\277\234/20230323 MySQL\345\244\215\344\271\240.md" "b/42 \345\270\270\351\223\255\350\277\234/20230323 MySQL\345\244\215\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..b85ed7ddc8993d8e2b6fdff34001aa01dd1b57bc --- /dev/null +++ "b/42 \345\270\270\351\223\255\350\277\234/20230323 MySQL\345\244\215\344\271\240.md" @@ -0,0 +1,303 @@ +```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 student( +id int, +name VARCHAR(10), +sex char(1), +brithday date, +score DOUBLE(5,2), +address VARCHAR(64), +tel varchar(11), +studnet INT +); + +-- 2.更改表练习 +-- -- 1.修改stu表名为student +ALTER TABLE stu RENAME 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 ikun( +id INT, +name VARCHAR(10), +age int, +sex char(1) +); +-- -- 2.插入部分数据,给id name age sex赋值 +INSERT INTO student VALUES +(1,'李连杰','男','2004-02-14',60.2,'广西','12312312312','1'), +(2,'谢霆锋','男','2004-02-14',80.2,'广西','12312312312','1'), +(3,'蔡徐坤','男','2004-02-14',98.2,'广西','12312312312','1'), +(4,'表姐','男','2004-02-14',50.2,'广西','12312312312','1'), +(5,'陈冠希','男','2004-02-14',40.2,'广西','12312312312','1'), +(6,'王嘉尔','男','2004-02-14',00.2,'广西','12312312312','1'); +-- /* +-- 1.在mysql中插入字符数据,数据使用单引号或者双引号都可以,建议使用单引号 +INSERT INTO student VALUES +(7,'李连杰','男','2004-02-14',60.2,"广西",'12312312312','1'); + +INSERT INTO student VALUES +(8,'李连杰','男','2004-02-14',60.2,'广西','12312312312','1'); +-- 2.在mysql中插入的数据是date类型,那么将数据书写在单引号或者双引号都可以 +-- */ +-- +-- -- 3.插入所有的字段,不写字段名 +-- +INSERT INTO ikun VALUES +(1,'李连杰',18,'男'); +-- -- 4.插入所有的字段,写出字段名 +-- +INSERT INTO ikun (id,name,age,sex) VALUES +(2,'表姐',18,'女'); +-- -- 5.批量插入数据 +INSERT INTO ikun VALUES +(3,'陈冠希',18,'男'), +(4,'谢霆锋',18,'男'); + +INSERT INTO ikun VALUES +(5,'陈冠希',20,'男'), +(6,'陈冠希',45,'男'), +(7,'陈冠希',78,'男'), +(8,'陈冠希',21,'男'), +(9,'陈冠希',36,'男'); +-- -- 插入数据注意 +-- -- 6.插入数据时 省略列名,那么如果不需要给列赋值那么使用null +-- +-- 4.修改数据 +-- +-- -- 1.修改数据:修改性别都变为女 +UPDATE ikun SET sex = '女'; +-- -- 2.修改数据:带条件修改id是2的学生性别变为男 +UPDATE ikun SET sex = '男' WHERE id = 2; +-- -- 3.一次修改多个列,把id为3的学生,年龄改成26岁,address改成北京 +-- +UPDATE ikun SET age = 26,sex = '男' WHERE id = 3; +-- 5.删除数据 +-- -- 1.带条件删除数据,删除id是3的记录 +-- +DELETE FROM ikun WHERE id = 3; +-- -- 2.带条件删除数据,删除id是1和2的记录 id in(1,2) : 表示id的值是1或者2 +-- +DELETE FROM ikun WHERE id = 1 OR id = 2; +-- +-- -- 3.不带条件删除 +DELETE FROM ikun; +-- -- 还可以使用:DDL +-- -- 这里的table可以省略 +-- +-- 6.查询数据 +-- +-- +-- -- 1.查询多个字段 +SELECT id,name FROM student; +-- -- * 表示所有字段 +-- +-- -- 2.写出查询每列的名称 +-- +select COLUMN_NAME from INFORMATION_SCHEMA.Columns where table_name='student'; +DESC student + +-- -- 3.查询表中name和age列,name列的别名为姓名,age列的别名为年龄 +-- -- 使用as起给字段和表起别名 +-- -- as可以省略 +-- +SELECT name 姓名,age 年龄 FROM ikun; +-- +-- -- 4.去重 +-- -- 对age去重 +SELECT DISTINCT age FROM ikun ; +-- 对age和address去重 + -- 如果多个字段一起去重,如果所有的字段值全部一样才会去重 +SELECT DISTINCT brithday,address FROM student; + + +-- 7.带条件的查询 + -- 1.查询数学成绩大于80学生 +SELECT * FROM student WHERE score >80; + -- 2.查询英语成绩小于等于80学生 +select * FROM student WHERE score <= 80; + -- 3.查询年龄等于20的学生 +SELECT * FROM ikun WHERE age = 20; + -- 4.查询年龄不等于20的学生 +SELECT * FROM ikun WHERE age != 20; + + -- 5.查询年龄大于35并且性别是男的学生 +SELECT * FROM ikun WHERE age > 35 AND sex = '男'; + -- 6.查询年龄大于35或者性别是男的学生 +SELECT * FROM ikun WHERE age > 35 OR sex = '男'; + -- 7.查询id是1 3 5的学生 +SELECT * FROM ikun WHERE id = 1 OR id = 3 OR id = 5; + + -- 8.查询id不是1 3 5的学生 +SELECT * FROM ikun WHERE !(id = 1 OR id = 3 OR id = 5); + +SELECT * FROM ikun WHERE id NOT IN(id = 1 OR id = 3 OR id = 5); + + -- not in 是in的取反,表示不在什么其中 + + -- 范围查询 + -- 9.英语成绩在75和90之间 +SELECT * FROM student WHERE score BETWEEN 75 AND 90; + + -- 模糊查询 使用like +SELECT * FROM student WHERE name LIKE '李%'; + -- 10.查询姓赵的学生 +SELECT * FROM student WHERE name LIKE '赵%'; + -- name like '赵%' 表示name的值以赵开始,后面是什么都可以 + -- %在模糊查询中表示任意个数的字符 + + + -- 11.查询包含岩 + -- name like '%岩%' 表示name的值只要含有岩即可,前后%表示匹配任意多个字符 +SELECT * FROM student WHERE name LIKE '%岩%'; + + -- 12.查询姓赵并且是三个字的学生 + -- _下划线在模糊查询中表示单个字符 +SELECT * FROM student WHERE NAME LIKE '赵__'; + + -- 排序 + -- desc表示降序 + -- 13.按照年龄降序排序 +SELECT * FROM ikun +ORDER BY age desc; + -- 14.先按照年龄降序排序,如果年龄相同在按照数学降序排序 +SELECT * FROM ikun +ORDER BY age DESC,id desc; + -- 15.先按照年龄降序排序,如果年龄相同在按照数学升序排序 +SELECT * FROM ikun +ORDER BY age DESC,id; + + -- 聚合函数 + -- 16.查询学生总数即有多少名学生 +SELECT count(*) FROM ikun; + + -- 17.查询数学成绩总分数 +SELECT sum(score) FROM student; + -- 18.查询数学成绩最高分数 +SELECT max(score) FROM student; + -- 19.统计数学和英语总和值 + -- 实现一:分别统计数学和英语的每个总成绩,然后进行相加 +CREATE TABLE score( +kemu VARCHAR(20), +score INT +); +INSERT INTO score VALUES +('数学',40), +('英语',70), +('英语',40), +('数学',80), +('数学',90), +('英语',20); +SELECT sum(score) FROM score; + -- 实现二:分别统计每个人的数学和英语成绩,然后将每个人的数学和英语成绩相加 + /* + 结果是: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 + */ + + + + -- 分组 + -- 准备数据 + 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 color,sum(price) FROM car +GROUP BY color; + -- 2.查询每种颜色车辆总价大于30车辆的颜色和总价 +SELECT color,sum(price) FROM car +GROUP BY color +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表示每页显示两条数据,对于第二个参数每个公司基本是固定的,最后一页剩下几行数据 + -- 就会显示几行数据 + + -- 第三页 + /* + 公式: 起始索引 = (当前页码-1)*每页显示的条数 + 0 1 2 + 2 2 2 + 4 3 2 + */ + +``` + diff --git "a/42 \345\270\270\351\223\255\350\277\234/MySQL\345\244\215\344\271\240.xmind" "b/42 \345\270\270\351\223\255\350\277\234/MySQL\345\244\215\344\271\240.xmind" new file mode 100644 index 0000000000000000000000000000000000000000..3727c6ccae256097bb4fc687373326011f88ffbc Binary files /dev/null and "b/42 \345\270\270\351\223\255\350\277\234/MySQL\345\244\215\344\271\240.xmind" differ