多表数据记录查询

时间:2022-12-03 07:58:02 其他范文 收藏本文 下载本文

多表数据记录查询(集锦6篇)由网友“小母”投稿提供,以下是小编为大家准备了多表数据记录查询,欢迎参阅。

多表数据记录查询

篇1:多表数据记录查询

1、关系数据的各种操作

并(union)

把相同字段数目和字段类型的表合并到一起

笛卡尔积(cartesian product) 内连接 inner jion 所谓连接就是在表关系的笛卡尔积数据记录中,按照相应字段值的比较条件进行选择生成一个新的关系,

多表数据记录查询

。连接又分为内连接,外连接,交叉连接。 内连接:在表关系的笛卡尔积数据记录中,保留表关系中所有匹配的数据记录,舍弃不匹配的数据记录。 按照匹配的条件可以分成自然连接,等值连接,和不等连接 自然连接:表关系的笛卡尔积中,首先根据表关系中相同名称的字段自动进行记录匹配,然后去掉重复的字段。 等值连接表关系的笛卡尔积中,选择所匹配字段值相等(=符号)的数据记录。 不等连接表关系的笛卡尔积中,选择所匹配字段值(!=)的数据记录。 外连接 outer jion 在表关系的笛卡尔积数据记录中,不仅保留表关系中所有匹配的数据记录,而且还会保留部分不匹配的数据记录。 按照保留不匹配条件数据记录来源可以分为:left outer union,right outer union ,full outer jion 左连接:表关系的笛卡尔积中,除了选择相匹配的数据记录,还包含关联左边表中不匹配的数据记录。 右连接:表关系的笛卡尔积中,除了选择相匹配(相等)的数据记录,还包含右边表中不匹配的数据记录。 全连接:表关系的笛卡尔积中,除了选择相匹配(相等)的数据记录,还包含左右表中不匹配的数据记录。 交叉连接 cross jion2、内连接查询 1、在from子句里利用逗号(,)区分多个表,在where子句里通过逻辑表达式来实现匹配条件,从而实现表的连接 2、ANSI连接语法形式,在from子句中使用“jion...on”关键字,而连接条件写在关键字on子句里,这是推荐使用的连接语法。 select field1,...,fieldn from join_tablename1 inner join join_tablename2 [inner join join_tablenamen] on join_condition *等值连接 自连接:一种特殊的等值连接,自身与自身连接 为表取别名机制select field1,...,fieldn [AS] otherfieldn from tablename1 [as] othertablename1,...,tablenamen [AS] othertablenamen *不等连接 可以使用的关系运算符包含“>” “>=” “<” “<=” “!=”3、外连接查询 select field1,...,fieldn from join_tablename1 left|right|full [outer] join join_tablename2on join_condition 左外连接 新关系中执行匹配条件时,以关键字left join左边的表为参考表 select e.ename empolyee,e.job,l.ename leaderfrom t_emplyee e left outer join t_employee l on e.mgr=l.ename; +--------------+-----------+--------+ | employe| job | leader | +--------------+-----------+--------+ | smith | clerk | ford | | alen | salesman | black | | ward | salesman | black | | jones | manager | king | | martin | salesman | black | | ford | analyst | jones | | black | manager | ford | | king | president | NULL | +--------------+-----------+--------+ 8 rows in set (0.00 sec) select e.ename empolyee,e.job,l.ename leaderfrom t_emplyee e inner join t_employee l on e.mgr=l.ename; +--------------+----------+--------+ | employee | job| leader | +--------------+----------+--------+ | ford | analyst | jones | | smith | clerk | ford | | black | manager | ford | | alen | salesman | black | | ward | salesman | black | | martin | salesman | black | | jones | manager | king | +--------------+----------+--------+ 7 rows in set (0.00 sec) 观察发现:虽然等值连接sql语句也显示出雇员的相应信息,但是没有显示出雇员为king的信息。 右外连接 新关系中执行匹配条件时,以关键字right join右边的表为参考表4、合并查询数据记录 select field1 field2,...,fieldn from tablename1union |union all select field1 field2 ... fieldn from tablename2union | union all select field1 field2 ... fieldn from tablename3... 通过union来实现并操作,即可通过其将多个select语句的查询结果合并在一起组成新的关系。 例: mysql>create table t_cstudent( ->name varchar(20), ->sex varchar(5)); Query OK, 0 rows affected (0.09 sec) mysql>create table t_mstudent( ->name varchar(20), ->sex varchar(5)); Query OK, 0 rows affected (0.07 sec)创建两张表,t_cstudent,t_mstudent select * from t_cstudent; +----------+-------+ | name | sex | +----------+-------+ | ccjgong1 | man | | ccjgong2 | woman | | ccjgong3 | man | | ccjgong4 | woman | | ccjgong5 | woman | | cmcjgong | man | +----------+-------+ select * from t_mstudent; +----------+-------+ | name | sex | +----------+-------+ | cmcjgong | man | | mcjgong1 | women | | mcjgong2 | man | | mcjgong3 | man | | mcjgong4 | woman | | mcjgong5 | woman | +----------+-------+ select * from t_cstudentunion select * from t_mstudent +----------+-------+ | name | sex | +----------+-------+ | ccjgong1 | man | | ccjgong2 | woman | | ccjgong3 | man | | ccjgong4 | woman | | ccjgong5 | woman | ********| cmcjgong | man |******* | mcjgong1 | women | | mcjgong2 | man | | mcjgong3 | man | | mcjgong4 | woman | | mcjgong5 | woman | +----------+-------+ 执行结果显示出合并后的数据记录,同时去除了重复数据记录,使新关系里没有任何重复的数据记录。 通过union all 把查询结果集直接合并在一起。 select * from t_cstudentunion all select * from t_mstudent +----------+-------+ | name | sex | +----------+-------+ | ccjgong1 | man | | ccjgong2 | woman | | ccjgong3 | man | | ccjgong4 | woman | | ccjgong5 | woman | ********| cmcjgong | man |******** ********| cmcjgong | man |******** | mcjgong1 | women | | mcjgong2 | man | | mcjgong3 | man | | mcjgong4 | woman | | mcjgong5 | woman | +----------+-------+ 与union相比,执行结果成功显示出合并后的数据记录,但是没有去掉了重复数据记录,即新关系里存在重复的数据记录 5、子查询 在mysql中虽然可以通过连接查询实现多表查询数据记录,但是不建议使用。这是因为连接查询的性能很差。因此出现了连接查询的替代者子查询。在具体应用中,mysql软件推荐使用子查询来实现多表查询数据记录。 两个表执行查询时,会对表先进行笛卡尔积,然后再选取符合匹配条件的数据记录。进行笛卡尔积操作时,会生成两个数表数据记录的乘积条数据记录,如果这两张表的数据记录比较大,则在进行笛卡尔积操作时就会造成死机。 对于有经验的用户,首先会通过count函数来统计操作表笛卡尔积后的数据记录数,然后才会进行多表查询,因此多表查询一般会经过如下步骤: 1、通过统计函数查询所关联表笛卡尔积后的数据记录数: select count(*) from t_dept,t_employee 2、如果查询到的数据记录数mysql软件可以接受,然后进行多表连接查询,否则就应该考虑通过其他方式来实现。 3、如果数据记录数mysql不能接受,则使用子查询来实现多表查询。 子查询:就是在一个查询之中嵌套了其他的若干查询,即在select查询语句的where或from子句中包含另一个select查询语句。在查询语句中,外层的select查询语句成为主查询,where子句中的select查询语句被称为子查询,也被称为嵌套查询。 通过子查询可以实现多表查询,该查询语句中可能包含in,any,all,exist等关键字,除此之外还可能包含比较运算符。理论上子查询可以出现在查询语句的任意位置,但是在实际开发中,子查询经常出现在where和from中 where:该位置的子查询一般返回单行单列,多行单列,单行多列数据记录 from:该位置的子查询一般返回多行多列数据记录,可以当做一张临时表 +-------+--------+-----------+------+---------------------+---------+--------+--------+ | empno | ename | job | mgr | hiredate| sale | comm | deptno | +-------+--------+-----------+------+---------------------+---------+--------+--------+ | 7369 | smith | clerk | 7902 | 1981-03-12 00:00:00 | 800.00 | NULL | 20 | | 7499 | alen | salesman | 7698 | 1982-03-12 00:00:00 | 1600.00 | 300.00 | 30 | | 7521 | ward | salesman | 7698 | 1983-03-12 00:00:00 | 1250.00 | 500.00 | 30 | | 7566 | jones | manager | 7839 | 1981-03-12 00:00:00 | 2893.00 | NULL | 20 | | 7654 | martin | salesman | 7698 | 1981-03-12 00:00:00 | 1250.00 | NULL | 30 | | 7902 | ford | analyst | 7566 | 0000-00-00 00:00:00 | 3000.00 | NULL | 30 | | 7698 | black | manager | 7902 | 1981-03-02 00:00:00 | 2850.00 | NULL | 30 | | 7839 | king | president | NULL | 1981-03-12 00:00:00 | 5000.00 | NULL | 10 | +-------+--------+-----------+------+---------------------+---------+--------+--------+ a、返回结果为单行单列和单行多列子查询 1、返回结果为单行单列子查询select sale from t_employee where ename=‘smith‘;select * from t_employee where sale>( select salefrom t_employee where ename=‘smith‘);+-------+--------+-----------+------+---------------------+---------+--------+--------+| empno | ename | job | mgr | hiredate| sale | comm | deptno |+-------+--------+-----------+------+---------------------+---------+--------+--------+| 7499 | alen | salesman | 7698 | 1982-03-12 00:00:00 | 1600.00 | 300.00 | 30 || 7521 | ward | salesman | 7698 | 1983-03-12 00:00:00 | 1250.00 | 500.00 | 30 || 7566 | jones | manager | 7839 | 1981-03-12 00:00:00 | 2893.00 | NULL | 20 || 7654 | martin | salesman | 7698 | 1981-03-12 00:00:00 | 1250.00 | NULL | 30 || 7902 | ford | analyst | 7566 | 0000-00-00 00:00:00 | 3000.00 | NULL | 30 || 7698 | black | manager | 7902 | 1981-03-02 00:00:00 | 2850.00 | NULL | 30 || 7839 | king | president | NULL | 1981-03-12 00:00:00 | 5000.00 | NULL | 10 |+-------+--------+-----------+------+---------------------+---------+--------+--------+ 2、单行多列子查询where子句中的子查询除了是返回单行单列的数据记录外,还可以返回单行多列的数据记录,不过这种子查询很少出现mysql>select ename,sale,job -> from t_employee -> where (sale,job)=( -> select sale,job ->from t_employee ->where ename=‘smith‘);+-------+--------+-------+| ename | sale | job |+-------+--------+-------+| smith | 800.00 | clerk |+-------+--------+-------+ b、返回结果为多行单列子查询 当子查询的返回结果为多行单列数据记录时,该子查询语句一般会在主查询语句的where子句里出现,通常会包含in,any,all,exist等关键字 1、带有关键字in的子查询mysql>select * from t_employee;+-------+--------+-----------+------+---------------------+---------+--------+--------+| empno | ename | job | mgr | hiredate| sale | comm | deptno |+-------+--------+-----------+------+---------------------+---------+--------+--------+| 7369 | smith | clerk | 7902 | 1981-03-12 00:00:00 | 800.00 | NULL | 20 || 7499 | alen | salesman | 7698 | 1982-03-12 00:00:00 | 1600.00 | 300.00 | 30 || 7521 | ward | salesman | 7698 | 1983-03-12 00:00:00 | 1250.00 | 500.00 | 30 || 7566 | jones | manager | 7839 | 1981-03-12 00:00:00 | 2893.00 | NULL | 20 || 7654 | martin | salesman | 7698 | 1981-03-12 00:00:00 | 1250.00 | NULL | 30 || 7902 | ford | analyst | 7566 | 0000-00-00 00:00:00 | 3000.00 | NULL | 30 || 7698 | black | manager | 7902 | 1981-03-02 00:00:00 | 2850.00 | NULL | 30 || 7839 | king | president | NULL | 1981-03-12 00:00:00 | 5000.00 | NULL | 10 || 7676 | sandy | manager | 7839 | 1981-03-12 00:00:00 | 3500.00 | NULL | 50 || 7678 | edy | manager | 7839 | 1981-03-12 00:00:00 | 3500.00 | NULL | 60 |+-------+--------+-----------+------+---------------------+---------+--------+--------+当主查询的条件在子查询的查询结果里时,就可以通过关键字in来进行判断,相反,可以使用not inselect ename,depto from t_employee where deptno in (select deptno from t_dept);+--------+--------+| ename | deptno |+--------+--------+| smith | 20 || alen | 30 || ward | 30 || jones | 20 || martin | 30 || ford | 30 || black | 30 || king | 10 |+--------+--------+ 可以发现sandy和edy并没有打印出来select ename,depto from t_employee where deptno not in (select deptno from t_dept);+-------+--------+| ename | deptno |+-------+--------+| sandy | 50 || edy | 60 |+-------+--------+ 2、带有关键字any的子查询关键字any用来表示主查询的条件为满足子查询返回查询结果中任意一条数据记录,该关键字有三种匹配方式:=ANY:其功能与关键字IN一样>ANY(>=ANY):比子查询中返回数据记录中最小的还要大于(大于等于)数据记录ALL(>=ALL):比子查询中返回数据记录中最大的还要大于(大于等于)数据记录 select d.deptno,d.dname,d.loc,number,average -> from t_dept d inner join -> (select deptno dno,count(empno) number,avg(sale) average from t_employee group by deptno desc) employee ->on d.deptno=employee.dno;+--------+------------+----------+--------+-------------+| deptno | dname| loc| number | average |+--------+------------+----------+--------+-------------+| 30 | sales| chicago |5 | 1990.000000 || 20 | researcher | dalls |2 | 1846.500000 || 10 | accounting | new york |1 | 5000.000000 |+--------+------------+----------+--------+-------------+

