MySQL多表数据记录查询详解

在实际应用中,经常需要实现在一个查询语句中显示多张表的数据,这就是所谓的多表数据记录连接查询,简称来年将诶查询。

在具体实现连接查询操作时,首先将两个或两个以上的表按照某个条件连接起来,然后再查询到所要求的数据记录。连接查询分为内连接查询和外连接查询。

在具体应用中,如果需要实现多表数据记录查询,一般不使用连接查询,因为该操作效率比较低。于是MySQL又提供 了连接查询的替代操作,子查询操作。
1.关系数据操作: 
在连接查询中,首先需要对两张或两张以上的表进行连接操作。连接操作是关系数据操作中专门用于数据操作的关系运算。

1.1 并(UNION):
    在SQL语言中存在一种关系数据操作,叫做并操作。“并”就是把具有相同字段数目和字段类型的表合并到一起。通过并操作将两张表的数据记录合并到一起,合并后的字段数为 表1的字段数或者表2的字段数;合并后的总记录数为:表1的记录数 + 表2的记录数 - 表1和表2 重复的记录数。

1.2 笛卡尔积(CARTESIAN PRODUCT):
    在SQL语言中存在一种关系数据操作,叫做笛卡尔积操作。笛卡尔就是没有连接条件,表中的数据任意的组合。笛卡尔积的字段数为 表1的字段数 + 表2的字段数。笛卡尔积的记录数为:表1的记录数 * 表2的记录数。

1.3 内连接(INNER JOIN):
    为了便于操作,专门提供了一种针对数据库操作的运算—连接(JOIN)。所谓连接就是在表关系的笛卡尔积数据记录中,按照相应字段值的比较条件进行选择生成一个新的关系。连接又分为内连接(INNER JOIN)、外连接(OUTER JOIN)、交叉连接(CROSS JOIN)。
    所谓内连接,就是在表关系的笛卡尔积数据中,保留表关系中所有匹配的数据记录,舍弃不匹配的数据记录。按照匹配的条件可以分成自然连接、等值连接和不等连接。
    1.3.1 自然连接(NATURAL JOIN):
    自然连接就是在表关系的笛卡尔积中,首先根据表关系中相同名称的字段自动进行记录匹配,然后去掉重复的字段。
    通过自然连接后,新关系的字段数为:表1字段数 + 表2字段数 - 表1和表2中的重复字段数。自然连接后新关系的记录数为:表1的记录数 * 表2的记录数 - 表1和表2相同字段的值不相等记录数。
自然连接又如下特点:
    1. 在具体执行自然连接时,会自动判断相同名称的字段,然后进行数据值的匹配。
    2. 在执行完自然连接的新关系中,虽然可以指定包含哪些字段,但是不能指定执行过程中的匹配条件,即哪些字段的值进行匹配。
    3. 在执行自然连接的新关系中,执行过程中所匹配的字段名只有一个,即会去掉重复字段。
    1.3.2 等值连接:
    所谓等值连接操作就是表关系的笛卡尔积中,选择所匹配字段值相等的数据记录。
    通过等值连接后,新关系的字段数为:表1字段数 + 表2字段数。等值连接后新关系的记录数为:表1的记录数 * 表2的记录数 - 表1和表2相同字段的值不相等记录数。
    与自然连接相比,等值连接操作需要在执行过程中用“=”指定匹配条件,在新关系中不会去掉重复字段。
    1.3.3 不等连接:
    所谓不等连接操作就是表关系的笛卡尔积中,选择所匹配字段值不相等的数据记录。
    通过不等连接后,新关系的字段数为:表1字段数 + 表2字段数。等值连接后新关系的记录数为:表1的记录数 * 表2的记录数 - 表1和表2相同字段的值相等的记录数。
    与自然连接相比,等值连接操作需要在执行过程中用“!=”指定匹配条件,在新关系中不会去掉重复字段。

