简述

    简单回顾并总结下不同的表连接语句有什么异同之处以及一些概念。

    建库语句如下

 DROP DATABASE IF EXISTS `demo`;
CREATE DATABASE `demo`;
USE `demo`;
/*部门表*/
CREATE TABLE department (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(50)
);
INSERT INTO department VALUES(DEFAULT, '财务'),(DEFAULT, '客服'),(DEFAULT, '技术');
/*雇员表*/
CREATE TABLE employee (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(50),
`department_id` INT,
CONSTRAINT fk_employee_department FOREIGN KEY (id) REFERENCES department(id)
);
INSERT INTO employee VALUES(DEFAULT, '张三', 1),(DEFAULT, '李四', 2),(DEFAULT, '王五', 2);

    由上代码可知,分别创建了部门表和雇员表,雇员表和部门表是多对一的关系,技术部没有雇员。


内连接

    语法:inner join ... on ... inner可以省略。

    概念:内连接查询的结果是从两个或两个以上的表的组合中挑选出符合连接条件的数据,如果数据无法满足连接条件则将其忽略。在内连接查询中,参与连接的表的地位是平等的。

    例:现在要查询员工和其所在的部门,sql语句如下

 SELECT e.id, e.`name`, d.`name` '部门' FROM employee e JOIN department d ON e.`department_id`=d.`id`

    结果如下:

    

    可以看出,部门一列只是将有员工的部门查询了出来,而没有员工的技术部则没有查询出来。

外连接

    概念:上文提到:在内连接查询中,参与连接的表的地位是平等的。而在外连接中参与连接的表有主从之分。以主表的每行数据匹配从表的数据列,将符合连接条件的数据直接返回到结果集中;对那些不符合连接条件的列,将被填上空值后再返回到结果集中。

左外连接

    语法:left  outer join ... on ... outer可以省略。

    概念:左外连接查询的结果集包括左表中的所有行,而不仅仅是连接匹配的行。若左表的某行在右表中没有匹配行,则在相关联的结果集中右表的所有选择列均为空值。

    例一:将上面内连接的语句改成左外连接

SELECT e.id, e.`name`, d.`name` '部门' FROM department d LEFT JOIN employee e ON e.`department_id`=d.`id`

    查询结果如下图

    

    可以看出,没有员工的部门也被查询了出来,并且员工的id和姓名列被填上了空值。

    例二:查询所有部门包含的员工数,没有员工的部门也要被查询出来。sql语句如下

 SELECT d.`name`,COUNT(e.`id`) '部门人数' FROM department d LEFT JOIN employee e ON e.`department_id`=d.`id` GROUP BY e.`department_id`

    结果如下

    

    可以看出,没有员工的技术部也被查询了出来,统计人数为0(ps:这个0和之前自动填充的null值不冲突,因为这里使用了聚合函数count(),结果集先填充了null,再进行count统计的)。

右外连接

    语法:right  outer join ... on ... outer可以省略。

    概念:右外连接和左外连接类似,只是位置变了一下。结果集必须包含右表中的所有行,若右表中有的项在左表中没有,则以null值填充。

    例一:将上面左外连接的语句改成右外连接,sql语句如下

 SELECT d.`name`,COUNT(e.`id`) '部门人数' FROM employee e RIGHT JOIN department d ON e.`department_id`=d.`id` GROUP BY e.`department_id`

    结果如下

    