篇2:多表查询技巧

看到大家很多不会多,其实有个很简单的办法具体方法:

打开你的Access 数据库对象(选择查询)

添加你要查询的表,可以是多个

然后选择他们关联的ID,然后下面选择你要查询的表字段

最后在 在空白处右键选择 SQL视图

得到正确的多表查询,

多表查询技巧

篇3:多表查询技巧

-06-06Access 执行SQL的方法

-07-07加密你的Access数据库asp打开方法

-11-11Access使用宏控制程序

2007-07-07长期使用中型Access数据库的一点经验与缺点

2006-11-11Access使用查询 在查询中执行计算的注意事项

2006-07-07Microsoft Access 数据库常规规格

2007-08-08access下如何恢复已经删除的记录;如何恢复已经删除的表、窗体等

2006-11-11中文Access速成教程--1.8 定义表之间的关系

2007-03-03ACCESS学习日记

2006-11-11使用准则进行条件查询

篇4:多表查询技巧

最近更 新

union这个连接是有什么用的和INNER JOIN有

access数据库用sql语句添加字段,修改字段

ACCESS学习日记

Access使用宏控制程序

ACCESS数据库文件的压缩和修复方法[图文]

用 INNER JOIN语法联接多个表建记录集

使用准则进行条件查询--1.4.从窗体中选择

