mysql2--SELECT--多表联查

我是在大二的时候学的数据库,没有专心听过。最近辞职了,想捡起来。
前段时间去一个面试,问到我多表联查相关的,我发现自己进度不行了,最基础的都不会~弱爆了
今天总结多表联查!!!耶耶耶
排版希望后期整理


【重点】:找准表与表之间的联系
【方法】
笛卡尔积:

内连接:    查询两个表中符合连接条件的记录。内用得多!!!
        语法:SELECT 字段名称,...FROM tbl_name1
             INNER JOIN tbl_name2
             ON 连接条件

        【例子】
            SELECT e.id,e.username,e.age,d.depname
            FROM emp AS emp
            INNER JOIN dep AS d
            ON e.depid=d.id;

外连接:    左外连接/右连接(左连接:左边为主,右边为从)
        (左连接)先显示左表的全部记录,再去右表查询符合条件的记录,不符合的以null代替
        语法:SELECT 字段名称,...FROM tbl_name1
             RIGHT/LEFT  OUTER JOIN tbl_name2
             ON 连接条件

        【例子】
            SELECT e.id,e.username,e.age,d.depname
            FROM emp AS e
            RIGHT OUTER  JOIN dep AS d
            ON e.depid=d.id;

【建表】省份表,管理员表,商品分类表,商品表
省份表,管理员表,关系是管理员的地域和省份的id有关系
商品分类表,商品表,商品分类的id在商品表中的分类id有联系
管理员表,商品表,管理员id和商品中的adminid有联系

–省份表
CREATE TABLE shengfen(
id TINYINT UNSIGNED AUTO_INCREMENT KEY ,
proname VARCHAR(20) NOT NULL UNIQUE
);
INSERT shengfen(proname) VALUES(‘北京’),(‘武汉’),(‘成都’),(‘深圳’),(‘重庆’);

–管理员表(id,名字,邮箱,地区,)
CREATE TABLE admin(
id TINYINT UNSIGNED AUTO_INCREMENT KEY ,
name VARCHAR(10) NOT NULL,
email VARCHAR(20) NOT NULL DEFAULT’575656786qq.com’,
proid TINYINT UNSIGNED NOT NULL
);
INSERT admin(name,proid)
VALUES(‘张三’,2),(‘李四’,5),(‘王二’,3),(‘麻子’,1),(‘隔壁老王’,5),(‘滚蛋’,4),(‘小芳’,2);

–商品分类(id,分类名称,分类描述)
CREATE TABLE cate(
id TINYINT UNSIGNED AUTO_INCREMENT KEY ,
catename VARCHAR(10) NOT NULL,
catedesc VARCHAR(50) NOT NULL DEFAULT ”
);
INSERT cate(catename) VALUES(‘母婴’);
INSERT cate(catename) VALUES(‘电器’);
INSERT cate(catename) VALUES(‘食品’);
INSERT cate(catename) VALUES(‘男装’);
INSERT cate(catename) VALUES(‘女装’);
INSERT cate(catename) VALUES(‘药品’);

–商品表(id,价格,名字,cateid、)
CREATE TABLE products(
id TINYINT UNSIGNED AUTO_INCREMENT KEY ,
name VARCHAR(10) NOT NULL,
price FLOAT(8,2) NOT NULL ,
cateid TINYINT UNSIGNED NOT NULL,
adminid TINYINT UNSIGNED NOT NULL
);
INSERT products(name,price,cateid) VALUES(‘感康’,15,6),(‘尿不湿’,88,1),
(‘巧克力’,20,3),(‘牛仔裤’,255,4),(‘超短裙’,600,5),(‘电视机’,5001,2);


【实例】
–修改省份的名字
mysql> UPDATE shengfen SET proname=’帝都’ WHERE id =1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
回显
mysql> SELECT * FROM shengfen;
+—-+———+
| id | proname |
+—-+———+
| 1 | 帝都 |
| 2 | 武汉 |
| 3 | 成都 |
| 4 | 深圳 |
| 5 | 重庆 |
+—-+———+
5 rows in set (0.00 sec)

