`

SQL基础语法(4)

    博客分类:
  • DB
阅读更多
这篇blog是SQL基础语法,只是作为我平时查阅和备份,仅适合初学者学习阅读,高手绕行。
SQL基础语法(1)访问http://fuchangle.iteye.com/blog/1772395
SQL基础语法(2)访问http://fuchangle.iteye.com/blog/1772523
SQL基础语法(3)访问http://fuchangle.iteye.com/blog/1772779

多表连接查询和子查询
很多时候,我们需要选择的数据并不是来自一个表,而是来自多个表,这就

需要使用多表连接查询。例如对于上面的student_table和teacher_table两

个数据表,如果我们希望查询出所有学生以及他的老师名字,这就从两个表

中取数据。
多表连接查询有两种规则,较早的SQL92规范支持如下几种多表连接查询:
1.等值连接。
2.非等值连接。
3.外连接。
4.广义笛卡儿积。
SQL99规则提供了可读性更好的多表连接语法,并提供更多类型的连接查询

,SQL99支持如下几个多表连接查询:
1.交叉连接。
2.自然连接。
3.使用using子句连接。
4.使用on子句的连接
5.全外连接或左右连接。

SQL92的多表连接语法比较简洁,这种语法把多个数据表放在from之后,多
个表之间以逗号隔开;连接条件放在where之后,与查询条件之间用and逻辑
运算符连接。如果连接条件要求两列值相等,则称为等值连接;否则称为非
等值连接,如果没有任何连接条件,则被称为广义笛卡儿积。SQL92中多表
连接查询的语法格式如下:
select column1,column2...
from table1,table2...
[where join_condition]

多表连接查询中可能出现两个或多个数据列具有相同的列名,则需要在这些
同名列之间使用表名或表别名前缀作为限制,避免系统混淆。
注:实际上所有的列都可以增加表名或前缀,只是进行单循环时绝不可能出
现同名列,所以系统不可能混淆。所以通常省略表名前缀。
如下SQL语句查询出所有学生资料以及对应的老师姓名:
select s.*, teacher_name
--指定多个数据表,并指定表列名
from studnet_table s, teacher_table t
--使用where指定连接条件
where s.java_teacher = t.teacher_id;


如果求广义笛卡尔积,则where子句后没有任何连接条件,则广义笛卡尔积
的结果会有n*m条记录。只要把where后的连接条件去掉就可以得到广义笛卡
尔积,如:
select s.*, teacher_name
--指定多个数据表,并指定表列名
from studnet_table s, teacher_table t;
与此类似的,非等值连接的执行如下:
select s.*, teacher_name
--指定多个数据表,并指定表列名
from studnet_table s, teacher_table t
--使用where指定连接条件
where s.java_teacher > t.teacher_id;


如果还需要对记录进行过滤,则将过滤条件和连接条件使用and连接,如下
select s.*, teacher_name
--指定多个数据表,并指定表列名
from studnet_table s, teacher_table t
--使用where指定连接条件
where s.java_teacher = t.teacher_id and student_name is not null;


MySQL不支持SQL92中左外连接、右外连接,但我们还有必要了解一下SQL92
中左外连接。右外连接,SQL92中的外连接就是在连接条件的列名后增加括
号包起来的外连接符(+或*,不同的数据库有一定的区别),当外连接符出
现在左侧时称为左外连接符,出现在右侧时则称为右连接符。
除此之外,还有一种自连接:自连接只是连接的一种用法,并不是一种连接
类型,不管SQL92,还是SQL99都可以使用自连接查询。
create table emp_table
(
	emp_id int auto_increment primary key,
	emp_name varchar(255),
	manager_id int,
	foreign key(manager_id) references emp_table(emp_id)
);

insert into emp_table values(null, '唐僧', null);
insert into emp_table values(null, '孙悟空', 1);
insert into emp_table values(null, '猪八戒', 1);
insert into emp_table values(null, '沙僧', 1);


所谓自连接就是需要把一个表当成两个表来用,这就需要为一个表起两个别
名,而且查询中用的所有数据列都要加表别名前缀,因为两个表的数据列完
全相同,例:
select emp.emp_id, emp.emp_name 员工名, mgr.emp_name 经理名
from emp_table emp, emp_table mgr
where emp.manager_id = mgr.emp_id;


SQL99的连接查询
SQL99的连接查询与SQL92的连接查询原理基本相似,不同是SQL99连接查询
的可读性更强:查询用的多个数据表显式使用xxx join连接,而不是直接依
次排列在from之后,from后只需要放一个数据表;连接条件不再放在where
之后,而是提供了专门的连接条件子句。
交叉连接:cross join,交叉连接效果是SQL92中的广义笛卡儿积,所以交
叉连接无需使用任何连接条件,例:
自然连接:natural join,自然连接表面上看起来也无需指定连接条件,但
自然连接是有连接条件的,自然连接会以连个表中同名列作为连接条件;如
果两个表中没有同名列,则自然连接与交叉连接效果完全一样-因为没有连
接条件。

select s.*, teacher name
from student_table s
natural join teacher_table t;


on子句连接:这是最常用的连接方式,SQL99语法的连接条件放在on子句中
指定,而且每个on子句只指定一个连接条件。这意味着:如果需要进行N表
连接,则需要有N-1个join...on对,如下:
select s.*, teacher_name
from student_table s
join teacher_table t
on s.java_teacher = t.teacher_id;


使用on子句的连接完全可以代替SQL92中的等值连接、非等值连接,因为on
子句的连接条件除了等值条件之外,也可以是非等值条件
select s.*, teacher_name
from student_table s
join teacher_table t
on s.java_teacher > t.teacher_id;


子查询
子查询就是指在查询语句中嵌套另一个查询,子查询可以支持多层嵌套。对
于一个普通查询语句而言,子查询可以出现在两个位置:
1.出现在from语句后当成数据表,这种用法也被称为行内视图,因为该子查
询实质上就是一个临时视图。
2.出现在where条件后作为过滤条件的值。
使用子查询时有如下几个注意点:
1.子查询要用括号括起来。
2.子查询当成数据表时(出现在from后),可以为该子查询起别名,尤其是要
作为前缀来限定数据列时,必须给子查询起别名。
3.子查询当过滤条件时,将子查询放在比较运算符的右边,这样可以增强查
询的可读性。
4.子查询当过滤条件时,单行子查询使用单行运算符,多行子查询使用多行
运算符。

对于子查询当数据表是完全把子查询当数据表来用,只是把之前的表名变成
查询(也可以为子查询起别名),其他部分与普通查询没有任何区别,下面
SQL语句示范了把子查询当成数据表的用法:
select *
from (select * from student_table) s
where s.java_teacher > 1;


子查询当数据表的用法更确切地说当成视图,我们可以吧上面SQL语句理解
成在执行查询时创建了一个临时视图,该视图名为t,所以这种临时创建的
视图也被称为行内视图,理解了这种子查询的实质后,不难知道这种子查询
完全可以代替查询语句中的数据表,包括在多表连接查询中使用这种子查询

还有一种情况,我们可以把子查询当成where条件的值,如果子查询返回单
行、单列值,则被当成一个标量使用,也就可以使用单行记录比较运算符。
如:
select *
from student_table
where java_teacher >
--返回单行、单列的子查询可以当成标量值使用
(select teacher_id
from teacher_table
where teacher_name = 'Yeeku');


如果子查询返回多个值,则需要使用in、any和all等关键字,in可以单独使
用,此时可以把子查询返回的多个值当成一个值列表,如下SQL语句所示:
select * 
from student_table
where student_id in
(select teacher_id
from teacher_table);

上面查询语句中的子查询将返回多个值,这多个值将被当成一个值列表,只
要sudent_id与该值列表中任意一个相等,就可以选出这条记录。
0
0
分享到:
评论

相关推荐

    sql server 基础语法

    SQL Server 基础语法 SQL Server 是一种关系数据库管理系统,提供了强大的数据存储和管理功能。 SQL Server 的基础语法包括数据定义、数据操纵和数据控制三个方面。 1. 数据定义功能 数据定义功能是 SQL Server ...

    易飞SQL常用基础语法

    易飞SQL常用基础语法易飞SQL常用基础语法易飞SQL常用基础语法易飞SQL常用基础语法

    SQL基础语法

    ### SQL基础语法详解 #### 一、数据定义语言(Data Definition Language, DDL) 在数据库管理系统中,数据定义语言主要用于创建、修改或删除数据库对象,如表、索引等。以下是一些常用的DDL命令及其解释。 ##### ...

    SQL基础语法和高级语法示例

    SQL基础语法和高级语法示例 SQL基础语法和高级语法示例

    SQL语法,SQL语句大全,SQL基础

    ### SQL语法、SQL语句大全及SQL基础知识 #### 一、SQL简介 SQL(Structured Query Language)是一种用于管理关系数据库的标准编程语言。SQL最初由IBM研发,并在1970年代后期作为SEQUEL(Structured English Query ...

    sql基础语法考试必备小抄

    ### SQL基础语法考试必备知识点 #### 一、SQL简介 SQL(Structured Query Language)是一种用于管理关系数据库的标准语言。它提供了强大的数据操作能力,包括数据查询、数据定义、数据操纵和数据控制等功能。 ####...

    SQL语句大全、SQL基础、SQL基本语法

    #### 一、基础知识 1. **创建数据库** - **语法**: `CREATE DATABASE database-name;` - **说明**: 此命令用于创建一个新的数据库。`database-name`应替换为实际想要创建的数据库名称。 2. **删除数据库** - **...

    SQL 语法 SQL 总结 SQL教程

    SQL 基础 SQL 首页 SQL 简介 SQL 语法 SQL select SQL distinct SQL where SQL AND & OR SQL Order By SQL insert SQL update SQL delete SQL 高级 SQL Top SQL Like SQL 通配符 SQL In SQL Between ...

    SQL语法教学课件

    适合教学使用的SQL语法课件,内容相对精炼。

    SQL基础语法讲解以及常用函数

    ### SQL基础语法与常用函数详解 #### 一、SQL基础语法概述 SQL(Structured Query Language,结构化查询语言)是一种用于管理关系数据库的标准语言。它主要用于处理存储在关系数据库管理系统中的数据,支持数据...

    SQL Server基础语法

    在SQL Server中,基础语法主要涵盖以下几个方面: 1. **数据查询**:SQL的基础是SELECT语句,用于从数据库中检索数据。例如,`SELECT * FROM Customers`将获取Customers表中的所有记录。通过指定列名、使用WHERE...

    SQL基本语法知识

    在这个“SQL基本语法知识”中,我们将深入理解SQL的一些核心概念和基本语法。 首先,数据库是组织和存储数据的系统,而表则是数据库中的基本单元,用于存储具体的信息。例如,描述中的"Persons"表,包含ID、Last ...

    SQL语句之基础语法汇总

    "SQL语句之基础语法汇总" SQL语句之基础语法汇总是一篇详细的SQL语句基础知识总结,包括创建表、修改表、删除表、添加数据、更新数据、删除数据等基础语法。下面是对该篇文章的知识点总结: 一、创建表、修改表、...

    sql基础语法示例 标准sql

    总结来说,这个SQL基础语法示例教程涵盖了创建表、插入数据、更新数据和删除数据等核心操作,是初学者学习SQL的绝佳起点。通过深入理解和实践这些基本语句,你将能够有效地管理和操纵数据库,为你的IT职业生涯打下...

    SQL基础SQL语法

    SQL(Structured Query ...总结,SQL是数据库管理和分析的核心,熟练掌握其基础语法和常见用法是每个IT专业人员的必备技能。通过学习提供的PDF文档,你可以深入理解SQL Server的具体应用,并提升你的SQL编程能力。

    sql大学讲义(比较全的sql基础语法)

    SQL,即Structured Query Language...掌握这些SQL基础语法和RDB基本概念是理解和操作关系数据库的关键,无论你是初学者还是经验丰富的开发人员,都需要深入理解这些知识点,以便在实际工作中有效地进行数据管理和分析。

    Oracle sql基础语法

    Oracle SQL是用于管理和操作Oracle...以上是Oracle SQL基础语法的一些关键概念,通过实践和学习,你可以逐步掌握这个强大的查询语言,并有效管理Oracle数据库。记住,实践中遇到的问题和解决方案往往是学习的最佳途径。

    Visual FoxPro中SQL命令语法及示例

    ### Visual FoxPro中SQL命令语法及示例 #### 1. 准备 - **1.1 创建文档中所要使用到的数据库及环境配置** 在开始学习Visual FoxPro (VFP) 中的SQL命令之前,需要创建一个用于演示的基础数据库环境。以下是创建...

    sql/sql语法基础手册

    4. **数据查询**:SQL的基础在于查询数据,`SELECT`语句是核心。通过组合`SELECT`、`FROM`、`WHERE`、`GROUP BY`、`HAVING`、`ORDER BY`等子句,可以实现复杂的数据过滤、分组、排序和聚合。 5. **数据插入**:使用...

    SqlParser C++实现的SQL语法解释器

    在数据库系统中,SQL(Structured Query Language)是用于管理关系数据库的标准语言,而词法分析和语法分析是编译原理中的基础概念,对于理解SqlParser的工作原理至关重要。 首先,我们来谈谈SQL。SQL包含了数据...

Global site tag (gtag.js) - Google Analytics