MySQL学习–连接查询

文章目录

  • MySQL学习--连接查询
    • 1+N模式
    • 全连接查询
    • 左连接
    • 左连接、右连接、内连接的区别

1+N模式

不使用连接查询;

要求查询出商品名称、商品栏目、商品库存、商品价格;

<?php
//header('Content-type:text/html;charset-utf-8');
$conn = mysqli_connect('localhost','root','azb123');$sql = 'use shop';mysqli_query($conn,$sql);$sql = 'set names utf8';mysqli_query($conn,$sql);$sql = 'select goods_name,cat_id,goods_number,shop_price from goods';$rs = mysqli_query($conn,$sql);while($row = mysqli_fetch_assoc($rs)){//    根据$row中的cat_id去查询category表$sql = 'select cat_name from category where cat_id ='.$row['cat_id'];$rs2 = mysqli_query($conn,$sql);$cat = mysqli_fetch_assoc($rs2);$row['cat_name'] = $cat['cat_name'];$list[] = $row;
}
//print_r($list);exit();
?><!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>我也会做报价表</title><style type="text/css">table{border: dashed 2px black;}td{border: solid 2px red;}th{border: solid 2px black;}</style>
</head>
<body><h1>我也会做报价单</h1><table><tr><th>商品名称</th><th>栏目名称</th><th>商品库存</th><th>商品名称</th></tr><?php foreach ($list as $v){ ?><tr><td><?php echo $v['goods_name']; ?></td><td><?php echo $v['cat_name']; ?></td><td><?php echo $v['goods_number']; ?></td><td><?php echo $v['shop_price']; ?></td></tr><?php } ?></table></body>
</html>

效果图

全连接查询

表与集合的关系:一张表就是一个集合;每一行就是一个元素

注:集合不能重复但我有可能两行数据完全一样?

答:mysql内部每一行还有一个rowid.

mysql> create table test3(-> id int,-> sname char(5)-> )engine myisam charset utf8;
Query OK, 0 rows affected, 1 warning (0.65 sec)mysql> insert into test3 values (1,'啦啦'),(2,'嘻嘻'),(3,'哈哈');
Query OK, 3 rows affected (0.24 sec)
Records: 3  Duplicates: 0  Warnings: 0mysql> create table test4(-> cat_id int,-> cat_name char(5)-> )engine myisam charset utf8;
Query OK, 0 rows affected, 1 warning (0.20 sec)mysql> insert into test4 values (98,'月亮'),(99,'太阳');
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> select * from test3;
+------+--------+
| id   | sname  |
+------+--------+
|    1 | 啦啦   |
|    2 | 嘻嘻   |
|    3 | 哈哈   |
+------+--------+
3 rows in set (0.00 sec)mysql> select * from test4;
+--------+----------+
| cat_id | cat_name |
+--------+----------+
|     98 | 月亮     |
|     99 | 太阳     |
+--------+----------+
2 rows in set (0.00 sec)mysql> select * from test3,test4;
+------+--------+--------+----------+
| id   | sname  | cat_id | cat_name |
+------+--------+--------+----------+
|    1 | 啦啦   |     99 | 太阳     |
|    1 | 啦啦   |     98 | 月亮     |
|    2 | 嘻嘻   |     99 | 太阳     |
|    2 | 嘻嘻   |     98 | 月亮     |
|    3 | 哈哈   |     99 | 太阳     |
|    3 | 哈哈   |     98 | 月亮     |
+------+--------+--------+----------+
6 rows in set (0.00 sec)

两表做全相乘

  • 从行的角度来看:就是2表每一行两两组合
  • 从列的角度来看:结果集中的列是两表的列名的相加

要求:查询出商品名称、商品栏目、商品库存、商品价格;

<!--方法2:使用全相乘-->
<?php
//header('Content-type:text/html;charset-utf-8');
$conn = mysqli_connect('localhost','root','azb123');$sql = 'use shop';mysqli_query($conn,$sql);$sql = 'set names utf8';mysqli_query($conn,$sql);$sql = 'select goods_name,category.cat_name,goods_number,shop_price from goods,category where goods.cat_id=category.cat_id';$rs = mysqli_query($conn,$sql);
$list = array();while($row = mysqli_fetch_assoc($rs)){$list[] = $row;
}
//print_r($list);exit();
?><!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>我也会做报价表</title><style type="text/css">table{border: dashed 2px black;}td{border: solid 2px red;}th{border: solid 2px black;}</style>
</head>
<body><h1>我也会做报价单(全连接)</h1><table><tr><th>商品名称</th><th>栏目名称</th><th>商品库存</th><th>商品名称</th></tr><?php foreach ($list as $v){ ?><tr><td><?php echo $v['goods_name']; ?></td><td><?php echo $v['cat_name']; ?></td><td><?php echo $v['goods_number']; ?></td><td><?php echo $v['shop_price']; ?></td></tr><?php } ?></table></body>
</html>

效果图

左连接

假设A表不动,B表在A表上下滑动;A表与B表通过一个关系筛选B表的行

语法:

A left join B on 条件 条件为真,B表对应的行取出;

注:取出部分看做一张表C进行查询;where,having,orderby,limit照常使用

要求:查询出商品名称、商品栏目、商品库存、商品价格;

<!--方法2:使用全相乘-->
<?php
//header('Content-type:text/html;charset-utf-8');
$conn = mysqli_connect('localhost','root','azb123');$sql = 'use shop';mysqli_query($conn,$sql);$sql = 'set names utf8';mysqli_query($conn,$sql);$sql = 'select goods_name,category.cat_name,goods_number,shop_price from goods left join category on goods.cat_id=category.cat_id ';$rs = mysqli_query($conn,$sql);
$list = array();while($row = mysqli_fetch_assoc($rs)){$list[] = $row;
}
//print_r($list);exit();
?><!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>我也会做报价表</title><style type="text/css">table{border: dashed 2px black;}td{border: solid 2px red;}th{border: solid 2px black;}</style>
</head>
<body>
<h1>我也会做报价单(左连接)</h1>
<table><tr><th>商品名称</th><th>栏目名称</th><th>商品库存</th><th>商品名称</th></tr><?php foreach ($list as $v){ ?><tr><td><?php echo $v['goods_name']; ?></td><td><?php echo $v['cat_name']; ?></td><td><?php echo $v['goods_number']; ?></td><td><?php echo $v['shop_price']; ?></td></tr><?php } ?>
</table>
</body>
</html>

效果图

左连接、右连接、内连接的区别

左右连接可以互换: A left join B on 条件 = B left join A on 条件

注:尽量使用左连接,出于移植时兼容性考虑。

内连接:左右连接的交集。

注:不支持``外连接:左右连接的交集。

mysql> select * from boy;
+------+-----------+
| hid  | bname     |
+------+-----------+
| A    | 屌丝      |
| B    | 杨过      |
| C    | 陈冠希    |
+------+-----------+
3 rows in set (0.14 sec)mysql> select * from girl;
+------+-----------+
| hid  | gname     |
+------+-----------+
| B    | 小龙女    |
| C    | 张柏芝    |
| D    | 死宅女    |
+------+-----------+
3 rows in set (0.00 sec)mysql> select boy.*,girl.* from boy left join girl on boy.hid=girl.hid;
+------+-----------+------+-----------+
| hid  | bname     | hid  | gname     |
+------+-----------+------+-----------+
| A    | 屌丝      | NULL | NULL      |
| B    | 杨过      | B    | 小龙女    |
| C    | 陈冠希    | C    | 张柏芝    |
+------+-----------+------+-----------+
3 rows in set (0.02 sec)mysql> select boy.*,girl.* from girl left join boy on boy.hid=girl.hid;
+------+-----------+------+-----------+
| hid  | bname     | hid  | gname     |
+------+-----------+------+-----------+
| B    | 杨过      | B    | 小龙女    |
| C    | 陈冠希    | C    | 张柏芝    |
| NULL | NULL      | D    | 死宅女    |
+------+-----------+------+-----------+
3 rows in set (0.00 sec)mysql> select boy.*,girl.* from girl right join boy on boy.hid=girl.hid;
+------+-----------+------+-----------+
| hid  | bname     | hid  | gname     |
+------+-----------+------+-----------+
| A    | 屌丝      | NULL | NULL      |
| B    | 杨过      | B    | 小龙女    |
| C    | 陈冠希    | C    | 张柏芝    |
+------+-----------+------+-----------+
3 rows in set (0.00 sec)mysql> select boy.*,girl.* from girl inner join boy on boy.hid=girl.hid;
+------+-----------+------+-----------+
| hid  | bname     | hid  | gname     |
+------+-----------+------+-----------+
| B    | 杨过      | B    | 小龙女    |
| C    | 陈冠希    | C    | 张柏芝    |
+------+-----------+------+-----------+
2 rows in set (0.00 sec)mysql>

例题:

mysql> select mid,t1.tname,gid,mres,matime from m left join t as t1 on hid=t1.tid-> left join t as t2 on t2.tid=gid;
+------+--------------+------+------+------------+
| mid  | tname        | gid  | mres | matime     |
+------+--------------+------+------+------------+
|    1 | 国安         |    2 | 2:0  | 2006-05-21 |
|    2 | 申花         |    3 | 1:2  | 2006-06-21 |
|    3 | 布尔联队     |    1 | 2:5  | 2006-06-25 |
|    4 | 申花         |    1 | 3:2  | 2006-07-21 |
+------+--------------+------+------+------------+
4 rows in set (0.00 sec)mysql> select t1.tname,t2.tname,gid,mres,matime from m left join t as t1 on hid=t1.tid-> left join t as t2 on t2.tid=gid;
+--------------+--------------+------+------+------------+
| tname        | tname        | gid  | mres | matime     |
+--------------+--------------+------+------+------------+
| 国安         | 申花         |    2 | 2:0  | 2006-05-21 |
| 申花         | 布尔联队     |    3 | 1:2  | 2006-06-21 |
| 布尔联队     | 国安         |    1 | 2:5  | 2006-06-25 |
| 申花         | 国安         |    1 | 3:2  | 2006-07-21 |
+--------------+--------------+------+------+------------+
4 rows in set (0.00 sec)mysql> select t1.tname,gid,mres,matime from m left join t as t1 on hid=t1.tid-> left join t as t2 on t2.tid=gid-> where matime between '2006-06-01' and '2006-07-01';
+--------------+------+------+------------+
| tname        | gid  | mres | matime     |
+--------------+------+------+------------+
| 申花         |    3 | 1:2  | 2006-06-21 |
| 布尔联队     |    1 | 2:5  | 2006-06-25 |
+--------------+------+------+------------+
2 rows in set (0.05 sec)mysql>