解决Access中分组报表的问题

恢复从 Access 2000、Access 或 Ac

Access日期与时间函数汇总

热 点 排 行

Access中批量替换数据库内容的两

access数据库用sql语句添加字段,

Access日期与时间函数汇总

Access字符串处理函数整理

如何让access自动编号从1开始排序

access下如何恢复已经删除的记录

Access 执行SQL的方法

ACCESS数据库文件的压缩和修复方

short int、long、float、double

Access数据库提示OleDbException

篇5:如何查询地税电子数据

在日前开展的同级财政预算执行审计过程中,如何通过采集其税收征收管理的电子数据搞好对地方税务的征收和管理审计,结合实际工作,我们认为可从以下几个方面来查询分析。

一是将各征收分局的电子数据税款合计数与报表反映的全年税收入库数相核对。通过设置“征收机关代码”进行自动筛选,查出各征收机关的税款征收入库情况,并可形成相应的excel文件,将各分局电子数据所反映的税收收入合计数与地税局征收报表所反映的全年的税收入库数相核对,若核对不一致,再将作废标志设为“1”(“1”表示作废)进行筛选,查出作废的电子数据,对这些电子数据要进行仔细分析,与实际作废票据相核对,查清原因,分析存在的问题,这是审计的重点。

二是利用电子数据中各字段之间的钩稽关系进行查询。地税数据中各字段之间是存在一定的钩稽关系的,只要能够设置出条件,便可查出问题。比如利用“税款所属日期”与“上解日期”这两个字段的关系,若税款所属日期为某个月份,而税款的上解同时也在这个月份,再通过对税种进行分析,便可查出提前征收税款的问题;通过“填发日期”与“上解日期”之间的钩稽关系,借助excel的函数功能,可查出延解税款等问题。

