MySQL数据库基础下

  • 一、修改表——添加外键约束
  • 二、多表之间的建表原则
    • 1.建数据库原则:通常情况下,一个项目/应用建一个数据库
    • 2.多表之间的表原则:
      • (1)一对多:分类和商品 (一个分类对应多个商品)
      • (2)多对多:老师和学生、学生和课程
      • (3)一对一:公民和身份证、班级和班长
  • 三、商城案例——建表和数据准备
  • 四、使用商城表实现对商品信息的多表查询
  • 五、子查询

一、修改表——添加外键约束

mysql> select * from product;
+-----+--------------+-------+---------------------+------+
| pid | pname        | price | pdate               | cno  |
+-----+--------------+-------+---------------------+------+
|   1 | 锤子         |  2888 | 2020-08-07 13:58:51 |    1 |
|   2 | 小米11       |   998 | 2020-08-06 17:13:10 |    1 |
|   3 | 威龙辣条     |     8 | 2020-08-06 17:16:45 |    3 |
|   4 | 拖鞋         |     8 | 2020-08-06 17:17:05 |    4 |
|   5 | 毛巾         |     8 | 2020-08-06 17:17:22 |    4 |
|   6 | 老村长       |    88 | 2020-08-07 13:54:28 |    2 |
|   7 | 敬酒         |    99 | 2020-08-07 13:55:20 |    2 |
|   8 | 小熊饼干     |     4 | 2020-08-07 13:55:57 |    3 |
|   9 | 旺旺大饼     |     5 | 2020-08-07 13:56:22 |    3 |
+-----+--------------+-------+---------------------+------+
mysql> select * from category;
+-----+-----------+--------------------+
| cid | cname     | cdesc              |
+-----+-----------+--------------------+
|   1 | 酒水      | 茅台、二锅头       |
|   2 | 日用品    | 电子产品           |
|   3 | 衣服      | 外套               |
|   4 | 零食      | 辣条               |
+-----+-----------+--------------------+

1.技术分析:
多表之间的关系如何来维护?
外键约束:foreign key,给product中的这个cno添加一个外键约束

mysql> alter table product add foreign key(cno) references category(cid);
Query OK, 9 rows affected (0.06 sec)

2.从分类表中删除分类信息为5的信息。
delete from category where cid = 5;//删除失败
首先得去product表删除所有分类ID5的商品。
==删除的时候,先删除外键关联的所有数据,然后才能删除分类的数据。

主键约束:默认不能为空,唯一
a.外键都是指向另外一张表的主键
b.一张表只能有一个主键
唯一约束:列里面的内容必须唯一,不能出现重复的情况、为空
a.唯一约束不能作为其他表的外键
b.一张表可以有多个唯一约束。

二、多表之间的建表原则

1.建数据库原则:通常情况下,一个项目/应用建一个数据库

2.多表之间的表原则:

(1)一对多:分类和商品 (一个分类对应多个商品)

建表原则:在多的一方添加一个外键,指向一的一方的主键
mysql> alter table product add foreign key(cno) references category(cid);

(2)多对多:老师和学生、学生和课程

建表原则:多建一张中间表,将多对多的关系拆成一对多的关系,中间表至少要有两个外键。这两个外键分别指向原来的那张表。
案例:学生和选课
学生表:student

sid sname sex age
1 安逸 20
2 天山派盟主 21
3 神秘的天 22

课程表:course

cid cname teacher
1 Java 李老师
2 UI 徐老师
3 Android 胡老师
4 Mysql 占老师

安逸选了:Java、Mysql
神秘的天:Java 、UI 、Android
天山派盟主:Java 、UI 、Android、Mysql
中间表:(学生表(n)——>(1)中间表;课程表(n)——>(1)中间表)

sid cid
1 1
1 4
2 1
2 2
2 3

(3)一对一:公民和身份证、班级和班长

建表原则:
a.将一对一的情况,当作是一对多的情况处理,在任意一张表添加一个外键,并且这个外键要唯一,指向另外一张表。
b.直接将两张表合并成一张表。
c.将两张表的主键建立起连接,让两张表里面的之间相同。
应用案例:实际用途不是很多,通常用于拆表操作。
相亲网站:
个人信息:姓名、性别、年龄、身高、体重、兴趣爱好(年收入、特长、学历、职业、择偶要求)
拆表操作:将个人的常用信息和不常用信息存放在不同的表中,减少表的臃肿。

三、商城案例——建表和数据准备

1.所有的表:

2.建表:
(1)学生表

mysql> create table user(-> uid int primary key auto_increment,-> username varchar(31),-> password varchar(31),-> phone varchar(11)-> );

添加数据:
insert into user(null,‘安逸’,‘123’,‘17611149396’);

mysql> insert into user values(1,'anyi','123','17611149396');

(2)订单表(订单编号,总价,订单时间,地址,外键-用户的ID)