MySQL学习--连接查询相关推荐

  1. MySQL学习-连接查询

    连接查询 操作的表 1.连接查询概述 2.连接查询的分类 3.连接查询原理以及笛卡尔积现象 4.怎么避免笛卡尔积现象? 5.内连接之等值连接 6.内连接之非等值连接 7.内连接之自连接 8.外连接 9 ...

  2. MySql中左连接查询突然变得很慢

    MySql中左连接查询突然变得很慢 表结构: A表 userId,name B表 wId,userId,address A表左连接B表查询时,平时查询都非常的块,这几天突然变得很慢. 一个查询花了0. ...

  3. 高性能MySQL学习——提高查询性能

    高性能MySQL学习--提高查询性能 提高查询性能 MySQL 查询优化器 MySQL 执行计划分析"三步曲" MySQL 执行计划查询分析 如何优化 SQL MySQL 自身优化 ...

  4. MySQL表连接查询

    MySQL表连接查询 1 基本格式 select fieldName from tbName1 连接符 tbName2 on 条件 2 笛卡尔乘积[避免] -- 笛卡尔乘积,没有约束条件,数据库匹配发 ...

  5. MySQL 数据库————连接查询

    目录 一.多表连接查询 1.内连接--inner join 2.左连接--left join 3.右连接--right join 二.存储过程 1.简介 2.优点 3.语法 ②.参数分类 ③.带参数的 ...

  6. MySQL 基础 ———— 连接查询

    引言 本篇文章承接<数据库与SQL语句>专栏,进入DQL的重要环节,可以说,这一部分的内容应该占据SQL语言的大部分使用场景. 本篇的连接查询知识,和后面的一些重要的查询知识总结,共同构成 ...

  7. mysql sql 连接查询语句_Mysql——sql数据库中的连接查询

    1.1.1   交叉连接(CROSS JOIN) 交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. ...

  8. mysql内连接查询原理_MySQL全面瓦解12:连接查询的原理和应用

    概述 MySQL最强大的功能之一就是能在数据检索的执行中连接(join)表.大部分的单表数据查询并不能满足我们的需求,这时候我们就需要连接一个或者多个表,并通过一些条件过滤筛选出我们需要的数据. 了解 ...

  9. MySQL 内连接查询

    MySQL FROM 子句中使用关键字 INNER JOIN 连接两张表,并使用 ON 子句来设置连接条件.如果没有任何条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的,两者可以 ...

最新文章

  1. eAccelerator和ionCube安装不上的解决办法
  2. python包Yellowbrick可视化lasso模型的最佳alpha值及误测误差
  3. 2014迅雷校园招聘笔试题答案
  4. android反编译出错,反编译出错信息
  5. 开发中的几种加密算法的使用场景
  6. 用指向指针方法对N个字符串进行排序并输出
  7. php pdo mysql哪个好_php pdo和mysqli对比选择
  8. 玩大了!别再埋头学Python了,它真的无用!
  9. java ui线程_UI线程异常处理方法
  10. (软件工程复习核心重点)第五章详细设计习题
  11. 独家总结| 一文读懂卡尔曼滤波
  12. 软件工程第一次作业(第一次思考这些问题)
  13. POJ 3061  Subsequence   尺取法   挑战146页
  14. php嗅探源码,网络嗅探器(含源代码)
  15. 汇编语言 王爽 第四版 课后检测点 课后实验 包括解释 持续更新~~
  16. 网络安全面试题及答案
  17. java多线程 —— 面试题集合(最全集合)
  18. 要计算机桌面,科幻再次要成真:你的办公桌面很快也会变成计算机
  19. 广义线性模型 matlab,基于Matlab的广义线性模型建模
  20. thinkpad T580加装内存条

热门文章

  1. python列表求和显示unsupport_python列表求和显示unsupport_Python3对flask测试时出现报UnsupportedOperation...
  2. SCCM 2016 分发.msi 软件
  3. Python3.9新特性
  4. WINPE 无光驱 无软驱 无引导区```重新搞掂操作系统``
  5. 前端单词大全(html+css+js+vue+小程序)
  6. JVM-垃圾回收GC
  7. 粘包现象与解决粘包问题
  8. 实验七 2D太阳系绘制
  9. 《巴黎圣母院》读后感
  10. VS Code 何时能一统江湖?