毕业论文
您现在的位置:  >> 笛图片 >> 正文 >> 正文

Mysql中的关联查询

来源:笛 时间:2022/10/16

关联查询

作用:从2张或多张表中,取出有关联的数据.

关联查询一共有几种情况:

内连接:INNERJOIN、CROSSJOIN

外连接:左外连接(LEFTOUTERJOIN)、右外连接(RIGHTOUTERJOIN)、全外连接(FULLOUTERJOIN)

自连接:当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义

说明:

(1)连接n个表,至少需要n-1个连接条件。例如:连接三个表,至少需要两个连接条件。

(2)当两个关联查询的表如果有字段名字相同,并且要查询中涉及该关联字段,那么需要使用表名前缀加以区分

(3)当如果表名比较长时,可以给表取别名,简化SQL语句

笛卡尔积

定义:将两(或多)个表的所有行进行组合,连接后的行数为两(或多)个表的乘积数.

在MySQL中如下情况会出现笛卡尔积,主要是因为缺少关联条件或者关联条件不准确

注:外连接必须写关联条件,否则报语法错误

#笛卡尔积#查询员工姓名和所在部门名称SELECTename,dnameFROMt_employee,t_department;SELECTename,dnameFROMt_employeeINNERJOINt_department;SELECTename,dnameFROMt_employeeCROSSJOINt_department;SELECTename,dnameFROMt_employeeJOINt_department;

关联条件

表连接的约束条件可以有三种方式:WHERE,ON,USING

WHERE:适用于所有关联查询

ON:只能和JOIN一起使用,只能写关联条件。虽然关联条件可以并到WHERE中和其他条件一起写,但分开写可读性更好。

USING:只能和JOIN一起使用,而且要求两个关联字段在关联表中名称一致,而且只能表示关联字段值相等

#关联条件#把关联条件写在where后面SELECTename,dnameFROMt_employee,t_departmentWHEREt_employee.dept_id=t_department.did;

#把关联条件写在on后面,只能和JOIN一起使用SELECTename,dnameFROMt_employeeINNERJOINt_departmentONt_employee.dept_id=t_department.did;SELECTename,dnameFROMt_employeeCROSSJOINt_departmentONt_employee.dept_id=t_department.did;SELECTename,dnameFROMt_employeeJOINt_departmentONt_employee.dept_id=t_department.did;

#把关联字段写在using()中,只能和JOIN一起使用#而且两个表中的关联字段必须名称相同,而且只能表示=#查询员工姓名与基本工资SELECTename,basic_salaryFROMt_employeeINNERJOINt_salaryUSING(eid);

#n张表关联,需要n-1个关联条件#查询员工姓名,基本工资,部门名称SELECTename,basic_salary,dnameFROMt_employee,t_department,t_salaryWHEREt_employee.dept_id=t_department.didANDt_employee.eid=t_salary.eid;SELECTename,basic_salary,dnameFROMt_employeeINNERJOINt_departmentINNERJOINt_salaryONt_employee.dept_id=t_department.didANDt_employee.eid=t_salary.eid;

内连接(INNERJOIN)

有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行

格式:

隐式:

SELECT[cols_list]from表1,表2where[condition]

显式:

SELECT[cols_list]from表1INNERJOIN表2ON[关联条件]where[其他筛选条件]

SELECT[cols_list]from表1CROSSJOIN表2ON[关联条件]where[其他筛选条件]

SELECT[cols_list]from表1JOIN表2ON[关联条件]where[其他筛选条件]

#内连接

#查询员工姓名和所在部门名称SELECTename,dnameFROMt_employee,t_departmentWHEREt_employee.dept_id=t_department.did;SELECTename,dnameFROMt_employeeINNERJOINt_departmentONt_employee.dept_id=t_department.did;SELECTename,dnameFROMt_employeeCROSSJOINt_departmentONt_employee.dept_id=t_department.did;SELECTename,dnameFROMt_employeeJOINt_departmentONt_employee.dept_id=t_department.did;

#查询员工姓名,基本工资,部门名称SELECTename,basic_salary,dnameFROMt_employee,t_department,t_salaryWHEREt_employee.dept_id=t_department.didANDt_employee.eid=t_salary.eid;SELECTename,basic_salary,dnameFROMt_employeeINNERJOINt_departmentINNERJOINt_salaryONt_employee.dept_id=t_department.didANDt_employee.eid=t_salary.eid;

外连接(OUTERJOIN)

外连接分为:

左外连接(LEFTOUTERJOIN),简称左连接(LEFTJOIN)

右外连接(RIGHTOUTERJOIN),简称右连接(RIGHTJOIN)

全外连接(FULLOUTERJOIN),简称全连接(FULLJOIN)。

左连接(LEFTJOIN)

右外连接(RIGHTJOIN)

外连接(FULLJOIN)

mysql不支持FULLJOIN,但是可以用leftjoinunionrightjoin代替

自连接

当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义。然后两个表再进行内连接,外连接等查询

#自连接#查询员工姓名以及领导姓名,仅显示有领导的员工SELECTemp.ename,mgr.enameFROMt_employeeASemp,t_employeeASmgrWHEREemp.mid=mgr.eid;

#查询员工姓名以及领导姓名,仅显示有领导的员工SELECTemp.ename,mgr.enameFROMt_employeeASempINNERJOINt_employeeASmgrONemp.mid=mgr.eid;

#查询所有员工姓名及其领导姓名SELECTemp.ename,mgr.enameFROMt_employeeASempLEFTJOINt_employeeASmgrONemp.mid=mgr.eid;

转载请注明:http://www.0431gb208.com/sjszlff/2177.html