1.4 外连接(OUTER JOIN):
    所谓外连接(OUTER JOIN),就是在表关系的笛卡尔积数据记录中,不仅保留表关系中所有匹配的数据记录,而且还会保留部分不匹配的数据记录。按照保留不不匹配条件数据记录来源可以分为:左外连接、右外连接、全外连接。
    1.4.1 左外连接:
所谓左外连接操作就是表关系的笛卡尔积中,除了选择相匹配的数据记录,还包含关联左边表中不匹配的数据记录。
    通过左外连接后,新关系的字段数为:左表字段数 + 右表字段数。左外连接后新关系的记录数为:左表的记录数 * 右表的记录数 - 左表和右表相同字段的值不相等的记录数 + 左表中未匹配的记录数。
    1.4.2 右外连接:
所谓右外连接操作就是表关系的笛卡尔积中,除了选择相匹配的数据记录,还包含关联右边表中不匹配的数据记录。
    通过右外连接后,新关系的字段数为:左表字段数 + 右表字段数。右外连接后新关系的记录数为:左表的记录数 * 右表的记录数 - 左表和右表相同字段的值不相等的记录数 + 右表中未匹配的记录数。
    1.4.3 全外连接:
所谓右外连接操作就是表关系的笛卡尔积中,除了选择相匹配的数据记录,还包含关联左右两边表中不匹配的数据记录。
    通过全外连接后,新关系的字段数为:左表字段数 + 右表字段数。全外连接后新关系的记录数为:左表的记录数 * 右表的记录数 - 左表和右表相同字段的值不相等的记录数 + 左表未匹配的记录数 + 右表中未匹配的记录数。

2.内连接查询:
    在MySQL中实现连接查询有两种语法:
    1. 在from子句中利用逗号区分多个表,在where子句中通过逻辑表达式来实现匹配条件,从而实现表的连接。
    2. ANSI连接语法形式,在from子句中使用“join on”关键字,而连接条件写在关键字on子句中。推荐使用第二种方式。
    按照匹配条件,内连接查询可以分为两类:等值连接;不等连接。

内连接查询语法为:

select field1, field2 ...fieldn
  from join_tablename1 inner join join_tablename2 [inner join join_tablename]
    on join_condition

//参数filedn 表示所要查询的字段名称,来源于所连接的表join_tablename1 和 join_tablename2,关键字inner join表进行内连接,join_condition表示进行匹配的条件。

2.1 自连接:
    内连接查询中存在一种特殊的等值连接—自连接。所谓自连接就是指表与其自身进行连接。

示例(查询每个雇员的姓名、职位、领导姓名):

mysql> select e.ename,e.job,l.ename from t_employee e inner join t_employee l on e.MGR=l.empno;
+---------+----------+-------+
| ename  | job   | ename |
+---------+----------+-------+
| SCOTT  | ANALYST | JONES |
| FORD  | ANALYST | JONES |
| ALLEN  | SALESMAN | BLAKE |
| MARD  | SALESMAN | BLAKE |
| MARRTIN | SALESMAN | BLAKE |
| TURNER | SALESMAN | BLAKE |
| JAMES  | CLEAR  | BLAKE |
| MILLER | CLEAR  | CLARK |
| ADAMS  | CLEAR  | SCOTT |
| JONES  | MANAGER | KING |
| BLAKE  | MANAGER | KING |
| CLARK  | MANAGER | KING |
| SMITH  | CLEAR  | FORD |
+---------+----------+-------+
13 rows in set (0.00 sec)

2.2等值连接:
    内连接查询中的等值连接,就是在关键字on后的匹配条件中通过等于关系运算符“=”来实现等值条件。

示例:

