sql学习总结(4)——SQL多表查询技术

4.1笛卡尔积

select 姓名,工资,城市 from 职工,仓库

仓库5条记录,职工表18条记录,结果18*5=90条记录。

职工表18个员工,仓库表5个仓库,即5个职工所在的城市,若要显示职工的姓名、工资及所在城市信息,结果应该为18条记录:

select 姓名,工资,城市 from 职工,仓库 where 职工.仓库号=仓库.仓库号

4.2带有运算符的多表查询

显示工资不在1500~2000之间,并且城市为空的职工姓名、工资及所在城市信息:

select 姓名,工资,城市, from 职工,仓库 where 职工.仓库号=仓库.仓库号and not(工资 between 1500 and 2000) and 城市 is null

4.3带有统计函数的多表查询

显示职工的姓名、工资、工资与平均工资之差及销售金额信息:

select 姓名,工资,工资-(select avg(工资) from 职工) as 与平均工资的差,金额 from 职工,订购单 where 职工.职工号=订购单.职工号

4.4带有谓词的多表查询

显示已有职工的仓库信息:

/*利用谓词IN实现*/

select * from 仓库 where 仓库号in(select 仓库号 from 职工)

/*利用谓词exists实现*/

select * from 仓库 where exists (select * from 职工 where 仓库号=仓库.仓库号)

4.5带有排序和分组的多表查询

显示wh1或wh2仓库中,工资不大于职工zg16的工资的职工信息,并要求职工姓名不含有“平”字,然后按工资从低到高显示:

select * from 职工 where 工资<=(select 工资 from 职工 where 职工号=’zg16’) and 姓名 not like ‘%平%’ and 仓库号 in(‘wh1’,’wh2’) order by 工资

显示同职工的姓名、平均销售金额和最大销售金额信息,条件是平均销售金额大于10000,最大销售金额大于16000:

select 姓名,avg(金额) as 平均金额,max(金额) as 最大金额 from 职工,订购单 where 职工.职工号=订购单.职工号 group by 姓名 having avg(金额)>10000 and max(金额)>16000

4.6多表嵌套查询

显示城市不在上海的职工信息:

select * from 职工 where 仓库号 in (select 仓库号 from 仓库 where 城市!=’上海’)

显示不同仓库职工的平均销售金额和仓库号信息,条件是平均销售金额大于15000或最大销售金额小于18000、工资大于仓库面积大于800的所有职工的平均工资:

select 仓库号,avg(金额) as 平均金额 from 职工,订购单 where 职工.职工号=订购单.职工号 and 工资>(select avg(工资) from 职工 where 仓库号 in(select 仓库号 from 仓库 where 面积>800) group by 仓库号 having avg(金额)<15000 or max(金额)<18000

4.7超连接查询

包括:内连接(inner join)、左连接(left join)、右连接(right join)、全连接(full join)

时间: 2024-12-15 02:36:05

sql学习总结(4)——SQL多表查询技术的相关文章

SQL学习系列(一)之多表查询

在数据库中,各个表之间存在一定的联系,如果需要对数据进行一系列的查询是,仅仅从一个表或一个库中获得数据信息是不够的,需要从多个表或多个数据库提取所需要的数据信息,而进行一些简单select语句查询是无法满足用户需求的,这时就需要涉及到高级查询. 以下都用A.B代表数据库表. 1.内连接查询-内连接使用比较运算符对各个表中的数据进行比较操作,并列出各个表中与条件相匹配的所有数据行. 关键字:INNER JOIN或JOIN (1).等值连接 语句格式:select a * ,b * from A a

SQL总结(二)连表查询

SQL总结(二)连表查询 连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要. 只有真正了解它们之间的区别,才能正确使用. 1.Union UNION 操作符用于合并两个或多个 SELECT 语句的结果集. UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. 当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行.两种情况下,派生表的每一行不是来自 TABLE1 就是

MyBatis学习总结(五)——实现关联表查询(转载)

孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(五)--实现关联表查询 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TAB

SQL判断语句用法和多表查询

1.格式化时间sql语句 本例中本人随便做了两张表,和实际不是很相符,只是想说明sql语句的写法. 例1表格式如下: 需求:查询出本表,但需要使time字段的时间格式为yyyy-MM-dd,比如:2013-08-13 sql写法: SELECT u.id,u.userId,u.timeType,DATE_FORMAT(time,'%Y-%m-%d') AS time,secondId FROM `user` u 运行结果: 2.多表查询(三表查询) 例二三表结构如下: 需求:查询出主表,要求在主

Hibernate使用原生SQL语句进行无关联多表查询

背景:有两个表:CpCg与CpGg需要进行多表查询 因为CpGg表设计到与另外的表也有联系,因此师兄没有关联此两个表,只是用字段进行逻辑关联,CpGg表的cp字段与CpCg表的id字段逻辑关联 首先确保hibernate配置文件配置完成,配置文件如下:(一些与本人项目相关的关键字段已隐去) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC

MyBatis学习总结(五)——实现关联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VA

MyBatis学习总结_05_实现关联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. 1 CREATE TABLE teacher( 2 t_id INT PRIMARY KEY AUTO_INCREMENT, 3 t_name VARCHAR(20) 4 ); 5 CREATE TABLE class( 6 c_id INT PRIMARY KEY AUTO_INCREMEN

数据库(学习整理)----7--Oracle多表查询,三种join连接

聚合函数:(都会忽略null数据) 常用的有5种:将字段中所有的数据聚合在一条中 1.sum(字段名) :求总和 2.avg(字段名) :求平均值 3.max(字段名) :求最大值 4.min(字段名) :求最小值 5.count(字段名.*) :统计行数 ----2.按部门编号,查询平均薪水 ,并且平均薪水<1300的不显示,结果按降序排序 select empno,avg(sal) as avgsal from scott.emp group by empno having avg(sal)

MyBatis学习笔记五——实现关联表查询

一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系. CREATE TABLE teacher( t_id INT PRIMARY KEY AUTO_INCREMENT, t_name VARCHAR(20) ); CREATE TABLE class( c_id INT PRIMARY KEY AUTO_INCREMENT, c_name VA