数据库SQL的多表查询

数据库 SQL 的多表查询:eg: table1: employees, table2: departments,table3: salary_grades;

	一:内连接:
		1):等值连接:
					把表employees中的department_id 与表departmes中的department_id相匹配的找出来
						select e.last_name, d.department_id
						from employees e,departments d
						where e.department_id = d.department_id

				    	--等值内连接的缺点是:筛选条件中没有匹配的则无法选出;

		2):非等值连接:
					把表employees中的salary按照表salary_grades中的等级进行分配等级:
						select last_name ,salary,grade_level
						from employees,job_grades
						where salary between lowest_sal and highest_sal

	二:外连接:
		 			--相对于内连接中的等值连接,等值连接的缺点显而易见,要想把不匹配的内容显现出来,则要使用外连接;

		1):左连接:	右边去匹配左边的内容,把匹配不到的左边的原样输出,要在等式右边加上‘(+)‘;
						select e.last_name, d.department_id
						from employees e,departments d
						where e.department_id = d.department_id(+)

		2):右连接:  左边去匹配右边的内容,把匹配不到的右边的原样输出,要在等式左边加上‘(+)‘;
						select e.last_name, d.department_id
						from employees e,departments d
						where e.department_id(+) = d.department_id

		--外连接也是有缺陷的,它的缺陷是:左右连接不能同时使用,要想同时输出两边都不匹配的,需要用到SQL99:

	三: SQL99:
				--SQL99又是另一套体系;

		1):	--针对上述外连接的缺陷,SQL99可以使用natural join 来解决:
				select last_name, department_id
				from employees e natural join departments d

				--他的缺陷是自动匹配两个表中列名称完全一样并且数据类型完全相同的{所有列中}的(不只是目标列)情况;

		2): --针对上述1)的缺陷,可以考虑使用以下的:
				select last_name, d.department_id
				from employees e join departments d
				on e.department_id = d.department_id

				--和where的意思一样

		3):
			select last_name, department_id
			from employees join departments
			using(department_id)

			--这种方式需要两个表中的列名陈和数据类型完全一样

		4): 左连接:
				select last_name, d.department_id
				from employees e left outer join departments d
				on e.department_id = d.department_id

		5): 右连接:
				select last_name, d.department_id
				from employees e right outer join departments d
				on e.department_id = d.department_id

		6): 全连接:
				select last_name, d.department_id
				from employees e full outer join departments d
				on e.department_id = d.department_id

	四: 自连接:
		--去实现查询表employees中last_name = ‘chen‘ 的员工的老板的工资和email:
				select emp.last_name,emp.manager_id,managers.salary,managers.email
				from employees emp,employees managers
				where emp.manager_id = managers.employee_id and lower(emp.last_name) = ‘chen‘

  

时间: 2024-12-13 06:24:28

数据库SQL的多表查询的相关文章

基于ACCESS和ASP的SQL多个表查询与计算统计代码

最近在写几个关于"Project - Subitem - Task"的管理系统,说是系统还是有点夸大了,基本就是一个多表查询调用和insert.update的数据库操作,只是出现不少计算和统计的问题,使得SQL显得复杂.所以,有必要在一个阶段任务完成后,做一次总结,把一些测试过程中的SQL代码做总结,以防以后用到又忘记了,也欢迎各位DB码农一起吐槽. 这几个月陆续写了几个系统,最后一个系统是信用卡管理系统,也是SQL累积到较复杂的阶段,以这个为例子来整理这段时间以来的基于ACCESS和

非关心数据库无法进行连表查询 所以我们需要在进行一对多查询时候 无法满足 因此需要在"1"的一方添加"多"的一方的的id 以便用于进行连表查询 ; 核心思想通过id进行维护与建文件

非关心数据库无法进行连表查询 所以我们需要在进行一对多查询时候 无法满足 因此需要在"1"的一方添加"多"的一方的的id 以便用于进行连表查询 ; 核心思想通过id进行维护与建文件 原文地址:https://www.cnblogs.com/classmethond/p/10562396.html

SQL Fundamentals || 多表查询(内连接,外连接(LEFT|RIGHT|FULL OUTER JOIN),自身关联,ON,USING,集合运算UNION)

一.多表查询基本语法 在进行多表连接查询的时候,由于数据库内部的处理机制,会产生一些“无用”的数据,而这些数据就称为笛卡尔积. 多表查询时可以利用等值关联字段消除笛卡尔积 多表查询之中,每当增加一个关联表都需要设置消除笛卡尔积的条件 分析过程很重要: 确定所需要的数据表 确定已知的关联字段: 按照SQL语句的执行步骤编写:FROM,WHERE,SELECT,ORDER BY (由于SELECT是在WHERE子句之后执行,所以SELECT子句所定义的别名WHERE不可以直接使用) (由于SELEC

数据库 设计 和多表查询

#1.首先明确一点:分组发生在where之后,即分组是基于where之后得到的记录而进行的 #2.分组指的是:将所有记录按照某个相同字段进行归类,比如针对员工信息表的职位分组,或者按照性别进行分组等 #3.为何要分组呢? 取每个部门的最高工资 取每个部门的员工数 取男人数和女人数 小窍门:'每'这个字后面的字段,就是我们分组的依据 #4.大前提: 可以按照任意字段分组,但是分组完毕后,比如group by post,只能查看post字段,如果想查看组内信息,需要借助于聚合函数 单独使用GROUP

04 数据库入门学习-单表查询、多表查询、子查询

1.复制表 #创建了一张测试表 mysql>create table test (id int primary key auto_increment,name char(10)); #显示原表结构 mysql> desc test; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+---

SQL总结 连表查询

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

Sql Server连表查询字段为null

这是一个坑,并且是有毒的坑. 一不小心我就掉进了这个坑里面,费了好大的力气这才从坑里面爬出来. 话不多说,开始吹BB啦. 一.简单说说遇到的问题: 连表查询,一对多. 出现 int,  smalldatetime等非string类型的字段为null. 操作如下: 1.sql语句查询,结果完全准确. 2.直接后台获取,结果有点不一样,出现异常. 二.解决办法如下: 使用 ISNULL(value1, value2) 1.value1与value2的数据类型必须一致. 2.如果value1的值不为n

数据库原理-数据单表查询

格式:select [all|distinct] <目标列表达式>,[目标列]... from <表名或视图名>[,<表名或视图名>|(seslect 语句)[as]<别名>] [where <条件名>] [group by<列名1>[having <条件表达式>]] [order by<列名1>[asc|desc]] 单表查询 选择表中的若干列 1.查询全部列 select * from student 2.

MySQL数据库篇之单表查询

主要内容: 一.单表查询的语法 二.关键字的执行优先级 三.简单查询 四.where约束 五.分组查询 group by 六.having过滤 七.查询排序 order by 八.限制查询的记录数 limit 九.使用正则表达式查询 1?? 单表查询的语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条数 2??  关键字的执行优先级 重点中的重点:关键字的执行优先级(从上至