mysql> select e.empno,e.ename,e.job,d.dname,d.loc from t_employee e inner join t_dept d on e.deptno=d.deptno;
+-------+---------+-----------+------------+----------+
| empno | ename  | job    | dname   | loc   |
+-------+---------+-----------+------------+----------+
| 7788 | SCOTT  | ANALYST  | ACCOUNTING | NEW YORK |
| 7839 | KING  | PRESIDENT | ACCOUNTING | NEW YORK |
| 7934 | MILLER | CLEAR   | ACCOUNTING | NEW YORK |
| 7369 | SMITH  | CLEAR   | RESEARCH  | DALLAS  |
| 7499 | ALLEN  | SALESMAN | RESEARCH  | DALLAS  |
| 7566 | JONES  | MANAGER  | RESEARCH  | DALLAS  |
| 7782 | CLARK  | MANAGER  | RESEARCH  | DALLAS  |
| 7876 | ADAMS  | CLEAR   | RESEARCH  | DALLAS  |
| 7902 | FORD  | ANALYST  | RESEARCH  | DALLAS  |
| 7521 | MARD  | SALESMAN | SALES   | CHICAGO |
| 7654 | MARRTIN | SALESMAN | SALES   | CHICAGO |
| 7698 | BLAKE  | MANAGER  | SALES   | CHICAGO |
| 7844 | TURNER | SALESMAN | SALES   | CHICAGO |
| 7900 | JAMES  | CLEAR   | SALES   | CHICAGO |
+-------+---------+-----------+------------+----------+
14 rows in set (0.00 sec)

2.3不等连接:
    内连接查询中的不等连接,就是在关键字on后的匹配条件中通过除了等于关系运算符来实现不等条件外,可以使用的关系运算符包含> >= < <= !=

示例:

mysql> select e.ename employeename, e.job,l.ename loadername from t_employee e inner join t_employee l on e.mgr=l.empno
and e.empno>l.empno;
+--------------+----------+------------+
| employeename | job   | loadername |
+--------------+----------+------------+
| SCOTT    | ANALYST | JONES   |
| FORD     | ANALYST | JONES   |
| TURNER    | SALESMAN | BLAKE   |
| JAMES    | CLEAR  | BLAKE   |
| MILLER    | CLEAR  | CLARK   |
| ADAMS    | CLEAR  | SCOTT   |
+--------------+----------+------------+
6 rows in set (0.00 sec)

3.外连接查询:
    外连接查询会返回所操作表中至少一个表的所有数据。外连接分为三类:左外连接、右外连接、全外连接

语法为:

select field1, field2, ...fieldn
  from join_tablename1 left|rigth|full [outer] join join_tablename2
  on join_condition

3.1左外连接:
    外连接查询中的左外连接,就是指新关系中执行匹配条件时,以关键字left join 左边的表为参考。

示例:

mysql> select e.ename employeename, e.job job,l.ename leadername from t_employee e left join t_employee l on e.mgr=l.empno;
+--------------+-----------+------------+
| employeename | job    | leadername |
+--------------+-----------+------------+
| SMITH    | CLEAR   | FORD    |
| ALLEN    | SALESMAN | BLAKE   |
| MARD     | SALESMAN | BLAKE   |
| JONES    | MANAGER  | KING    |
| MARRTIN   | SALESMAN | BLAKE   |
| BLAKE    | MANAGER  | KING    |
| CLARK    | MANAGER  | KING    |
| SCOTT    | ANALYST  | JONES   |
| KING     | PRESIDENT | NULL    |
| TURNER    | SALESMAN | BLAKE   |
| ADAMS    | CLEAR   | SCOTT   |
| JAMES    | CLEAR   | BLAKE   |
| FORD     | ANALYST  | JONES   |
| MILLER    | CLEAR   | CLARK   |
+--------------+-----------+------------+
14 rows in set (0.00 sec)

3.2右外连接:
    外连接查询中的右外连接,就是指新关系中执行匹配条件时,以关键字right join 右边的表为参考。