–查询省份表中管理员的信息
mysql> SELECT s.id,s.proname,a.name,a.email,a.proid
-> FROM shengfen AS s
-> JOIN admin AS a
-> ON s.id=a.proid;
回显
+—-+———+————–+—————–+——-+
| id | proname | name | email | proid |
+—-+———+————–+—————–+——-+
| 2 | 武汉 | 张三 | 575656786qq.com | 2 |
| 5 | 重庆 | 李四 | 575656786qq.com | 5 |
| 3 | 成都 | 王二 | 575656786qq.com | 3 |
| 1 | 帝都 | 麻子 | 575656786qq.com | 1 |
| 5 | 重庆 | 隔壁老王 | 575656786qq.com | 5 |
| 4 | 深圳 | 滚蛋 | 575656786qq.com | 4 |
| 2 | 武汉 | 小芳 | 575656786qq.com | 2 |
+—-+———+————–+—————–+——-+

–查询管理员中a.username,a.email;商品p.id,p.name,p.price;
商品分类c.catename,并且按照商品价格降序排列
SELECT a.name,a.email,p.id,p.name,p.price,c.catename
FROM admin AS a
JOIN products AS p
ON a.id=p.adminid
JOIN cate AS c
ON p.cateid =c.id
ORDER BY p.price DESC;

+————–+—————–+—-+———-+———+———-+
| name | email | id | name | price | catename |
+————–+—————–+—-+———-+———+———-+
| 张三 | 575656786qq.com | 6 | 电视æœ | 5001.00 | 电器 |
| 李四 | 575656786qq.com | 5 | 超短è£ | 600.00 | 女装 |
| 滚蛋 | 575656786qq.com | 4 | 牛仔è£ | 255.00 | 男装 |
| 隔壁老王 | 575656786qq.com | 2 | 尿不æ¹ | 88.00 | 母婴 |
| 麻子 | 575656786qq.com | 3 | 巧克åŠ | 20.00 | 食品 |
| 小芳 | 575656786qq.com | 1 | 感康 | 15.00 | 药品 |
+————–+—————–+—-+———-+———+———-+
只显示(2,3)
SELECT a.name,a.email,p.id,p.name,p.price,c.catename
FROM admin AS a
JOIN products AS p
ON a.id=p.adminid
JOIN cate AS c
ON p.cateid =c.id
ORDER BY p.price DESC
LIMIT 2,3;

+————–+—————–+—-+———-+——–+———-+
| name | email | id | name | price | catename |
+————–+—————–+—-+———-+——–+———-+
| 滚蛋 | 575656786qq.com | 4 | 牛仔è£ | 255.00 | 男装 |
| 隔壁老王 | 575656786qq.com | 2 | 尿不æ¹ | 88.00 | 母婴 |
| 麻子 | 575656786qq.com | 3 | 巧克åŠ | 20.00 | 食品 |
+————–+—————–+—-+———-+——–+———-+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中进行多表联查,可以使用JOIN关键字来实现。在关系型数据库中,之间可以通过物理外键进行关联。多查询是指同时查询两个或两个以上的。 一个常见的多表联查的示例语句如下: SELECT * FROM 1 JOIN 2 ON 1.字段 = 2.字段 JOIN 3 ON 1.字段 = 3.字段 ... 这里,1、2、3代需要联查的,字段代需要联查的字段。 如果想要去除笛卡尔积的情况,可以通过添加连接条件来实现。比如,查询学生中成绩大于90分的学生和对应班级信息的示例语句如下: SELECT * FROM student INNER JOIN class ON student.score > 90 AND student.cid = class.id 这里,student和class分别是学生和班级名,score和cid分别是学生和班级中的字段名。 此外,还可以使用等值连接来进行多表联查。等值连接是通过等号(=)操作符来实现的。比如,查询班级ID为1的学生和对应班级信息的示例语句如下: SELECT * FROM student INNER JOIN class ON student.cid = class.id WHERE class.id = 1 这里,student和class分别是学生和班级名,cid和id分别是学生和班级中的字段名。 通过以上方法,可以在MySQL中进行多表联查的SQL操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [MYSQL的sql笔记之多表联查](https://blog.csdn.net/weixin_56227932/article/details/123616968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值