三是对企业等延伸单位的纳税情况与延伸单位账面反映的实际纳税情况进行核对。通过设置企业代码或企业名称进行自动筛选,查出某个企业的全年纳税情况,并形成excel文件,利用excel的排序、分类汇总功能,得出全年税收分税种的实际缴纳情况,与所延伸企业的账面实际纳税情况进行核对,可以发现地税局延压税款,调节税收进度等问题。

四是将电子数据审查与代开发票审查相结合。虽然地税局是在单位缴纳税款后凭缴款书或是完税证来开具发票,但有时可能不会及时解缴入库,通过查询代开发票中反映的收款单位的纳税情况,查出代开发票中反映的收入数的已缴税款是否解库的问题。

篇6:SQL查询和清除重复数据

SQL查询和清除重复数据

选择重复,消除重复和选择出序列

有例表:emp

emp_no name  age

001     Tom   17

002     Sun   14

003     Tom   15

004     Tom   16

要求:

列出所有名字重复的人的记录

(1)最直观的思路:要知道所有名字有重复人资料,首先必须知道哪个名字重复了:

select name from emp   group by name  having count(*)>1

所有名字重复人的记录是:

select * from emp

where name in (select name from emp group by name having count(*)>1)

(2)稍微再聪明一点,就会想到,如果对每个名字都和原表进行比较,大于2个人名字与这条记录相同的就是合格的 ,就有