4.合并查询数据记录:
    在MySQL中通过关键字UNION来实现并操作,即可以通过其将多个select语句的查询结果合并在一起组成新的关系。
    1. 关键字union的合并操作
       关键字union会把查询结果集直接合并在一起,同时将会去掉重复数据记录。
    2. 关键字union all的合并操作
       关键字union all会把查询结果集直接合并在一起。

语法为:

select field1, field2, ...fieldn
  from tablename1
union | union all
select field1, field2, ...fieldn
  from tablename2
union | union all
select field1, field2, ...fieldn
  from tablename3
......

5.子查询:
    在MySQL中虽然可以通过连接查询实现多表查询数据记录,但却不建议使用。这是因为连接查询的性能很差。因此出现了连接查询的替代者子查询。推荐使用子查询来实现多表查询数据记录。

5.1 为什么使用子查询:
    在日常开发中,经常接触到查询多表数据记录操作,例如查询部门表t_dept和雇员表t_employee表的数据记录。对于新手,直接使用select * from t_dept t,t_employee e where t.deptno=e.deptno;这条sql语句在执行时,首先会对两个表进行笛卡尔积操作,然后在选取符合匹配条件的数据记录。如果两张表的数据量较大,则在进行笛卡尔积操作时会造成死机。有经验的开发者通常会首先用统计函数查看操作表笛卡尔积后的数据记录数,然后再进行多表查询。因此多表查询一般会经过如下步骤:
    1. 通过统计函数count(1)查询所关联表笛卡尔积后的数据的记录数。然后再进行多表查询。
    2. 如果查询到的数据记录数mysql可以接受,然后再进行多表查询,否则就应该考虑通过其他方式来实现。
    如果笛卡尔积后的数据远远大于mysql软件可以接受的范围,为了解决多表查询,mysql提供了子查询来实现多表查询。
    所谓子查询,就是指在一个查询中嵌套了其他若干查询,即在一个select 查询语句的where或from子句中包含另一个select查询语句。在查询语句中,外层select查询语句称为主查询,where子句中select查询语句被称为子查询,也被称为嵌套查询。
    通过子查询可以实现多表查询,该查询语句中可能包含in,any,all,exists等关键字。除此之外还可能包含比较运算符。理论上子查询可以出现在查询语句的任何位置,但在实际开发中,子查询经常出现在where或from子句中。
    where子句中的子查询,该位置处的子查询一般返回单行单列、多行多列、单行多列数据记录。
    from子句中的子查询,该位置处的子查询一般返回多行多列数据记录,可以当作一张临时表。

5.2 返回结果为单行单列和单行多列子查询:
当子查询的返回结果为单行蛋类数据记录时,该子查询语句一般在主查询语句的where子句中,通常会包含比较运算符(> < = != 等)
    5.2.1 单行单列子查询:

示例(工资比Smith高的全部雇员信息):

mysql> select * from t_employee where sal > (select sal from t_employee where ename='smith');
+-------+---------+-----------+------+------------+---------+---------+--------+
| empno | ename  | job    | MGR | Hiredate  | sal   | comm  | deptno |
+-------+---------+-----------+------+------------+---------+---------+--------+
| 7499 | ALLEN  | SALESMAN | 7698 | 1982-03-12 | 1600.00 | 300.00 |   20 |
| 7521 | MARD  | SALESMAN | 7698 | 1983-03-12 | 1250.00 | 500.00 |   30 |
| 7566 | JONES  | MANAGER  | 7839 | 1981-03-12 | 2975.00 |  NULL |   20 |
| 7654 | MARRTIN | SALESMAN | 7698 | 1981-03-12 | 2850.00 | 1400.00 |   30 |
| 7698 | BLAKE  | MANAGER  | 7839 | 1981-03-12 | 2850.00 |  NULL |   30 |
| 7782 | CLARK  | MANAGER  | 7839 | 1985-03-12 | 2450.00 |  NULL |   20 |
| 7788 | SCOTT  | ANALYST  | 7566 | 1981-03-12 | 3000.00 |  NULL |   10 |
| 7839 | KING  | PRESIDENT | NULL | 1981-03-12 | 5000.00 |  NULL |   10 |
| 7844 | TURNER | SALESMAN | 7698 | 1989-03-12 | 1500.00 |  0.00 |   30 |
| 7876 | ADAMS  | CLEAR   | 7788 | 1998-03-12 | 1100.00 |  NULL |   20 |
| 7900 | JAMES  | CLEAR   | 7698 | 1987-03-12 | 950.00 |  NULL |   30 |
| 7902 | FORD  | ANALYST  | 7566 | 0000-00-00 | 3000.00 |  NULL |   20 |
| 7934 | MILLER | CLEAR   | 7782 | 1981-03-12 | 1300.00 |  NULL |   10 |
+-------+---------+-----------+------+------------+---------+---------+--------+
13 rows in set (0.00 sec)

