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 ...
随机推荐
- 用cv::Scalar来设置opencv中图片的颜色
1 怎样使用cv::Scalar来设置opencv中的颜色 cv::Scalar的构造函数是cv::Scalar(v1, v2, v3, v4),前面的三个参数是依次设置BGR的,和RGB相反,第四个 ...
- windows上安装jdk
1.下载jdk安装包 jdk官网 http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.安装jdk 傻瓜式下一步 ...
- 机器学习:Python实现聚类算法(一)之K-Means
1.简介 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各 ...
- css浮动--float/clear通俗讲解(转载)
本文为转载 (出处:http://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html) 教程开始: 首先要知道,div是块级元素,在页面 ...
- Shiny for Interactive Application Development using R(转)
This slidify-based deck introduces the shiny package from R-Studio and walks one through the develop ...
- R语言学习路线和常用数据挖掘包(转)
对于初学R语言的人,最常见的方式是:遇到不会的地方,就跑到论坛上吼一嗓子,然后欣然or悲伤的离去,一直到遇到下一个问题再回来.当然,这不是最好的学习方式,最好的方式是——看书.目前,市面上介绍R语言的 ...
- 学习python的第一个小目标:通过requests+xlrd实现简单接口测试,将测试用例维护在表格中,与脚本分开。
小白的学习方式:通过确定一个小目标来想办法实现它,再通过笔记来加深印象. 面对标题中的小目标我陷入了思考....嗯,首先实现利用xlrd库来取出想要的用例 首先用表格准备好用例,如图下: 先试下取nu ...
- Bottle源码阅读笔记(一):WSGI
前言 Bottle是一个Python Web框架.整个框架只有一个文件,不到4k行的代码,没有Python标准库以外的依赖,却包含了路由.模板和插件等Web框架常用功能.通过阅读Bottle源码来了解 ...
- laravel 服务容器实现原理
前言 通过实现laravel 框架功能,以便深入理解laravel框架的先进思想. 什么是服务容器 服务容器是用来管理类依赖与运行依赖注入的工具.Laravel框架中就是使用服务容器来实现 ** 控制 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(九)——MyBatis和Spring整合
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6964162.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(八)--My ...