学校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;
重复数据 = 冗余数据
© 版权声明
- 本站永久网址:https://blog.ksmlc.cn/
- 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责
- 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新
- 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长QQ:2760460838进行删除处理
THE END
暂无评论内容