create table orders(
oid int primary key auto_increment,
sum int not null,
otime timestamp,
address varchar(100),
uno int,
foreign key(uno) references user(uid)
);
mysql> insert into orders values(1,250,null,'CSDN大学6-212',1);

(3)商品分类表:(分类id,分类名称,分类描述)

mysql> create table category(-> cid int primary key auto_increment,-> cname varchar(15),-> cdesc varchar(100)-> );

添加数据:

mysql> insert into category values(null,'手机数码','小米生产,电子产品');
mysql> insert into category values(null,'鞋靴箱包','江南皮鞋厂造');
mysql> insert into category values(null,'香烟酒水','黄鹤楼,茅台,二锅头');
mysql> insert into category values(null,'酸奶饼干','哇哈哈,蒙牛酸奶');
mysql> insert into category values(null,'馋嘴零食','瓜子花生,辣条');

(4)订单项:中间表(订单id,商品id,商品数量,订单项总价)

mysql> create table prderitem(-> ono int,-> pno int,-> foreign key(ono)references orders(oid),-> foreign key(pno)references product(pid),-> ocountn int,-> subsum double-> );

——给1号订单添加商品 200块钱的商品

mysql> insert into orderitem values(1,7,100,100);
mysql> insert into prderitem values(1,8,101,100);

——给2号订单添加商品 250块钱的商品

mysql> insert into orderitem values(2,5,1,35);
mysql> insert into prderitem values(2,3,3,99);

(5)商品表:(商品ID,商品名称,商品价格,外键cno)

mysql> create table product(-> pid int primary key auto_increment,-> pname varchar(10),-> price double,-> cno int,-> foreign key(cno) references category(cid)-> );

添加数据:

mysql> insert into product values(null,'小米11',998,1);
mysql> insert into product values(null,'锤子',2888,1);
mysql> insert into product values(null,'阿迪王',99,2);
mysql> insert into product values(null,'老村长',88,3);
mysql> insert into product values(null,'敬酒',35,3);
mysql> insert into product values(null,'小熊饼干',1,4);
mysql> insert into product values(null,'威龙辣条',1,5);
mysql> insert into product values(null,'五味花生',1,5);

四、使用商城表实现对商品信息的多表查询

1.交叉连接查询:笛卡尔积,查出来是两张表的乘积,查出来的结果没有意义。
select * from product,category;
过滤出有意义的数据
select *from product,category where cno=cid;
select *from product p,category c where p.cno=c.cid;

2.内连接查询:
隐式内连接:select *from product p,category c where p.cno=c.cid;
显示内连接:select *from product p inner join category c on p.cno=c.cid;
隐式内连接和显示内连接的区别:两者查询结果是一样的
隐式内连接:在查询出结果的基础上去做where条件过滤。
显示内连接:带着条件去查询结果,执行效率要高。

3.左外连接:会将左表中的所有数据都查询出来,如果右表中没有对应的数据,用null代替。
select * from product p left outer join category c on p.cno=c.cid;
4.右外连接:会将右表中的所有数据都查询出来,如果左表中没有对应的数据,用null代替。
select * from product p right outer join category c on p.cno=c.cid;
5.分页查询:
每页数据3
起始索引从0开始(startindex = (index-1)*3)
第一页:0 select *from product limit 0,3;
第二页:3 select *from product limit 3,3;
select *from product limit 0,5;
第一个参数是索引,第二个参数显示的是一个页面数据个数。

五、子查询

1.查询分类名为手机数码的所有商品
(1)查询分类名为手机数码的id
select cid from category where cname=‘手机数码’;
(2)得出id为1的结果
select * from product where cno = (select cid from category where cname=‘手机数码’);

mysql> select * from product where cno = (select cid from category where cname='手机数码');
+-----+--------+-------+-----+
| pid | pname  | price | cno |
+-----+--------+-------+-----+
|   1 | 小米11 |   998 |   1 |
|   2 | 锤子   |  2888 |   1 |
+-----+--------+-------+-----+

2.查询出(商品名称、商品分类名称)信息
方法一——左连接
select p.pname,c.cname from product p left outer join category c on p.cno=c.cid;

mysql> select p.pname,c.cname from product p left outer join category c on p.cno=c.cid;
+----------+----------+
| pname    | cname    |
+----------+----------+
| 小米11   | 手机数码 |
| 锤子     | 手机数码 |
| 阿迪王   | 鞋靴箱包 |
| 老村长   | 香烟酒水 |
| 敬酒     | 香烟酒水 |
| 小熊饼干 | 酸奶饼干 |
| 威龙辣条 | 馋嘴零食 |
| 五味花生 | 馋嘴零食 |
+----------+----------+

方法二——子查询:
select pname,(select cname from category c where p.cno=c.cid)as 商品名称 from product p;