5.2.2 单行多列子查询:

where子句中的子查询除了是返回单行单列的数据记录外,还可以是返回多行多列的数据记录,不过这种子查询很少出现。

示例(工资和职位和Smith一样的全部雇员):

mysql> select ename,job,sal from t_employee where (sal,job)=(select sal,job from t_employee where ename='smith');
+-------+-------+--------+
| ename | job  | sal  |
+-------+-------+--------+
| SMITH | CLEAR | 800.00 |
+-------+-------+--------+
1 row in set (0.00 sec)

5.3 返回结果为多行单列子查询:
    当子查询的返回结果为多行单列数据记录时,该子查询语句一般会在主查询语句的where子句中出现,通常会包含IN ANY ALL EXISTS等关键字。
    5.3.1 带有关键字in的子查询:
        当主查询的条件在子查询的查询结果中时,可以通过关键字in来进行判断。相反,如果想实现主查询的条件不在子查询的查询结果中时,可以通过关键字not in来进行判断。

示例:

mysql> select * from t_employee where deptno in(select deptno from t_dept);
+-------+---------+-----------+------+------------+---------+---------+--------+
| empno | ename  | job    | MGR | Hiredate  | sal   | comm  | deptno |
+-------+---------+-----------+------+------------+---------+---------+--------+
| 7369 | SMITH  | CLEAR   | 7902 | 1981-03-12 | 800.00 |  NULL |   20 |
| 7499 | ALLEN  | SALESMAN | 7698 | 1982-03-12 | 1600.00 | 300.00 |   20 |
| 7521 | MARD  | SALESMAN | 7698 | 1983-03-12 | 1250.00 | 500.00 |   30 |
| 7566 | JONES  | MANAGER  | 7839 | 1981-03-12 | 2975.00 |  NULL |   20 |
| 7654 | MARRTIN | SALESMAN | 7698 | 1981-03-12 | 2850.00 | 1400.00 |   30 |
| 7698 | BLAKE  | MANAGER  | 7839 | 1981-03-12 | 2850.00 |  NULL |   30 |
| 7782 | CLARK  | MANAGER  | 7839 | 1985-03-12 | 2450.00 |  NULL |   20 |
| 7788 | SCOTT  | ANALYST  | 7566 | 1981-03-12 | 3000.00 |  NULL |   10 |
| 7839 | KING  | PRESIDENT | NULL | 1981-03-12 | 5000.00 |  NULL |   10 |
| 7844 | TURNER | SALESMAN | 7698 | 1989-03-12 | 1500.00 |  0.00 |   30 |
| 7876 | ADAMS  | CLEAR   | 7788 | 1998-03-12 | 1100.00 |  NULL |   20 |
| 7900 | JAMES  | CLEAR   | 7698 | 1987-03-12 | 950.00 |  NULL |   30 |
| 7902 | FORD  | ANALYST  | 7566 | 0000-00-00 | 3000.00 |  NULL |   20 |
| 7934 | MILLER | CLEAR   | 7782 | 1981-03-12 | 1300.00 |  NULL |   10 |
+-------+---------+-----------+------+------------+---------+---------+--------+
14 rows in set (0.00 sec)

