MySQL关联查询总结
MySQL中经常使用关联查询,有机会总结下:
1 left join(左联查询):
返回包括左表中的所有记录和右表中联接字段相等的记录
例:select * from a left join b on a.id=b.id
2 right join(右联查询):
right join(右联接)返回包括右表中的所有记录和左表中联接字段相等的记录
例:select * from a right join b on a.id=b.id
看到这里可能比较还是有点不明白,请看以下示例
假如有两张表,A B
表A记录如下:
aID aNum
1 a20050111
2 a20050112
3 a20050113
4 a20050114
5 a20050115
表B记录如下:
bID bName
1 2006032401
2 2006032402
3 2006032403
4 2006032404
8 2006032408
执行select * from A left join B on A.aID = B.bID
结果如下:
aID aNum bID bName
1 a20050111 1 2006032401
2 a20050112 2 2006032402
3 a20050113 3 2006032403
4 a20050114 4 2006032404
5 a20050115 NULL NULL
结果:从查询结果可以看出左关联查询是以左表的表为主表进行查询,由于A表中aID为5的在右表中没有对应记录,因此查询结果中最后一行又两个NULL列,同理可以得出右关联的原理。
3 内联查询(联接查询):在where子句中指定条件,将多个表连接起来
select c.cname,b.bookname from cats c,book b, where c.id=b.catid
看到这里,可能不禁发问,这三者有什么区别?看下面这个例子
有两张数据表,表user(id, name)记录了用户的ID和昵称,表article(id,uid,title, content, time)记录了用户发表的文章标题.内容和时间,写一个SQL语句打印出每个用户的昵称及其发表的文章总数
解决方法1:
select u.name,count(a.id) from user u,article a where u.id=a.uid group by a.uid
解决方法2:
select u.name,count(a.id) from user u left join article a on u.id=a.uid group by a.uid
假如出现这种情况:有一个用户没有发表文章,那么第一个解决方案不会出现这个用户,因此第一种是错误的。
4嵌套查询
在一个select语句的where子句中,包含另一个select子句,也可称为子查询。嵌套查询的原理一般是由里向外。
例:select bookid,bookname from books where bookid in(select bookid from cats );
最近做面试题,碰到几个比较有意思的Mysql操作,总结如下:
a)关系S(s#, sname, sex), C (c#, cname), SC(s#, c#) . 其中S#为学生号,sname为学生姓名,sex为性别,c#为课程号,cname为课程名。
写出查询选修"计算机"课的全体女学生姓名的SQL语句。
select S.s#,S.sname from S,SC where S.s#=SC.s# and S.sex=1 and SC.c# in (select from C where cname='计算机' )
写出查询没有选修"数学"课的学生姓名的SQL语句。
select * from S where s# not in(select from S,SC where S.s#=SC.s# and SC.c# in ( select c# from C where cname='数学'))
b)列三张表,请根据要求写出SQL语句
CARD借书卡。 CNO卡号,NAME姓名,CLASS班级
BOOKS图书。 BNO书号,BNAME书名,AUTHOR作者,PRICE单价
BORROW借书记录。 CNO借书卡号,BNO书号,RDATE还书日期
备注:限定每人每种书只能借一本
找出借书超过5本的读者,输出借书卡号,及所借图书册数。(5分)
错误写法: select c.name, count(b.cno) total from card c,borrow b where c.cno=b.cno and total>5 group by b.cno ;
正确写法:select c.name, count(b.cno) total from card c,borrow b where c.cno=b.cno group by b.cno having total>=5;
由于使用的是group进行分组,而在group by进行分组查询统计后,只能使用having子句来对查询结果进行进一步的过滤。
MySQL关联查询总结的更多相关文章
- mysql 关联查询 索引不起作用原因记录
业务逻辑如下:查询某篇文章的评论列表,且列出评论人及被评论人的昵称.头像. 先看一下表结构 评论表: 评论表的索引: 用户表: 用户表的索引: 查询语句如下: SELECT t1.comment_id ...
- mysql关联查询和联合查询
一.内联方式 1.传统关联查询 "select * from students,transcript where students.sid=transcript.sid and transc ...
- MySQL☞关联查询
关联查询:所需要的数据来源于多张表,通过表的连接查询(关联查询)来查询多张表中的数据 格式: select 别名1 . */列名 , 别名2 . */列名 from 表名1 别名1 , 表名2 别 ...
- mysql 关联查询技巧
废话不多说,直接进入正题 #数据准备 班级表class: CREATE TABLE `class` ( `class_no` ) unsigned zerofill NOT NULL AUTO_INC ...
- [mysql] 关联查询sql记录
//查询账单关联订单 select o.id as id, o.order_no as orderNo, o.case_no as caseNo, o.send_time as sendTime, o ...
- MySQL 关联查询 内连接
内连接 [INNER| CROSS] JOIN无条件内连接:无条件内连接,又名交叉连接/笛卡尔连接第一张表种的每一项会和另一张表的每一项依次组合#例:mysql> select * ...
- mysql关联查询
mysql数据库的统计------生成统计信息 1.distinct:在一组之中将各个唯一的值找出来,如找出所有的品牌种类 mysql>select distinct brand_kind fr ...
- mysql 关联查询的执行顺序
STRAIGHT JOIN : 能强制按照顺序关联表(应该是)
- MySQL 关联查询 外连接 { LEFT| RIGHT } JOIN
左外连接: (以左表为基准)两张表做连接的时候,在连接条件不匹配的时候留下左表中的数据,而右表中的数据以NULL填充例:使用左连接把学生的数据全取出来,该学生没有学院信息的用NULL填充 mysql& ...
随机推荐
- 微信公众平台企业号验证接口、回调 PHP版
微信公众平台企业号验证接口.回调 PHP版,本人为了解决这个企业号的验证和发送消息的问题,整整研究了几天时间,由于微信企业号刚推出来,网上资料太少了!后来在一些朋友的帮助下和本人重复调试完好下,最终整 ...
- linux-ubuntu关闭防火墙
SYNOPSIS iptables [-t table] {-A|-C|-D} chain rule-specification ip6tables [-t table] {-A|-C|-D} cha ...
- 软件开发V型号
RAD(rap application development),就是软件开发过程中的一个重要模型,称为高速应用开发模型.其模型构图形似字母V,所以又称V模型. 他通过开发和測试同一时候进行 ...
- 安裝 Rails 開發環境
安裝 Rails 開發環境 Give someone a program, you frustrate them for a day; teach them how to program, you f ...
- Facebook Hack 语言 简介
1. Hack 是什么? Hack 是一种基于HHVM(HipHop VM 是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT编译器,同时具有产生快速代码和即时编译的优点.)的 ...
- inux平台的C与C++
课堂里学不到的C与C++那些事(一) 首先,声明一下这是一个系列的文章.至于整个系列有多少篇,笔者也不知道,不知道有多少篇,也不知道多久会更新一篇.反正只有一个原则,写出来的文 章能见得人才会公布出来 ...
- C#抓取AJAX页面的内容
原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面 ...
- JS模块与命名空间的介绍
起因将代码组织到类中的一个重要原因是让代码更加“模块化”,可以在很多不同的场景中实现代码的重用.但类不是唯一的模块化代码的方式. 一般来讲,模块是一个独立的JS文件.模块文件可以包含一个类定义.一组相 ...
- uva 11529 - Strange Tax Calculation(计数问题)
题目链接:uva 11529 - Strange Tax Calculation 题目大意:给出若干个点,保证随意三点不共线.随意选三个点作为三角行,其它点若又在该三角形内,则算是该三角形内部的点.问 ...
- Hybrid
“榕树下·那年”移动app ( hybrid ) 开发总结 榕树下网站本身的技术人员并不多,所以app开发的任务就到了母公司盛大文学这边. 盛大文学无线业务中心负责这次具体开发任务. ...