mysql>  select pname,(select cname from category c where p.cno=c.cid)as 商品名称 from product p;
+----------+----------+
| pname    | 商品名称 |
+----------+----------+
| 小米11   | 手机数码 |
| 锤子     | 手机数码 |
| 阿迪王   | 鞋靴箱包 |
| 老村长   | 香烟酒水 |
| 敬酒     | 香烟酒水 |
| 小熊饼干 | 酸奶饼干 |
| 威龙辣条 | 馋嘴零食 |
| 五味花生 | 馋嘴零食 |

(19)一篇掌握MySQL数据库基础下 基本操作(外键约束、建表原则、多表查询、子查询)相关推荐

  1. copay mysql数据库_MySQL无法添加外键约束

    因此,我作为项目需求试图将外键约束添加到数据库中,并且它第一次或在两个不同的表上运行,但是在尝试添加外键约束时,我在两个表上遇到错误.我收到的错误消息是: 错误1215(HY000):无法添加外键约束 ...

  2. mysql on delete关键字_MySQL外键约束On Delete、On Update各取值的含义

    主键.外键和索引的区别? 主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键,外键可以有重复的,可以是空值 主索引(由关键字PRIMARY定义的索引),用于表 ...

  3. mysql key constraint_MySQL/InnoDB的外键约束(Foreign Key Constraint)

    MySQL/InnoDB的外键约束(Foreign Key Constraint) SQL外键约束 一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY. FOREIGN KE ...

  4. MySQL:错误代码1215 无法添加外键约束的解决思路

    环境说明: ※MySQL ver:5.7 当你需要添加外键约束的时候,却发现mysql报了个1215错误,一脸懵逼的找到这个博客,那你的问题可能就会得到解决. 解决思路 1.检查两个字段的数据类型是否 ...

  5. MySQL导入数据,存在外键约束不能导入数据的处理方式

    我们通常导入数据脚本的时候会遇到如下错误: 1451 -Cannot delete or update a parent row: a foreign key constraint fails (.. ...

  6. MySQL数据库基础(三)数据的导入导出、管理表记录、匹配条件

    数据的导入导出 搜索路径 查看搜索路径 安装时已经自动创建 命令:mysql > show variables like "secure_file_priv"; mysql& ...

  7. python设置mysql外键_python基础教程之MySQL数据库之-foreign key 外键(一

    今日重点:外键 一对多 多对多 一对一 -------------------------------------------------------------------------------- ...

  8. MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表

    阅读目录 一.引言: 二.一对多(foreign key) 三.多对多: 四.一对一: 五.修改表: 六.复制表: 摘要: 外键 一对多 外键 多对多 外键 一对一 一.引言: 我们在同一数据库创建的 ...

  9. mysql on update on delete_MySQL外键约束On Update和On Delete的使用说明

    On Update和On Delete是SQL语言的一个标准,用于数据库外键定义,设置当主键表中的被参考列的数据发生变化时,外键表中响应字段的变换规则. On Update表示主键表中被参考字段的值被 ...

最新文章

  1. 5G+AI,中国版无人驾驶可以有多猛?
  2. android eclipse 导入idea项目
  3. js判断对象数组中是否存在某个对象
  4. Java跳转语句break与continue
  5. java 多线程共享变量两类问题_Java并发基础09. 多个线程间共享数据问题
  6. python引入模块教程_python进阶教程之模块(module)介绍
  7. tcpdump: no suitable device found
  8. 你怎么可以不了解 AST 呢?
  9. Bailian4128 单词序列【BFS】
  10. VS2017和VS2019(社区版)离线激活方式
  11. matlab遗传算法求解车辆路径问题(一)
  12. 5G系统——5G QoS
  13. QT5.14.2使用webkit引擎完成网页浏览
  14. win7 linux 虚拟机共享文件夹,Win7主机和虚拟机Linux Virtualbox共享文件夹设置教程...
  15. Transcend带来4TB/8TB私人云储存解决方案Storejet
  16. 洛谷P3373 【模板】线段树 2
  17. 硕士研究生毕业计算机水平,计算机硕士毕业论文答辩自述
  18. 行测资料分析之三角形权重图
  19. MiL 和 SiL简单介绍
  20. 如何在mac上播放iphone音频

热门文章

  1. 检测你的黑苹果系统主板是否支持原生NVRAM
  2. 中英文名片拼写法对照
  3. shell脚本:删除文本中的字母、找单词、筛选,匹配,删除,替换
  4. Pytest03:pytest对测试函数常见处理方法
  5. J-link无法下载固件问题
  6. GitLab 邮件发送不成功原因
  7. R语言学习笔记-RStudio基础操作
  8. 学服装设计计算机证有用吗,服装设计怎么考证_服装设计有什么证书
  9. matlab调和级数求和,科学网—疯狂的绝技------级数加速收敛的艺术 - 张江敏的博文...
  10. 虚拟服务器能插usb口吗,在VMware虚拟机中使用主机USB接口、虚拟机共享USB接口、设置虚拟机USB接口的方法...