MYSQL 多表操作<六>

1)承接上一节内容
mysql> show tables;
+------------------------+
| Tables_in_shoppingmall |
+------------------------+
| category               |
| orderItem              |
| orders                 |
| product                |
| user                   |
+------------------------+
5 rows in set (0.01 sec)
2)多表查询内连接

 -- 笛卡尔积: 查出来的是两张表的乘积,查出来没有实际意义
 select * from product,category;

 -- 过滤出有意义的数据
 select * from product,category where cno = cid;

 select * from product as p,category as c where p.cno = c.cid;
 select * from product  p,category c where p.cno = c.cid;

-- 内连接
  隐式内连接
  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 条件过滤
  显式内连接:带着条件去查询结果,只需的效率更高

  • 数据如下
mysql> select * from product as p,category as c where p.cno = c.cid;
+-----+--------------+-------+------+-----+--------------+-----------------+
| pid | pname        | price | cno  | cid | cname        | cdesc           |
+-----+--------------+-------+------+-----+--------------+-----------------+
|   1 | iphone       |  5300 |    1 |   1 | 电器         | 电器类商品      |
|   3 | 茅台         |  1800 |    2 |   2 | 副食品       | 烟酒类          |
|   9 | 五粮液       |   800 |    2 |   2 | 副食品       | 烟酒类          |
|   4 | 卫生纸       |     5 |    3 |   3 | 生活用品     | 用于生活        |
|   5 | 香蕉         |    10 |    4 |   4 | 水果         | 吃吃更健康      |
|   8 | 葡萄         |    15 |    4 |   4 | 水果         | 吃吃更健康      |
|   6 | 大白菜       |    30 |    5 |   5 | 蔬菜         | 绿色食品        |
|   7 | 三只松鼠     |   100 |    6 |   6 | 干果         | 好吃的零食      |
+-----+--------------+-------+------+-----+--------------+-----------------+
8 rows in set (0.00 sec)
3)左外、右外连接查询
--  左外连接
     左外连接,会将左表中的所有数据都查询出来,如果右表中没有对应的数据,则用null代替

准备工作:插入数据(cno = null)
insert into `product` values(null,'水杯',25,null);

select * from product p left outer join category c on p.cno = c.cid;

--  右外连接
      右外连接,会将右表中的所有数据查询出来,如果左表没有对应数据,则用null代替
准备工作:插入数据
insert into `category` values(100,'肉类','补充蛋白质');

select * from product p right outer join category c on p.cno = c.cid;

  • 如下图
lianjie.png
  • 左外连接数据如下
mysql> insert into `product` values(null,'水杯',25,null);
Query OK, 1 row affected (0.08 sec)

mysql> select * from product;
+-----+--------------+-------+------+
| pid | pname        | price | cno  |
+-----+--------------+-------+------+
|   1 | iphone       |  5300 |    1 |
|   3 | 茅台         |  1800 |    2 |
|   4 | 卫生纸       |     5 |    3 |
|   5 | 香蕉         |    10 |    4 |
|   6 | 大白菜       |    30 |    5 |
|   7 | 三只松鼠     |   100 |    6 |
|   8 | 葡萄         |    15 |    4 |
|   9 | 五粮液       |   800 |    2 |
|  10 | 水杯         |    25 | NULL |
+-----+--------------+-------+------+
9 rows in set (0.00 sec)

mysql> select * from product p left outer join category c on p.cno = c.cid;
+-----+--------------+-------+------+------+--------------+-----------------+
| pid | pname        | price | cno  | cid  | cname        | cdesc           |
+-----+--------------+-------+------+------+--------------+-----------------+
|   1 | iphone       |  5300 |    1 |    1 | 电器         | 电器类商品      |
|   3 | 茅台         |  1800 |    2 |    2 | 副食品       | 烟酒类          |
|   4 | 卫生纸       |     5 |    3 |    3 | 生活用品     | 用于生活        |
|   5 | 香蕉         |    10 |    4 |    4 | 水果         | 吃吃更健康      |
|   6 | 大白菜       |    30 |    5 |    5 | 蔬菜         | 绿色食品        |
|   7 | 三只松鼠     |   100 |    6 |    6 | 干果         | 好吃的零食      |
|   8 | 葡萄         |    15 |    4 |    4 | 水果         | 吃吃更健康      |
|   9 | 五粮液       |   800 |    2 |    2 | 副食品       | 烟酒类          |
|  10 | 水杯         |    25 | NULL | NULL | NULL         | NULL            |
+-----+--------------+-------+------+------+--------------+-----------------+
9 rows in set (0.00 sec)
  • 右外连接数据如下
mysql> select * from category;
+-----+--------------+-----------------+
| cid | cname        | cdesc           |
+-----+--------------+-----------------+
|   1 | 电器         | 电器类商品      |
|   2 | 副食品       | 烟酒类          |
|   3 | 生活用品     | 用于生活        |
|   4 | 水果         | 吃吃更健康      |
|   5 | 蔬菜         | 绿色食品        |
|   6 | 干果         | 好吃的零食      |
| 100 | 肉类         | 补充蛋白质      |
+-----+--------------+-----------------+
7 rows in set (0.00 sec)