5.3.2 带有关键字any的子查询:
        关键字any:主查询的条件为满足子查询的查询结果中任意一条数据记录,该关键字有三种匹配方式;
1. =any:其功能与关键字in一样
2. > any(>=any):只要大于(大于等于)子查询中最小的一个即可。
3. < any(<=any):只要小于(小于等于)子查询中最大的一个即可。

示例(查询雇员工资不低于职位为manager的工资):

mysql> select ename,sal from t_employee where sal>any(select sal from t_employee where job='manager');
+---------+---------+
| ename  | sal   |
+---------+---------+
| JONES  | 2975.00 |
| MARRTIN | 2850.00 |
| BLAKE  | 2850.00 |
| SCOTT  | 3000.00 |
| KING  | 5000.00 |
| FORD  | 3000.00 |
+---------+---------+
6 rows in set (0.00 sec)

5.3.3 带有关键字all的子查询:
    关键字all用来表示主查询的条件为满足子查询返回查询结果中所有数据记录,有两种匹配方式:
    1. > all(>=all):比子查询结果中最大的还要大(大于等于)的数据记录;
    2. < all(<= all):比子查询结果中最小的还要小(小于等于)的数据记录。

示例:

mysql> select ename,sal from t_employee where sal>all(select sal from t_employee where job='manager');
+-------+---------+
| ename | sal   |
+-------+---------+
| SCOTT | 3000.00 |
| KING | 5000.00 |
| FORD | 3000.00 |
+-------+---------+
3 rows in set (0.00 sec)

5.3.4 带有关键字exists的子查询:
    关键字exists是一个boolean类型,当能返回结果集时为true,不能返回结果集时为false。查询时exists对外表采用遍历方式逐条查询,每次查询都会比较exists的条件语句,当exists里的条件语句返回记录行时则条件为真,此时返回当前遍历到的记录;反之,如果exists里条件语句不能返回记录行,则丢弃当前遍历到的记录。
  5.4 返回结果为多行多列子查询:
    当子查询的返回结果为多行多列数据记录时,该子查询语句一般会在主查询语句的from子句里,被当作一张临时表的方式来处理。

示例(查询雇员表中各部门的部门号、部门名称、部门地址、雇员人数、和平均工资):
通过内连接来实现:

mysql> select d.deptno,d.dname,d.loc,count(e.empno) number,avg(e.sal) average from t_employee e inner join t_dept d on e
.deptno=d.deptno group by d.deptno;
+--------+------------+----------+--------+-------------+
| deptno | dname   | loc   | number | average   |
+--------+------------+----------+--------+-------------+
|   10 | ACCOUNTING | NEW YORK |   3 | 3100.000000 |
|   20 | RESEARCH  | DALLAS  |   6 | 1987.500000 |
|   30 | SALES   | CHICAGO |   5 | 1880.000000 |
+--------+------------+----------+--------+-------------+
3 rows in set (0.00 sec)

通过子查询来实现:

mysql> select d.deptno,d.dname,d.loc,number,average from t_dept d inner join(select deptno dno,count(empno) number,avg(s
al) average from t_employee group by deptno) employee on d.deptno=employee.dno;
+--------+------------+----------+--------+-------------+
| deptno | dname   | loc   | number | average   |
+--------+------------+----------+--------+-------------+
|   10 | ACCOUNTING | NEW YORK |   3 | 3100.000000 |
|   20 | RESEARCH  | DALLAS  |   6 | 1987.500000 |
|   30 | SALES   | CHICAGO |   5 | 1880.000000 |
+--------+------------+----------+--------+-------------+
3 rows in set (0.00 sec)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Mysql多表联合查询效率分析及优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM table1 JOIN table2 SELECT * FROM table1,table2 由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢.一般使用LE

  • 解析mysql中:单表distinct、多表group by查询去除重复记录

    单表的唯一查询用:distinct多表的唯一查询用:group bydistinct 查询多表时,left join 还有效,全连接无效,在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重复记录的所有值.其原因是distinct只能返回它的目标字段,而无法返回其它字段,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的

  • 解析Mysql多表查询的实现

    查询是数据库的核心,下面就为您介绍Mysql多表查询时如何实现的,如果您在Mysql多表查询方面遇到过问题,不妨一看.Mysql多表查询: 复制代码 代码如下: CREATE TABLE IF NOT EXISTS contact( contact_id int(11) NOT NULL AUTO_INCREMENT, user_name varchar(255), nom varchar(255), prenom varchar(255), mail varchar(64), passcode

  • SQL 多表连接查询实现语句

    1.理论 只要两个表的公共字段有匹配值,就将这两个表中的记录组合起来. 个人理解:以一个共同的字段求两个表中符合要求的交集,并将每个表符合要求的记录以共同的字段为牵引合并起来. 语法 select * FROM table1 INNER JOIN table2 ON table1 . field1 compopr table2 . field2 INNER JOIN 操作包含以下部分: 部分 说明 table1, table2 要组合其中的记录的表的名称. field1,field2 要联接的字

  • MySQL左联多表查询where条件写法示例

    复制代码 代码如下: select * from _test a left join _test b on a.id=b.id where a.level='20' and a.month='04' and b.level='20' and b.month='03'; select a.*,b.* from (select * from _test where level='20' and month='04') as a left join (select * from _test where

  • MySQL中基本的多表连接查询教程

    一.多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: 由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢.一般使用LEFT [OUTER] JOIN或者RIGHT [OUTER] JOIN 2.   内连接INNER JOIN 在MySQL中把I SELECT * FROM table1 CROSS JOIN tabl

  • mysql多表联合查询返回一张表的内容实现代码

    今天在使用mysql语句的时候老是报错,语句如下: Sql代码 复制代码 代码如下: SELECT sapcle FROM SellEnterpriseBaseInfor sebie,SellEnterpriseBaseInforVer sebive,SellApplyPermitChangeList sapcle WHERE 1=1 AND sebie.iVerID = sebive.id AND sapcle.iEnterpriseBaseInforID=sebive.id AND sapc

  • sql表连接查询使用方法(sql多表连接查询)

    实际的项目,存在多张表的关联关系.不可能在一张表里面就能检索出所有数据.如果没有表连接的话,那么我们就需要非常多的操作.比如需要从A表找出限制性的条件来从B表中检索数据.不但需要分多表来操作,而且效率也不高.比如书中的例子: 复制代码 代码如下: SELECT FIdFROM T_CustomerWHERE FName='MIKE' 这个SQL语句返回2,也就是姓名为MIKE 的客户的FId值为2,这样就可以到T_Order中检索FCustomerId等于2 的记录: 复制代码 代码如下: SE

  • ThinkPHP多表联合查询的常用方法

    ThinkPHP中关联查询(即多表联合查询)可以使用 table() 方法或和join方法,具体使用如下例所示: 1.原生查询示例: 复制代码 代码如下: $Model = new Model(); $sql = 'select a.id,a.title,b.content from think_test1 as a, think_test2 as b where a.id=b.id '.$map.' order by a.id '.$sort.' limit '.$p->firstRow.',

  • MySQL 多表查询实现分析

    我们继续使用前面的例子.前面建立的表中包含了员工的一些基本信息,如姓名.性别.出生日期.出生地.我们再创建一个表,该表用于描述员工所发表的文章,内容包括作者姓名.文章标题.发表日期. 1.查看第一个表 mytable 的内容: mysql> select * from mytable; +----------+------+------------+-----------+ | name | sex | birth | birthaddr | +----------+------+-------

随机推荐