SQL联表查询
数据库中最最常用的语法----select.简单的select语法很直白:
select column from table where expression;
从((from)存储数据的地方(table)按照(where)一定的条件(expression)查找(select)我要的数据(column);
但是在实际工作中用到的比较多的往往还是多联表查询,所以在这里记下自己学习多联表查询的心得。
首先聊一聊笛卡尔积,这是几乎所有数据库书籍在讲多联表查询时第一个要讲的东西,我等P民也只能是把笛卡尔积放在第一位了。用初中数学来解释笛卡尔积其实就是因式展开(各位大神不要打我),类似于下面这种:
A=(a+b),B=(c+d),A*B=ac+ad+bc+bd;
嗯虽然不一样,但是其实表面上就是这样过的。
然后基础语法其实和单表查询还是差不多的:
select column from table1 (方式) join table2 on expression;
多表查询和单表查询最打区别就是多表查询多了join on 语句,讲专业点叫连接。连接常用的有三种inner、left、right,这里我们不展开讲三种方式的区别(因为我自己也讲不清楚!如果想知道请自行谷歌笛卡尔积、SQL多表联合查询十篇文章九篇会讲的),只讲怎么用,用哪个好。
首先,放出结论(一般情况下):
1)、如果table1符合条件数据量远大于table2,且table2数据非常多,用left join;
2)、如果table1符合条件数据量远小于table2,且table1数据非常多,用right join;
3)、如果一样多且数据量不多推荐使用inner join;
4)、但是如果都非常多请用联合查询 + where,后面会讲到。
当然结论并非绝对,会受到两表中Null数据行的影响,但是我想说的是!实际中Null数据行是比较少的,所以这个结论大致上还是可以用的!!!不要问我为什么,就是这么粗暴!就是这么任性!
最后放大招--嵌套查询
嵌套查询顾名思义就是个嵌套,以内查询语句的输出作为外查询语句的输入或条件语句,以求达到缩减数据量的目的。在实际应用中,如果两表的数据量非常大,那么强烈推荐嵌套查询。假设有下表;
那么嵌套查询的典型语法如下:
在where条件中使用嵌套查询
select
account
from
userbindinfo
where
user_id
in
(
select
user_id -- 该处内查询语句的输出必须与外部查询语句的条件一一对应
from
users
where
user_type = 1
)
SQL联表查询的更多相关文章
- sql学习笔记(三)—— 联表查询
上篇写了一些sql查询的知识,这篇接着写一下有关联表查询的知识. 既然是联表查询,那肯定得多个表啊,所以,我们先创建一个教师表,表名为 teacher,并且向表中插入数据. 准备工作: 创建表语句: ...
- [慢查优化]联表查询注意谁是驱动表 & 你搞不清楚谁join谁更好时请放手让mysql自行判定
写在前面的话: 不要求每个人一定理解 联表查询(join/left join/inner join等)时的mysql运算过程: 不要求每个人一定知道线上(现在或未来)哪张表数据量大,哪张表数据量小: ...
- (转)MySQL联表查询
资料源于网络 一.内联结.外联结.左联结.右联结的含义及区别在SQL标准中规划的(Join)联结大致分为下面四种:1.内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结.2 ...
- Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题
Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题 表更描述: 将mysql数据库中的worktask表添加ishaspic字段. 具体操作:(1)数据库worktask表新添是否有图片字 ...
- 【转】[慢查优化]联表查询注意谁是驱动表 & 你搞不清楚谁join谁更好时请放手让mysql自行判定
转自:http://zhengyun-ustc.iteye.com/blog/1942797 写在前面的话: 不要求每个人一定理解 联表查询(join/left join/inner join等)时的 ...
- MyBatis联表查询
MyBatis逆向工程主要用于单表操作,那么需要进行联表操作时,往往需要我们自己去写sql语句. 写sql语句之前,我们先修改一下实体类 Course.java: public class Cours ...
- Django之model联表:一对多、跨表操作,联表查询
表结构概述 model.py : class Something(models.Model): name = models.CharField(max_length=32) class UserTyp ...
- 了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表
一.为什么要用小表驱动大表 1.驱动表的定义 当进行多表连接查询时, [驱动表] 的定义为: 1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表] 2)未指定联接条件时,行数少的表为[驱动表 ...
- Spring Hibernate JPA 联表查询 复杂查询(转)
今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...
随机推荐
- 【http】http的方法,状态码和组成部分
Http(Hypertext Transfer Protocol) HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传 ...
- 树莓派安装FLASK服务;并在端网页读取 GPIO状态和系统时间
做过一些物联网的作品:因为不想一直做APP来控制,因为不能每个人都去下载你自己做的APP,浏览器大家都是有的:那么每个人通过浏览器WEB来访问我们服务器,岂不是很简单和方便,采用flask+pytho ...
- 开涛spring3(1) - Spring概述
1.1.1 Spring是什么 Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发.应用程序是由 ...
- iOS简单快速集成Cordova
如果你对于什么是Cordova还不了解,可以先移步到我另一个文章:Cordoval在iOS中的运用整理 里面有详细的介绍跟如何搭建Cordova:而本文则是要介绍JiaCordova插件,如果你有一点 ...
- python 发包爬取中国移动充值页面---可判断手机号是否异常
1.用requests.Session()的方式,可以实现自动化管理cookie.session等. 2.具体流程可以抓包分析. 所有请求的参数如要搞清楚需要分析js源码.只能提示一下,一共分为三步: ...
- Grid search in the tidyverse
@drsimonj here to share a tidyverse method of grid search for optimizing a model's hyperparameters. ...
- awk之随机函数rand()和srand() (转)
转自:http://blog.chinaunix.net/uid-10540984-id-2942041.html 文件: 1234567 abcdefg ...... 现在想要随机抽取5列组成下 ...
- python爬虫从入门到放弃(六)之 BeautifulSoup库的使用
上一篇文章的正则,其实对很多人来说用起来是不方便的,加上需要记很多规则,所以用起来不是特别熟练,而这节我们提到的beautifulsoup就是一个非常强大的工具,爬虫利器. beautifulSoup ...
- 使用VideoView开发视频总结
一.VideoView及其相关组件总结 在Android中,播放视频有2种方式,第一种方式是使用MediaPlayer结合SurfaceView来播放,通过MediaPlayer来控制视频的播放.暂停 ...
- 使用 Hive装载数据的几种方式
装载数据 1.以LOAD的方式装载数据 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION( ...