sql连接语句的更多相关文章

  1. 关于SQL连接语句中的Integrated Security=SSPI/ture/false

    解决方法:即:Security Support Provider Interface设置Integrated Security为 True 的时候,连接语句前面的 UserID, PW 是不起作用的, ...

  2. Java连接MySQL数据库实现用户名密码的验证方法 Java语句中sql查询语句'' ""作用

    //方法一,可以验证登录,但方法不实用.package com.swift; import java.sql.Connection; import java.sql.DriverManager; im ...

  3. 在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句:

    在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句: 如果是String类型的字符串进行判空的时候: <if test=&q ...

  4. [转]MySQL 最基本的SQL语法/语句

    MySQL 最基本的SQL语法/语句,使用mysql的朋友可以参考下.   DDL-数据定义语言(Create,Alter,Drop,DECLARE) DML-数据操纵语言(Select,Delete ...

  5. SQL SELECT 语句

      本章讲解 SELECT 和 SELECT * 语句. SQL SELECT 语句 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). SQL SELECT 语法 SE ...

  6. 15个初学者必看的基础SQL查询语句

    本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 本文将分享15个初学者必看的基础SQL查询语句,都很基础,但是你不一定都会,所以好好看看吧. 1.创建表和数据插 ...

  7. 测试常用SQL注入语句大全

    转载自Cracer,标题:<渗透常用SQL注入语句大全>,链接http://www.xxxx.com/?p=2226 1.判断有无注入点 整形参数判断 1.直接加' 2.and 1=1 3 ...

  8. SQL SELECT语句

    基本SQL SELECT语句   1.       下面的语句是否可以执行成功 select ename , job , sal as salary  from emp; 2.       下面的语句 ...

  9. (转)经典SQL查询语句大全

    (转)经典SQL查询语句大全 一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql s ...

随机推荐

  1. 1523. K-inversions URAL 求k逆序对,,,,DP加树状数组

    1523. K-inversions Time limit: 1.0 secondMemory limit: 64 MB Consider a permutation a1, a2, …, an (a ...

  2. 使用python实现后台系统的JWT认证(转)

    今天的文章介绍一种适用于restful+json的API认证方法,这个方法是基于jwt,并且加入了一些从oauth2.0借鉴的改良. 1. 常见的几种实现认证的方法 首先要明白,认证和鉴权是不同的.认 ...

  3. windows 2008 R2 断电重启进入修复模式

    windows 2008 R2 意外断电重启进入修复模式 现在出现一个问题,就是当机房停电的时候,计算机自动进入到修复模式,当人不在机房的时候,容易造成服务器无法访问,我相信正常启动应该没什么问题吧, ...

  4. FPGA与安防领域

    安防主要包括:闭路监控系统.防盗报警系统.楼宇对讲系统.停车厂管理系统.小区一卡通系统.红外周界报警系统.电子围栏.巡更系统.考勤门禁系统.安防机房系统.电子考场系统.智能门锁等等. 在监控系统中,F ...

  5. webpack2使用ch5-多页面设置 内部js和引入js

    1 当前目录 2 webpack.config.js 配置 const webpack = require('webpack'), htmlWebpackPlugin = require('html- ...

  6. python _winreg模块

    详细资料请参考:https://docs.python.org/2/library/_winreg.html 一.常用函数功能介绍 OpenKey() - 打开一个key ############## ...

  7. Java面向对象 线程技术 -- 下篇

     Java面向对象 线程技术 -- 下篇 知识概要:              (1)线程间的通信           生产者 - 消费者 (2)生产者消费者案例优化 (3)守护线程 (4)停止线 ...

  8. C# 多线程、异步线程、线程池相关知识

    /* 线程池ThreadPool类会在需要时增减池中线程的线程数,直到最大的线程数.池中的最大线程数是可配置的. 在双核CPU中,默认设置为1023个工作线程和1000个I/O线程.也可以指定在创建线 ...

  9. JQuery上传插件Uploadify详解及其中文按钮解决方案 .

    Uploadify有一个参数是 buttonText 这个无论你怎么改都不支持中文,因为插件在js里用了一个转码方法把这个参数的值转过码了,解码的地方在那个swf文件里,看不到代码,所以这条路不行. ...

  10. PyCharm 2017 官网 下载 安装 设置 配置 (主题 字体 字号) 使用 入门 教程

    一.安装 Python 3.6 首先,要安装好 Python 3.6.如果你还没有安装,可以参考咪博士之前的教程 Python 3.6.3 官网 下载 安装 测试 入门教程 (windows) 二.官 ...