select * from emp where (select count(*) from emp e  where e.name=emp.name) >1

--注意一下这个>1,想下如果是 =1,如果是 =2 如果是>2 如果 e 是另外一张表 而且是=0那结果 就更好玩了:)

这个过程是 在判断工号为001的 人 的时候先取得 001的 名字(emp.name) 然后和原表的名字进行比较 e.name

注意e是emp的一个别名,

再稍微想得多一点,就会想到,如果有另外一个名字相同的人工号不与她他相同那么这条记录符合要求:

select * from emp

where exists

(select * from emp e  where e.name=emp.name and e.emp_noemp.emp_no)

此思路的join写法:

select emp.*   from emp,emp e

where emp.name=e.name and emp.emp_noe.emp_no

/*  这个语句较规范的 join 写法是

select emp.* from emp inner join emp e  on emp.name=e.name and emp.emp_noe.emp_no

但个人比较倾向于前一种写法,关键是更清晰  */

b、有例表:emp

name  age

Tom   16

Sun    14

Tom   16

Tom   16

----------------------------------------------------清除重复----------------------------------------------------

过滤掉所有多余的重复记录

(1)我们知道distinct、group by 可以过滤重复,于是就有最直观的

select distinct * from emp  或  select name,age from emp group by name,age

获得需要的数据,如果可以使用临时表就有解法:

select distinct * into #tmp  from emp

delete from emp

insert into emp select * from #tmp

(2)但是如果不可以使用临时表,那该怎么办?

我们观察到我们没办法区分数据(物理位置不一样,对 SQL Server来说没有任何区别),思路自然是想办法把数据区分出来了,既然现在的所有的列都没办法区分数据,唯一的办法就是再加个列让它区分出来,加什么列好?最佳选择是identity列:

alter table emp add chk int identity(1,1)

表示例:

name age chk

Tom  16  1

Sun   14  2

Tom  16  3

Tom  16  4

重复记录可以表示为:

select * from emp where (select count(*) from emp e where e.name=emp.name)>1

要删除的是:

delete from emp

where (select count(*) from emp e  where e.name=emp.name and e.chk>=emp.chk)>1

再把添加的列删掉,出现结果,

alter table emp drop column chk

(3)另一个思路:

视图

select min(chk) from emp group by name having count(*) >1

获得有重复的记录chk最小的值,于是可以

delete from emp where chk not in (select min(chk) from emp group by name)

写成join的形式也可以:

(1)有例表:emp

emp_no  name  age

001      Tom   17

002      Sun   14

003      Tom   15

004      Tom   16

◆要求生成序列号

(1)最简单的方法,根据b问题的解法:

alter table emp add chk int identity(1,1) 或

select *,identity(int,1,1) chk into #tmp from emp

◆如果需要控制顺序怎么办?

select top 100000 *,identity(int,1,1) chk into #tmp from emp order by age

(2) 假如不可以更改表结构,怎么办?

如果不可以唯一区分每条记录是没有办法的,在可以唯一区分每条记录的时候,可以使用a 中的count的思路解决这个问题

select emp.*,(select count(*) from emp e where e.emp_no<=emp.emp_no)

from emp

order by (select count(*) from emp e where e.emp_no<=emp.emp_no)

作者 heludoit

数据库实训总结

ACCESS学习日记

感恩节句子的经典句

帝国cms列表简介信息问题

用 INNER JOIN语法联接多个表建记录集数据库教程

KMCT分页控件与存储过程分页完美结合存储过程分页篇

小技巧:用批处理对MySQL进行数据操作数据库教程

数据库优化经验技巧及注意事项

从零开始学Oracle―约束

从一个MysqL的例子来学习查询语句数据库教程

多表数据记录查询
《多表数据记录查询.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【多表数据记录查询(集锦6篇)】相关文章:

有关规则的语句2023-04-02

Oracle SQL精妙SQL语句讲解2022-06-09

用一个实例讲解Oracle数据库的PL/SQL语句块2022-10-30

SQL数据操作基础(中级)102023-07-08

网数据库的代码集合2022-12-27

java的学习计划2024-01-16

信息技术教学工作计划高一2024-04-23

数据库的管理教学设计2023-08-08

高一信息技术教学的工作总结2023-09-16

存储过程实现分页2022-05-03

点击下载本文文档