mysql> select * from product p right outer join category c on p.cno = c.cid;
+------+--------------+-------+------+-----+--------------+-----------------+
| pid  | pname        | price | cno  | cid | cname        | cdesc           |
+------+--------------+-------+------+-----+--------------+-----------------+
|    1 | iphone       |  5300 |    1 |   1 | 电器         | 电器类商品      |
|    3 | 茅台         |  1800 |    2 |   2 | 副食品       | 烟酒类          |
|    9 | 五粮液       |   800 |    2 |   2 | 副食品       | 烟酒类          |
|    4 | 卫生纸       |     5 |    3 |   3 | 生活用品     | 用于生活        |
|    5 | 香蕉         |    10 |    4 |   4 | 水果         | 吃吃更健康      |
|    8 | 葡萄         |    15 |    4 |   4 | 水果         | 吃吃更健康      |
|    6 | 大白菜       |    30 |    5 |   5 | 蔬菜         | 绿色食品        |
|    7 | 三只松鼠     |   100 |    6 |   6 | 干果         | 好吃的零食      |
| NULL | NULL         |  NULL | NULL | 100 | 肉类         | 补充蛋白质      |
+------+--------------+-------+------+-----+--------------+-----------------+
9 rows in set (0.00 sec)

3)分页查询

分页查询 用到关键字 limit,第一个参数是索引,第二个参数是个数


select * from product limit 0,3;

select * from product limit 3,3;

  • 分页查询数据如下
mysql> select * from product limit 0,3;
+-----+-----------+-------+------+
| pid | pname     | price | cno  |
+-----+-----------+-------+------+
|   1 | iphone    |  5300 |    1 |
|   3 | 茅台      |  1800 |    2 |
|   4 | 卫生纸    |     5 |    3 |
+-----+-----------+-------+------+
3 rows in set (0.00 sec)

mysql> select * from product limit 3,3;
+-----+--------------+-------+------+
| pid | pname        | price | cno  |
+-----+--------------+-------+------+
|   5 | 香蕉         |    10 |    4 |
|   6 | 大白菜       |    30 |    5 |
|   7 | 三只松鼠     |   100 |    6 |
+-----+--------------+-------+------+
3 rows in set (0.00 sec)

3)子查询

00

-- 查询分类名称为“水果”的所有商品
1.查询分类名为“水果”的分类id
select cid from category where cname = '水果';

2.查询出id为4的结果
select * from product where cno = 4;

3.合并
select * from product where cno = (select cid from category where cname = '水果');


-- 查询出(商品名称、商品分类名称)信息

  -- 左查询【查询出所有的信息了,不合适】
    select * from product p left outer join category c on p.cno = c.cid;

  -- 子查询
    select pname,cno from product;  //不合适

    select pname,(select cname from category where product.cno = category.cid) from product;    //不是很完美

    select pname,(select cname from category where product.cno = category.cid) as 商品分类信息 from product;  //尽管满足条件,但是不美观

//最优答案
select pname,(select cname from category as c where p.cno = c.cid) as 商品分类信息 from product as p; 

//省略as
select pname,(select cname from category c where p.cno = c.cid) 商品分类信息 from product p; 
  • 子查询数据如下
`查询分类名称为“水果”的所有商品`
mysql> select cid from category where cname = '水果';
+-----+
| cid |
+-----+
|   4 |
+-----+
1 row in set (0.00 sec)

mysql> select * from product where con = 4;
ERROR 1054 (42S22): Unknown column 'con' in 'where clause'
mysql> select * from product where cno = 4;
+-----+--------+-------+------+
| pid | pname  | price | cno  |
+-----+--------+-------+------+
|   5 | 香蕉   |    10 |    4 |
|   8 | 葡萄   |    15 |    4 |
+-----+--------+-------+------+
2 rows in set (0.00 sec)

mysql> select * from product where cno = (select cid from category where cname = '水果');
+-----+--------+-------+------+
| pid | pname  | price | cno  |
+-----+--------+-------+------+
|   5 | 香蕉   |    10 |    4 |
|   8 | 葡萄   |    15 |    4 |
+-----+--------+-------+------+
2 rows in set (0.00 sec)

`查询出(商品名称、商品分类名称)信息`
mysql> select pname,(select cname from category c where p.cno = c.cid) 商品分类信息 from product  p; 
+--------------+--------------------+
| pname        | 商品分类信息       |
+--------------+--------------------+
| iphone       | 电器               |
| 茅台         | 副食品             |
| 卫生纸       | 生活用品           |
| 香蕉         | 水果               |
| 大白菜       | 蔬菜               |
| 三只松鼠     | 干果               |
| 葡萄         | 水果               |
| 五粮液       | 副食品             |
| 水杯         | NULL               |
+--------------+--------------------+
9 rows in set (0.00 sec)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,193评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,306评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,130评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,110评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,118评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,085评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,007评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,844评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,283评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,508评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,395评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,985评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,630评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,797评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,653评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,553评论 2 352

推荐阅读更多精彩内容

  • MySQL逻辑架构 下面是一幅MySQL各组件之间如何协同工作的架构图,有助于我们深入理解MySQL服务器。 如图...
    骑小猪看流星阅读 4,804评论 2 135
  • 不用等到明年 今年的春草 已经绿了 等的人 却再不会来 想起王维 想起 渭城柳色 西出阳关 一杯别离的酒 一千年 ...
    忆荆高阅读 288评论 0 1
  • 当你把以前看不惯的事看惯了,你就成熟了。 当你把以前看不惯的人看惯了,你就受欢迎了。 知而不言,何尝不是一种境界。...
    东风东风阅读 218评论 1 6
  • 前几天值夜班,相当于忙了一个通宵,第二天早上迷迷糊糊左摆右摆的回到家,看到儿子已经起床,爬在床上玩耍,看到我回来了...
    麦芒先生阅读 401评论 1 6