sql多表查询as
Ⅰ sql多表查询详解
本教程为大家介绍SQL中的多表查询,下面我们来看看具体实例吧。
新建两张表:
表1:student 截图如下:
表2:course 截图如下:
(此时这竖轿派样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。)
一、外连接
外连接可分为:左连接、右连接、完全外连接。
1、左连接 left join 或 left outer join
SQL语句:select * from student left join course on student.ID=course.ID
执行结果:
左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL).
注:此时我们不能说结果的行数等于左表数据的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。
2、右连接 right join 或 right outer join
SQL语句:select * from student right join course on student.ID=course.ID
执行结果:
右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)。
注:同样此时我们不能说结果的行数等于右表的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。
3、完全外连接 full join 或 full outer join
SQL语句:select * from student full join course on student.ID=course.ID
执行结果:
完全外连接包含full join左右两表中所有的行,如余贺果右表中某行在左表中帆衡没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL)。
二、内连接 join 或 inner join
SQL语句:select * from student inner join course on student.ID=course.ID
执行结果:
inner join 是比较运算符,只返回符合条件的行。
此时相当于:select * from student,course where student.ID=course.ID
三、交叉连接 cross join
1.概念:没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
SQL语句:select * from student cross join course
执行结果:
如果我们在此时给这条SQL加上WHERE子句的时候比如SQL:select * from student cross join course where student.ID=course.ID
此时将返回符合条件的结果集,结果和inner join所示执行结果一样。
四、两表关系为一对多,多对一或多对多时的连接语句
当然上面两表为一对一关系,那么如果表A和表B为一对多、多对一或多对多的时候,我们又该如何写连接SQL语句呢?
其实两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的结果不一样,当然两表也要略有改动。
比如表1的列可以改为:
Sno Name Cno
表2的列可以改为:
Cno CName
这样两表就可以写一对多和多对一的SQL语句了,写法和上面的一对一SQL语句一样。
下面介绍一下当两表为多对多的时候我们该如何建表以及些SQL语句。
新建三表:
表A: student 截图如下:
表B: course 截图如下:
表C: student_course 截图如下:
一个学生可以选择多门课程,一门课程可以被多个学生选择,因此学生表student和课程表course之间是多对多的关系。
当两表为多对多关系的时候,我们需要建立一个中间表student_course,中间表至少要有两表的主键,当然还可以有别的内容。
SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno
执行结果:
此条SQL执行的结果是学生选课的情况。
Ⅱ sql多表联合查询步骤是什么
a.noas学生ID
,a.nameas学生名字
,c.subnameas科目名称
,b.scoreas学生成绩
fromAaleftjoinBbona.no=b.noleftjoinConb.subid=c.subid
结构化查询语言(StructuredQueryLanguage)简称SQL,是一种特殊目的的编程语言,是一种数据羡竖漏库查询和程序设计语言,用于兄烂存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。
结构化查询语言语句可以嵌套,这使它具纤拍有极大的灵活性和强大的功能。
Ⅲ sql语句多表联查时怎么用as出的字段进行查询
as 加在前面磨粗 select planname as planname from、、、、
但是你这个语句有问题空野,多表联查不是这么查询的,并且你没有斗游喊链接语句呀
Ⅳ 多表联合查询SQL语句
1,Cab.scoreleftc;as科目名称.subname .nob;b;asfromas= .nobleft学生名字。
2,a;joinB ,a;joinA ,onas ,c.name学生ID;= select学生成绩on&碰清轿nbsp.subida.no&笑肆nbsp。
Ⅳ sql数据库多表查询(sql数据库多表查询示例)
可以有两种处理方法,1、两表先合并,后求和
select日期,sum(数值)as数值from
(select日期,金额薯局祥as数值fromA表
unionall
select日期,数量as数值fromB表)
groupby日期
2、先求和后合并,再求和
select日期,sum(数值)as数值from
(select日期,sum(金额)as数值fromA表groupby日期
unionall
select日期,sum(数量)as数值fromB表groupby日期)
groupby日期
对于“如果要实现总和的相乘、相除,或者相减得话,应该怎么写呢?”,你得提出明确需求,那后才能设计。
如果数搏是相乘、相除,或者相减,得有条件,还像上面,用日期关联,A表-B表,A表求和:select日期,sum(金额)as数值fromA表groupby日期
B表求和:select日期,sum(数量)as数值fromB表groupby日期
在执行A表-B表时,由于用日期关联,则某一日期对应的记录可能会产生三种情况:A表B表都有;A表有B表无;A表无B表有。
1、需要先找出所有日期,select日期fromA表
union
select日期fromB表
2、对于A表中所有数据以上表中日期为依据构造所有相关日期数据,如果有日期数据,则为原数腊桥据,否则为0。
selecta.日期as日期,casewhenb.数值isNULLthenb.数值else0endas数值
from
(select日期fromA表
union
select日期fromB表)a
leftjoin
(select日期,sum(金额)as数值fromA表groupby日期)b
ona.日期=b.日期
3、同样对于B表也如此。
4、2表相减即得。
selecta3.日期as日期,a3.数值-b3.数值as数值
from
(
selecta1.日期as日期,casewhenb1.数值isNULLthenb1.数值else0endas数值
from
(select日期fromA表
union
select日期fromB表)a1
leftjoin
(select日期,sum(金额)as数值fromA表groupby日期)b1
ona1.日期=b1.日期
)a3,(
selecta2.日期as日期,casewhenb2.数值isNULLthenb2.数值else0endas数值
from
(select日期fromA表
union
select日期fromB表)a2
leftjoin
(select日期,sum(金额)as数值fromB表groupby日期)b2
ona2.日期=b2.日期
)b3
wherea3.日期=b3.日期
当然,以上只是一种方法,还有其他方法也可以实现,尽供参考。
Ⅵ SQL多表查询
如果账户信闭卜息表账户名是唯一标识的话需要在别的消费信派态握息单里设置账户名字段为外键,然后创建一个视图,create or replace view 已缴费视图 as select * 或 账户名 from 账户表,水费,车费 where 水费.缴费状态 =’已缴费’ and 车费.缴费状态=‘已尘庆缴费’ and 水费.账户名=账户表.账户名 and 车费.账户名 = 账户表.账户名。创建完成之后,可以随时查询视图来查看车费水费全都以缴费名单。
Ⅶ SQL多表链接查询、嵌入SELECT语句的子查询技术
高级查询技术主要是涉及多个表的链接查询技术 嵌入SELECT语句的子查询技术 把多个查询联合起来的联合技术等
连接查询
需要同时从两个或者连个以上的表中检索数据 链接就是允许同时从两个表或者两个以上的表中检索数据 指定这些表中的某个或者某些列作为连接条件 在SQL Server中 可以使用两种连接语法的形式 一种是ANSI链接语法形式 这是连接条件出现在FROM子句中;另外一种SQL Server链接语法形式 这是连接条件出现在WHERE条件中
ANSI链接
链接错做可以同时查询两个或者多个表中的数据 所生成的结果集包含多个表中的字段 需要使用连个表 *** 同拥有的字段以连接多个表
进行连接操作时 SQL一行一行地比较所指定的字段 然后把比较后的结果和满足条件的数据合并 并生成新的记录
有三种连接方吵差式 内连接 外连接和交叉连接 在一个SELECT语句中 可以连接多个表;链接通过扩展SELECT语句的FROM字句 增加了两个关键字 JOIN和ON
JOIN 指定要了链接的表
ON 指定这些表共同拥有的字段
在表的主键和外部键的基础上 指定连接条件
ANSI链接语法形式如下所示
SELECT table_name column_name table_name column_name ……
FROM { table_name[ join_type] JOIN table_name ON search_conditions}
WHERE[ search_conditions]
其中[ join_type ]可以为如下三个关键字形式
INNER(内连接) 链接查询结果集中仅包含满足条件的行 内连接是SQL Server缺省的连接方式 可以把INNER JOIN简写成 JOIN;
OUTER(外连接) 链接查询结果集中既包含哪些满足条件的行 还包含其中某个表的全部行 有三种形式的外连接 左外连接 右外连接 全外连接
例如 已经选修了 号课程的同学信息的示例 该示例涉及到此枯了学生表和选修课
SELECT 学生表
FROM 学生表 JOIN 选课表 ON 学生表 学号 选课表 学号
WHERE 选课表 课程号=
SQL Server链接
多表连接 可以在FROM子句后直接指定多个表 语义上表示从这几个表的笛卡尔积中检索数据 可以用WHERE子句设定过滤条件
SQL Server链接语法形式如下
SELECT table_name column_name table_name column_name ……
FROM { table_name table_name ……}
WHERE table_name column_name join_operator table_name column_name
在此种语法形式中 FROM子句列出了连接时所使用到的全部表名 WHERE子句指定哪些行应该出现在结果集中 即用WHERE子句设定过滤条件 在WHERE子句中 在两个连接的列中使用链接运算符
例如 检索出至少已经有一门课程及格的同学的信息示例
SELECT DISTINCT 学生表 *
FROM 学生表 选课表
WHERE 学生表 学号=选课表 学号 AND 选课表 成绩=
子查询
子查询是一系列SELECT语句 SELECT语句可以嵌套在其他许多语句中 例如SELECT INSERT UPDATE DELETE等 这些嵌套的SELECT语句就称为子查询 子查询可以把一个复杂的查询分解成一系列的逻辑步骤 这样就可以用一个单个的语句解决一个复杂的查询问题 当一个查询依赖于另一个查询的结果时 子查询会很有用
升扒皮使用子查询时 应注意
子查询要用括号起来
只需要一个值或一系列的值 就可以用子查询代替一个表达式
子查询中不能查询包含数据类型是text或image的字段
子查询中也可以再包含子查询 嵌套可以多至 层
把子查询用作派生的表
可以用子查询产生一个派生的表 用于代替FROM子句中的表 派生表示FROM子句中子查询的一个特殊用法 用一个别名或用户自定义的名字来引用这个派生表 FROM子句中的子查询将返回一个结果集 这个结果集所形成的表将被外层SELECT语句使用
例如 内层查询用子查询产生了一个派生的表 外层查询将使用内层查询的结果集 在功能上 派生表本身就等同于一个完整的查询
SLECT A *
FROM select 学号 姓名 年龄 from 学生表
Where 班级=‘GZ 计 ’ as a
把子查询用作表达式
在T SQL中 所有使用表达式的地方 都可以用子查询来代替 此时子查询必须返回单个的值或某一个字段的值 子查询可以返回一系列的值来代替出现在WHERE子句中的IN关键字的表达式
例如 查询GZ 计 班同学的平均年龄以及每个同学年龄与平均年龄的差
SELECT avg(年龄) FROM 学生表 as 平均年龄
其计算结果作为选择列表中的一个输出列 并作为算术表达式的一部分输出
年龄 (SELECT avg(年龄) FROM 学生表) as 年龄差
相关子查询
相关子查询可被用作动态表达式 这个表达式的值相对于外层查询的每一行而变化 查询处理器为外层查询的每一个记录计算子查询的值 一次一行 而这个子查询每次都会被作为一个表达式而被计算并返回给外层查询 相关子查询是动态执行的子查询和外层查询间的一个非常有效的联合
使用相关子查询时 内层子查询被反复执行 外层查询有多少记录 内层查询就被齿形多少次
例如 查询已选修课程号的 且成绩在 分以上的同学的学号及姓名
SELECT 学号 姓名
FROM 学生表
WHERE <=( SELECT 成绩
FROM 选课表
WHERE 学生表 学号=选课表 学号 AND 课程号= )
使用EXISTS和NOT EXISTS操作符
在相关子查询中可以使用EXISTS和NOT EXISTS操作符判断某个值是否在一系列的值中 SQL Server处理带有EXISTS和NOT EXISTS操作符的子查询时
外层查询测试子查询返回的记录是否存在
基于查询所指定的条件 子查询返回TRUE或FALSE
子查询不产生任何数据
例如 同时选修了 号课程和 号课程的同学的信息
SELECT 学号 姓名 班级
FROM 学生表
WHERE EXISTS(SELECT * FROM 选课表
WHERE 学号=学生表 学号 AND 课程号= )
AND EXISTS(SELECT * FROM 选课表
WHERE 学号=学生表 学号 AND 课程号= )
① 找外层表“学生表”的第 行 根据其“学号”值处理内层查询
② 用外层的“学号”与内层表“选课表”的“学号”比较 由此决定外层条件的真 假 如果为真 则此记录为符合条件的结果 反之 则不输出
③ 顺序处理外层表“学生表”中的第 行
检索出每一门选修课都几个的同学信息
SELECT * FROM 学生表 WHERE
NOT EXISTS( SELECT * FROM 选课表
WHERE 学生表 学号=选课表 学号 AND 成绩< )
AND EXISTS( SELECT * FROM 选课表
WHERE 学生表 学号=选课表 学号)
使用TOP限制结果集
在使用SELECT语句进行查询时 有时我们希望列出前几个结果 而不是全部结果 例如 竞赛时 可能只取成绩最高的前三名 这时就需要使用TOP关键字来选取输出的结果
使用TOP的格式为
SELECT TOP n[ percent] [with ties] 查询列表
其中
n 为非负整数
TOP n 表示取查询结果的前n行
TOP n percent 表示取查询结果的前n%行
With ties 表示包括并列的结果
例如 检索出总分在前 位的同学的学号及其总分
SELECT TOP WITH TIES 学号 SUM(成绩) AS 总分
FROM 选课表
GROUP BY 学号
ORDER BY 总分 DESC
使用TOP时 注意最好与ORDER BY子句一起使用 因为这样的前几名才有意义 但当使用WITH TIES时 要求必须使用ORDER BY子句
合并多个结果集
可以将两个或多个查询的结果组合为一个结果集 这就是合并多个届国际的含义 使用UNION可以实现合并多个查询结果集的目的 作用UNION的格式为
SELECT 语句
UNION
SELECT 语句
UNION [ALL]
……
SELECT 语句n
使用UNION 应注意几点
在默认情况下 UNION运算符删除全部空余 如果使用ALL选项 那么空余行不删除
所有查询语句中的列数和列的顺序必须相同
所有查询语句中的对应列的数据类型必须兼容
如果在UNION语句中 包含一个ORDER BY子句 那么整个结果集都要排序
在结果集中 列名来自第 个SELECT子句
例如 对GZ 计 班和GZ 计 班学生的查询结果合并为一个结果集
SELECT * FROM 学生表 WHERE 班级=‘GZ 计 ’
UNION
lishixin/Article/program/MySQL/201311/29530