学校MySQL课程代码

学校MySQL课程代码

源文件:点击下载

数据库备份:点击下载

shop.sql

/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 80028
 Source Host           : localhost:3306
 Source Schema         : shop

 Target Server Type    : MySQL
 Target Server Version : 80028
 File Encoding         : 65001

 Date: 18/04/2024 15:40:47
*/
CREATE DATABASE shop;
use shop;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for category
-- ----------------------------
DROP TABLE IF EXISTS `category`;
CREATE TABLE `category`  (
  `id` int NOT NULL,
  `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `p_id` int NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of category
-- ----------------------------

-- ----------------------------
-- Table structure for comment
-- ----------------------------
DROP TABLE IF EXISTS `comment`;
CREATE TABLE `comment`  (
  `id` int NOT NULL,
  `reply_id` int NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `reply_comm`(`reply_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of comment
-- ----------------------------

-- ----------------------------
-- Table structure for goods
-- ----------------------------
DROP TABLE IF EXISTS `goods`;
CREATE TABLE `goods`  (
  `state` tinyint NULL DEFAULT NULL,
  `id` int NOT NULL AUTO_INCREMENT,
  `type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `price` decimal(7, 2) UNSIGNED NULL DEFAULT NULL,
  `num` int NULL DEFAULT 0,
  `info` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `add_time` datetime NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `name`(`name` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of goods
-- ----------------------------
INSERT INTO `goods` VALUES (0, 1, '书籍', '《红楼梦》', 38.00, 5, '四大名著', '2024-03-27 16:50:00');
INSERT INTO `goods` VALUES (0, 2, '书籍', '《三国演义》', 40.00, 1, '四大名著', '2024-03-27 16:50:00');
INSERT INTO `goods` VALUES (0, 3, '书籍', '《西游记》', 38.00, 10, '四大名著', '2024-03-27 16:50:00');
INSERT INTO `goods` VALUES (0, 4, '饮料', '可口可乐', 3.00, 12, '饮品', '2024-03-27 16:50:00');
INSERT INTO `goods` VALUES (0, 5, '饮料', '雪碧', 3.00, 10, '饮品', '2024-03-27 16:50:00');
INSERT INTO `goods` VALUES (NULL, 6, '零食', '薯片', 38.00, 7, '膨胀食品', NULL);
INSERT INTO `goods` VALUES (NULL, 14, '饮料', '百事可乐', 4.00, 5, '饮料', NULL);
INSERT INTO `goods` VALUES (NULL, 15, '办公用品', '黑水性笔', 2.00, 0, NULL, NULL);
INSERT INTO `goods` VALUES (NULL, 16, '零食', '水果糖', 5.00, 100, NULL, NULL);
INSERT INTO `goods` VALUES (NULL, 17, '零食', '牛奶糖', 20.00, 8, NULL, NULL);
INSERT INTO `goods` VALUES (NULL, 18, '办公用品', '红水性笔', 3.00, 9, NULL, NULL);
INSERT INTO `goods` VALUES (NULL, 19, '办公用品', '蓝水性笔', 3.00, 13, NULL, NULL);
INSERT INTO `goods` VALUES (NULL, 20, '办公用品', '水性笔', 2.00, 21, NULL, NULL);
INSERT INTO `goods` VALUES (NULL, 21, '办公用品', 'hellokitty水性笔', 100.00, 3, NULL, NULL);
INSERT INTO `goods` VALUES (NULL, 22, '办公用品', '黑色水性笔真好用', 0.00, 15, NULL, NULL);

-- ----------------------------
-- Table structure for orders
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders`  (
  `id` int NOT NULL,
  `add_time` datetime NULL DEFAULT NULL,
  `goods_id` int NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `goods_order`(`goods_id` ASC) USING BTREE,
  CONSTRAINT `goods_order` FOREIGN KEY (`goods_id`) REFERENCES `tb_goods` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of orders
-- ----------------------------

-- ----------------------------
-- Table structure for tb_goods
-- ----------------------------
DROP TABLE IF EXISTS `tb_goods`;
CREATE TABLE `tb_goods`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `type` char(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `g_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `info` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `price` decimal(7, 2) UNSIGNED NULL DEFAULT NULL,
  `num` int NULL DEFAULT 0,
  `state` tinyint NULL DEFAULT NULL,
  `add_time` datetime NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `name`(`g_name` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = DYNAMIC;

-- ----------------------------
-- Records of tb_goods
-- ----------------------------

SET FOREIGN_KEY_CHECKS = 1;

增删改查

-- 数据插入的SQL语句

-- insert into 表名称(表的字段) values(需要插入的数据,数据中如有字符和日期类型数据,需要用英文单引号括起来);

-- 向数据表添加一条记录的方法:
-- 向全部字段添加数据的方法:
-- 第一种插入的方法,完全插入(根据表格的所有字段一一对应数据完成插入操作) 推荐使用
-- 把字段完全写出 不一定按照数据表中定义的字段,可自定义字段,但数据与字段基本数据类型一定要对应
insert into goods(id,type,name,price,num,info,add_time,state)
values(1,'书籍','《红楼梦》',38.0,1,'四大名著','2024-03-27 16:50:00',0);


-- 完全插入的第二种方法  不推荐使用
-- 默认按照表格的字段顺序 添加数据
insert into goods values(0,2,'书籍','《三国演义》',40.0,1,'四大名著','2024-03-27 16:50:00');

-- 同时添加多条记录:
-- 1.多个记录之间使用英文逗号分隔; 2.insert into values这三个关键字只需要写一次
insert into goods(id,type,name,price,num,info,add_time,state)
values(3,'书籍','《西游记》',38.0,1,'四大名著','2024-03-27 16:50:00',0),
(4,'饮料','可口可乐',3.0,1,'饮品','2024-03-27 16:50:00',0),
(5,'饮料','雪碧',3.0,1,'饮品','2024-03-27 16:50:00',0);

-- 向部分字段添加数据
insert into goods(id,type,name,price,num,info)
values(6,'零食','薯片',38.0,1,'膨胀食品');

-- 设置为自动递增的字段可以不写数据 mysql会自动递增
insert into goods(type,name,price,num,info)
values('饮料','百事可乐',4.0,1,'饮料')

-- 如果字段设置了默认值,添加数据时,不写数据系统会自动填写默认值
-- 如果字段没有设置默认值,添加数据时,不写数据则自动为null
insert into goods(type,name,price)
values('办公用品','水性笔',2.0)

SELECT * from goods;


删除数据的sql语句
delete from 表名称

delete 和 update 的核心用法是一致的,需要谨慎使用。
要和where进行条件判断,否则会对整个表的数据产生影响。
如果没有where条件判断尽量不要执行delete和update语句,除非有特殊需求。

删除tb_goods的数据:
delete from tb_goods;

delete from goods;

select * from goods;

1.删除goods表商品名称为‘水性笔’的数据
delete from goods where name = '水性笔';

逻辑判断符号的使用(update/delete/select)
2.使用逻辑判断符号完成条件判断 ><(>= <=一般用于数字的比较)
= !=(=和!= 可以使用于数字的比较,也可以使用于字符的比较)  
delete from goods where id >= 5;

3.把goods表商品类别不是书籍的数据全部删除
delete from goods where type != '书籍';
执行顺序:
1.查询
2.判断
3.删除

-- 删除数据库和数据表用的关键字:
-- drop

-- 修改数据 SQL语句
-- update 表名称 set 字段名称 = 修改的值

-- 慎重使用update,如果要修改,建议与where一起使用
-- where是一个条件判断的关键字
-- 也就是满足where才会去修改 精确(精准)修改

-- 首先先找到商品名称为《红楼梦》的数据,然后再把num值修改为5
update goods set num = 5 where name = '《红楼梦》';

update goods set num = 10 where name = '《三国演义》';

update goods set price = 4.0 where name = '薯片';

update goods set info = '红色水性笔' where name = '水性笔';
执行顺序:
1.先执行select * from goods查出所有数据
2.根据where进行判断,剔除掉不符合的数据,只保留符合条件的数据
3.执行update

1.将《三国演义》的num值修改为10
2.将薯片的价格price修改为4.0
3.将水性笔的备注info修改为红色水性笔

SELECT * from goods;

查询的SQL语句:
select (字段名称) from 表名称

where条件判断与update delete 的用法一致
查询结果只会给出select后跟的字段的数据,其它数据不会显示出来
如果需要查询全部字段的数据,则需要使用通配符*  *代表所有数据
1.查询goods表中type和name字段的数据
select type,name from goods;

2.查询goods表中的所有数据
select * from goods;

3.查询商品名称为西游记的数据
select * from goods where name = '《西游记》';
执行顺序:
1.先执行select * from goods查出所有数据
2.根据where进行判断,剔除掉不符合的数据,只保留符合条件的数据

4.查询商品名称为西游记的商品类型和价格
select type,price from goods where name = '《西游记》';

查询需要注意地方:
1.需要根据实际情况,查询全部数据或者指定字段的数据。
2.结合where使用与update、DELETE用法一致
3.了解select update delete的执行顺序

select多条件查询

select * from goods;

需要查找价格2-4的商品
and可以用英文符号&&代替
select * from goods where price >= 2 and price <= 4;
select * from goods where price >= 2 && price <= 4;

OR可以用英文符号||代替
select * from goods where id >= 5 or price <= 4;
select * from goods where id >= 5 || price <= 4;

between 2 and 4 = [2,4]
between and 代表的是一个范围从and的左边到and的右边,并且包含左右两边的数字
用法:
1.where之后先写出需要判断的字段名称
2.再写出取值范围
select * from goods where price between 2 and 4;

select多条件查询2

> >= < <= 用于数字的比较的应用场景会多一些,用在字符的比较会少一些
= != 数字和字符应用的场景都比较多

select * from goods;

1.查找goods表里name不是《红楼梦》的数据
select * from goods where name != '《红楼梦》';

2.查找goods表中id>5的数据
select * from goods where id > 5;

3.查找goods表中id>5并且price>30的数据
select * from goods where id > 5 and price > 30;
and并且 
如果查询语句中使用and关键字,查询同时满足and左右两边的条件
and关键字可以用英文符号&&代替
select * from goods where id > 5 && price > 30;

4.查找goods表中id>5或者price>30的数据
select * from goods where id > 5 or price > 30;
如果查询语句中使用or关键字,则只需要满足or关键字左右两边的任意一个条件
or关键字可以使用英文符号||代替,还可以用in代替 重要的是:in的查询速度比or要快
select * from goods where id > 5 || price > 30;

5.查找goods表中价格2-4的商品
select * from goods where price >= 2 and price <= 4;

between and 代表范围值 从and的左边到右边并且包含左右两边的数值
between 2 and 4 = [2,4]
select * from goods where price between 2 and 4;

6.查找goods表中商品名称为'《西游记》'和可口可乐的数据
select * from goods where name = '《西游记》' or name = '可口可乐';

in 包含括号的数据,其它的不要
id in(1,3) 只要id 1和3的数据
select * from goods where name in('《西游记》','可口可乐');

7.查找goods表中商品名称除了'《西游记》'和可口可乐的数据
select * from goods where name != '《西游记》' and name != '可口可乐';

not in 不在in的范围里的数据
select * from goods where name not in ('《西游记》','可口可乐');


sql语句的执行顺序

select type,name from goods;

select * from goods;
先做查找,除了添加以外,查找操作贯穿始终,查找、修改、删除都会先做查找操作
select * from goods where name = '《红楼梦》';
1.select * from goods
2.where name = '《红楼梦》'

update goods set id = 1 where name = '《红楼梦》';
1.select * from goods
2.where name = '《红楼梦》'
3.set id = 1

delete goods where name = '《红楼梦》';
1.select * from goods
2.where name = '《红楼梦》'
3.删除

第8周

select * from goods;

查找goods表中商品名称为《三国演义》的数据 使用精确匹配

1.查找goods表中所有水性笔的数据 
select * from goods where name = '%水性笔';
* 是代表所有字段 不适用进行数据匹配

使用通配符 
% 用于进行数据匹配 可以代表0-无穷多个字符

= 是精确匹配 每个字符都要是相同
模糊匹配 只能用关键字like

2.查找goods表中所有带颜色的水性笔的数据
_ 仅代表1个字符 __代表两个字符
select * from goods where name like '_水性笔';

3.从goods表中查找出所有带有'水性笔'这三个字的数据
select * from goods where name like '%水性笔%';

结论:
1.% _这两个通配符是用于模糊查询,模糊查询是只不明确所查字符的个数
2.如果明确指出有具体字符个数可根据实际情况选择需要的通配符 
例子:查找goods表中所有的水性笔的数据,其中只需要保留左边1个字符 _
3.如果不明确指出具体的字符个数,则一般使用%
4.模糊匹配的关键字是like 一般模糊匹配会结合通配符使用

问题:
1.查找goods表中所有的数据,并将价格从小到大排序。 
从小到大排序 升序
order by 用于数据查找中,将数据排序。
select * from goods order by price;

2.查找goods表中所有的数据,并将价格从大到小排序。
从大到小排序 降序 写完排序的SQL语句后 + desc
select * from goods order by price desc;

order by 知识的结论:
1. desc代表降序,asc代表升序
2. 如果不写升序和降序的关键字,则order by 默认升序
3. 升序和降序的关键字必须写在字段的后面
4. order by 可以用于字符排序
5. 如果对2个或者2个字段以上进行排序,则第1个字段有排序的优先级,
如果第1个字段存在相等的数据,则会对第2个字段进行排序,以此类推
order by price (desc/asc)

思考:
1. order by能否用于字符排序?
查找goods所有的数据,并且将商品名称进行升序排序
select * from goods order by name;

2. order by能否用于2或者2个以上的字段排序?
查找goods所有的数据,并且将价格(price)和库存(num)进行降序排序
select * from goods order by price,num desc; price升序 num降序

select * from goods order by price desc,num desc;price和num同时都进行降序排序

第9周-1


select * from goods;
1.查找goods表中前5行数据 limit 限制
select * from goods limit 5;

2.从goods中第3行开始查找5条记录
select * from goods limit 2,5;

结论:
1. 如果有从第n行记录开始查找的问题,因为表中的数据是从0开始的。
所以,在写sql语句的时候,需要n-1
从goods中第3行开始查找5条记录
select * from goods limit (3-1),5;(3-1)是为了让同学们更好理解从0开始的思路
一般情况下 sql不写过程只写结果
select * from goods limit 2,5;

2. select 后面可以是字段也可以是函数
3. count(*)查询全部字段的记录包括null值在内,count(info)查询指定字段的记录不包含null值
4. sum()/max()/min()只会对指定的字段列进行求和或者查询最大/最小值

数组? 数组下标从0开始 

as 给查询的字段或者函数起别名

3. 计算goods表中所有的记录总数
select count(*) as 'goods表中的记录总数' from goods;

4. 查询goods表中info字段的记录数
select count(info) as 'info的记录总数' from  goods;

5. 查询goods表中价格(price)的总和
select sum(price) as '价格总和' from goods;

6. 查询goods表中价格(price)最高的数据
select max(price) as '价格最大值' from goods;

7. 查询goods表中价格(price)最低的数据
select min(price) as '价格最小值' from goods;

2312

1.查找goods表中2<id<5的数据
select * from goods where id >= 2 and id <= 5;

select * from goods where id >= 2 && id <= 5;
&&在任何情况下都可以替换and关键字

between and 只有在条件为取值范围时,并且包含and左右两边的数值才可以替换and
例如 2<id<5不可以用between and代替and,因为2<id<5不包含2和5
id [2,5]

between and 从and左边开始取值到and的右边 between 2 and 5

select * from goods where id between 2 and 5;

2.查找goods表中价格2-4的商品
在此问题当中,以下3条sql语句为等价关系
(1)select * from goods where price >= 2 and price <= 4;
(2)select * from goods where price >= 2 && price <= 4;
(3)select * from goods where price between 2 and 4;

3.查找goods表中商品名称为《西游记》和可口可乐的数据
select * from goods where name = '《西游记》' or name = '可口可乐';
select * from goods where name = '《西游记》' || name = '可口可乐';

IN 包含 查找in括号里包含的数据
in 可以替代or
select * from goods where name in('《西游记》' ,'可口可乐');

select * from goods;

4.查找goods表中商品名称除了《西游记》和可口可乐的数据
select * from goods where name != '《西游记》' and  name != '可口可乐';

只要满足不包含in括号中数据的情况下 not in 可以替换and
select * from goods where name not in('《西游记》' ,'可口可乐');

5.查找goods表中商品价格<2或者>4的数据
select * from goods where price < 2 or price > 4;

between and 包含and左边到and右边的数值
between 2 and 4 = [2,4] 
not between 2 and 4 = <2 >4
select * from goods where price not between 2 and 4;

6.查找goods表中添加时间为空值(null)的数据 要用is去判断不用使用=
select * from goods where add_time is null;
null 不是一个具体的数据 不能使用 = 进行比较

7.查找goods表中添加时间不为空值(null)的数据 not是加在is后面
select * from goods where add_time  is not null;

8.查找goods表type的数据并且不能保留重复数据 distinct
select distinct type from goods;

重复数据 = 冗余数据
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容