MySQL学习--连接查询
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学习--连接查询相关推荐
- MySQL学习-连接查询
连接查询 操作的表 1.连接查询概述 2.连接查询的分类 3.连接查询原理以及笛卡尔积现象 4.怎么避免笛卡尔积现象? 5.内连接之等值连接 6.内连接之非等值连接 7.内连接之自连接 8.外连接 9 ...
- MySql中左连接查询突然变得很慢
MySql中左连接查询突然变得很慢 表结构: A表 userId,name B表 wId,userId,address A表左连接B表查询时,平时查询都非常的块,这几天突然变得很慢. 一个查询花了0. ...
- 高性能MySQL学习——提高查询性能
高性能MySQL学习--提高查询性能 提高查询性能 MySQL 查询优化器 MySQL 执行计划分析"三步曲" MySQL 执行计划查询分析 如何优化 SQL MySQL 自身优化 ...
- MySQL表连接查询
MySQL表连接查询 1 基本格式 select fieldName from tbName1 连接符 tbName2 on 条件 2 笛卡尔乘积[避免] -- 笛卡尔乘积,没有约束条件,数据库匹配发 ...
- MySQL 数据库————连接查询
目录 一.多表连接查询 1.内连接--inner join 2.左连接--left join 3.右连接--right join 二.存储过程 1.简介 2.优点 3.语法 ②.参数分类 ③.带参数的 ...
- MySQL 基础 ———— 连接查询
引言 本篇文章承接<数据库与SQL语句>专栏,进入DQL的重要环节,可以说,这一部分的内容应该占据SQL语言的大部分使用场景. 本篇的连接查询知识,和后面的一些重要的查询知识总结,共同构成 ...
- mysql sql 连接查询语句_Mysql——sql数据库中的连接查询
1.1.1 交叉连接(CROSS JOIN) 交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. ...
- mysql内连接查询原理_MySQL全面瓦解12:连接查询的原理和应用
概述 MySQL最强大的功能之一就是能在数据检索的执行中连接(join)表.大部分的单表数据查询并不能满足我们的需求,这时候我们就需要连接一个或者多个表,并通过一些条件过滤筛选出我们需要的数据. 了解 ...
- MySQL 内连接查询
MySQL FROM 子句中使用关键字 INNER JOIN 连接两张表,并使用 ON 子句来设置连接条件.如果没有任何条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的,两者可以 ...
最新文章
- eAccelerator和ionCube安装不上的解决办法
- python包Yellowbrick可视化lasso模型的最佳alpha值及误测误差
- 2014迅雷校园招聘笔试题答案
- android反编译出错,反编译出错信息
- 开发中的几种加密算法的使用场景
- 用指向指针方法对N个字符串进行排序并输出
- php pdo mysql哪个好_php pdo和mysqli对比选择
- 玩大了!别再埋头学Python了,它真的无用!
- java ui线程_UI线程异常处理方法
- (软件工程复习核心重点)第五章详细设计习题
- 独家总结| 一文读懂卡尔曼滤波
- 软件工程第一次作业(第一次思考这些问题)
- POJ 3061 Subsequence 尺取法 挑战146页
- php嗅探源码,网络嗅探器(含源代码)
- 汇编语言 王爽 第四版 课后检测点 课后实验 包括解释 持续更新~~
- 网络安全面试题及答案
- java多线程 —— 面试题集合(最全集合)
- 要计算机桌面,科幻再次要成真:你的办公桌面很快也会变成计算机
- 广义线性模型 matlab,基于Matlab的广义线性模型建模
- thinkpad T580加装内存条
热门文章
- python列表求和显示unsupport_python列表求和显示unsupport_Python3对flask测试时出现报UnsupportedOperation...
- SCCM 2016 分发.msi 软件
- Python3.9新特性
- WINPE 无光驱 无软驱 无引导区```重新搞掂操作系统``
- 前端单词大全(html+css+js+vue+小程序)
- JVM-垃圾回收GC
- 粘包现象与解决粘包问题
- 实验七 2D太阳系绘制
- 《巴黎圣母院》读后感
- VS Code 何时能一统江湖?