>  기사  >  데이터 베이스  >  멋진 이해---MySQL 다중 테이블 쿼리

멋진 이해---MySQL 다중 테이블 쿼리

花姐姐
花姐姐앞으로
2020-05-06 10:59:222660검색

멋진 이해---MySQL 다중 테이블 쿼리

1. 다중 테이블 쿼리에 SELECT 절을 사용하세요

SELECT 필드 이름 FROM 테이블 1, 테이블 2... WHERE 테이블 1. 필드 = 테이블 2. 필드 및 기타 쿼리 조건<code>SELECT 字段名 FROM 表1,表2 … WHERE 表1.字段 = 表2.字段 AND 其它查询条件

SELECT a.id,a.name,a.address,a.date,b.math,b.english,b.chinese FROM tb_demo065_tel AS b,tb_demo065 AS a WHERE a.id=b.id

注:在上面的的代码中,以两张表的id字段信息相同作为条件建立两表关联,但在实际开发中不应该这样使用,最好用主外键约束来实现

二、使用表的别名进行多表查询
如:

SELECT a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065  a,tb_demo065_tel  b WHERE a.id=b.id AND b.id=&#39;$_POST[textid]&#39;

SQL语言中,可以通过两种方式为表指定别名 
第一种是通过关键字AS指定,如

SELECT a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065 AS a,tb_demo065_tel AS b WHERE a.id=b.id

第二种是在表名后直接加表的别名实现

SELECT a.id,a.name,a.address,b.math,b.english,b.chinese FROM tb_demo065  a,tb_demo065_tel  b WHERE a.id=b.id

使用表的别名应注意几下几点
(1)别名通常是一个缩短了的表名,用于在连接中引用表中的特定列,如果连接中的多个表中有相同的名称列存在,必须用表名或表的别名限定列名
(2)如果定义了表的别名就不能再使用表名

三、合并多个结果集
SQL语言中,可以通过UNION 或 ALL将多个SELECT语句的查询结果合并输出,这两个关键字的使用说明如下:
UNION:利用该关键字可以将多个SELECT 语句的查询结果合并输出,并删除重复行
ALL:利用该关键字可以将多个SELECT 语句的查询结果合并输出,但不会删除重复行
在使用UNION或ALL关键字将多个表合并输出时,查询结果必须具有相同的结构并且数据类型必须兼容,另外使用UNION时两张表的字段数量也必须相同,否则会提示SQL语句有错误。

e.x:SELECT id,name,pwd FROM tb_demo067 UNION SELECT  uid,price,date FROM tb_demo067_tel

四、简单嵌套查询
子查询:子查询是一个SELECT查询,返回单个值且嵌套在SELECT、INSERT、UPDATE和DELETE语句或其它查询语句中,任何可以使用表达式的地方都可以使用子查询.

SELECT id,name,sex,date FROM tb_demo068 WHERE id in(SELECT id FROM tb_demo068 WHERE id=&#39;$_POST[test]&#39;)

内连接:把查询结果作为WHERE子句的查询条件即称为内连接

五、复杂的嵌套查询
多表之间的嵌套查询可以通过谓词IN实现,语法格式如下:
test_expression[NOT] IN{<br> subquery<br>}

SELECT * FROM tb_demo069_people WHERE uid IN(SELECT deptID FROM tb_demo069_dept WHERE deptName=&#39;$_POST[select]&#39;)
SELECT a.id,a.name FROM tb_demo067 AS a WHERE id<3)

참고: 위 코드에서는 두 테이블의 동일한 id 필드 정보를 기반으로 두 테이블 간의 연결이 설정되지만 실제 개발에서는 사용하지 않는 것이 좋습니다. 그리고 이를 달성하기 위한 외래 키 제약 조건

2. 다중 테이블 쿼리에 테이블의 별칭을 사용하세요.

예:

SELECT people.name,people.chinese,people.math,people.english FROM (SELECT name,chinese,math,english FROM tb_demo071) AS people
SQL 언어에서는 두 가지 방법으로 테이블의 별칭을 지정할 수 있습니다.

첫 번째

SELECT (SELECT AVG(chinese)FROM tb_demo071),(SELECT AVG(english)FROM tb_demo071),(SELECT AVG(math)FROM tb_demo071) FROM tb_demo071

와 같이 키워드 AS를 통해 지정하는 방법입니다. 두 번째 방법은 테이블 이름 바로 뒤에 테이블의 별칭을 추가하는 것입니다.

SELECT (SELECT AVG(chinese) FROM tb_demo071) AS yuwen ,(SELECT AVG(english) FROM tb_demo071) AS yingyu,(SELECT AVG(math) FROM tb_demo071) AS shuxue FROM tb_demo071

테이블의 별칭 사용 시 몇 가지 주의할 점이 있습니다.
(1) 별칭은 일반적으로 연결에서 테이블을 참조하는 데 사용되는 축약된 테이블 이름입니다. 특정 열의 경우 연결의 여러 테이블에 동일한 이름을 가진 열이 있는 경우 열 이름은 테이블로 정규화되어야 합니다. 이름 또는 테이블 별칭
(2) 테이블 별칭이 정의되면 더 이상 테이블 이름을 사용할 수 없습니다

3개, 여러 결과 세트 병합

SQL 언어에서는 여러 SELECT 문의 쿼리 결과를 결합하여 출력할 수 있습니다. UNION 또는 ALL을 통해 이 두 키워드의 사용 지침은 다음과 같습니다. UNION: 이 키워드를 사용하면 여러 개의 SELECT 문을 결합하여 출력하며, ALL: 이 키워드는 삭제할 수 있습니다. 여러 SELECT 문의 쿼리 결과를 결합하는 데 사용되지만 중복된 행은 삭제되지 않습니다. UNION 또는 ALL 키워드를 사용하면 여러 테이블의 출력을 결합할 때 쿼리 결과의 구조와 데이터 유형이 동일해야 합니다. 또한 UNION을 사용할 때 두 테이블의 필드 수가 동일해야 합니다. 그렇지 않으면 SQL 문에 오류가 발생합니다.

SELECT * FROM tb_demo072_student WHERE id=(SELECT id FROM tb_demo072_class WHERE className = &#39;$_POST[text]&#39;)

4. 단순 중첩 쿼리

하위 쿼리: 하위 쿼리는 단일 값을 반환하는 SELECT 쿼리로 SELECT, INSERT, UPDATE 및 DELETE 문이나 기타 쿼리 문에 중첩됩니다.

e.x:SELECT * FROM tb_demo074_student UNION SELECT * FROM tb_demo074_fasten

내부 조인: 쿼리 결과를 WHERE 절의 쿼리 조건으로 사용하는 것을 내부 조인이라고 합니다

5. 복잡한 중첩 쿼리

여러 테이블 간의 중첩 쿼리 술어 IN을 통해 구현할 수 있습니다. . 구문 형식은 다음과 같습니다.

test_expression[NOT] IN{<br> subquery

}

매개변수 설명: test_expression은 SQL 표현식을 참조하며 하위 쿼리에는 특정 결과 집합의 하위 쿼리가 포함됩니다.Multiple table 임베딩 중첩 쿼리의 원칙: 중첩된 테이블 수에 관계없이 테이블 간에는 일종의 상관 관계가 있어야 합니다. 이 상관 관계는 쿼리를 구현하기 위해 WHERE 절을 통해 설정됩니다.

6. 쿼리 통계에서 중첩 쿼리의 적용

다중 테이블 쿼리를 구현할 때 ANY, SOME, ALL 조건자를 동시에 사용할 수 있습니다. 이러한 조건자를 정량적 비교 조건자라고 하며 비교 연산자와 함께 사용하여 모든 반환 값이 충족되는지 확인할 수 있습니다. 검색 조건 SOME 및 ANY 조건자는 정량적으로 존재하며 검색 조건을 충족하는 반환 값이 있는지 여부에만 중점을 둡니다. 두 조건자는 동일한 의미를 가지며 상호 교환적으로 사용될 수 있습니다. 그리고 검색 요구 사항을 충족하는 조건자가 있는지 여부에만 관심이 있습니다.

e.x:SELECT * FROM tb_demo074_student UNION SELECT * FROM tb_demo074_fasten ORDER BY id

>ANY 하위 쿼리의 특정 값보다 큼 🎜>=ANY 하위 쿼리의 특정 값보다 크거나 같음 🎜< ;=ANY 하위 쿼리의 특정 값보다 작거나 같음 🎜=ANY 하위 쿼리의 특정 값과 같음 🎜!= ANY 또는 a8093152e673feb7aba1828c43532094ANY가 하위 쿼리의 값과 같지 않음 🎜>ALL이 더 큼 하위 쿼리의 모든 값보다 🎜>=ALL은 하위 쿼리의 모든 값보다 크거나 같습니다. 🎜<=ALL은 하위 쿼리보다 작거나 같습니다. 모든 값 ​​🎜=ALL은 모두와 같습니다. 하위 쿼리 🎜!=ALL 또는 a8093152e673feb7aba1828c43532094ALL의 값이 하위 쿼리 🎜🎜🎜🎜🎜의 모든 값과 같지 않습니다. 7. 실제 프로젝트에서 하위 쿼리를 파생 테이블로 사용 🎜🎜 개발 프로세스에서는 비교적 완전한 정보가 포함된 테이블에서 몇 가지 주요 필드만 포함하는 정보 테이블을 파생하는 데 자주 사용됩니다. 이 목표는 🎜🎜
SELECT * FROM tb_demo076_BEIJING GROUP BY name HAVING name=&#39;人民邮电出版社&#39; OR name=&#39;机械工业出版社&#39; UNION SELECT * FROM tb_demo076_BEIJING GROUP BY name HAVING name <>&#39;人民邮电出版社&#39; AND name <>&#39;机械工业再版社&#39; ORDER BY id
🎜와 같은 하위 쿼리를 통해 달성할 수 있습니다. 참고: 하위 쿼리는 다음 규칙을 따라야 합니다.🎜 (1) 비교 연산자에 의해 도입된 내부 하위 쿼리에는 표현식 또는 열 이름이 하나만 포함되며 외부 문의 WHERE 절에 명명된 열은 내부 하위 쿼리에 의해 명명된 열과 호환되어야 합니다🎜( 2) 다음에 의해 도입된 하위 쿼리 변경할 수 없는 비교 연산자(비교 연산자 뒤에 ANY 또는 ALL 키워드가 오지 않음)는 그룹 또는 개별 값이 미리 결정되지 않는 한 GROUP BY 또는 HAVING 절을 포함하지 않습니다. 🎜(3) 일반적으로 EXISTS에서 도입된 SELECT 목록을 사용합니다. *로 구성되며 열 이름을 지정할 필요가 없습니다. (4) 하위 쿼리는 내부적으로 결과를 처리할 수 없습니다. 여덟, 하위 쿼리를 표현식으로 사용합니다. 🎜🎜
SELECT filedlist FROM table1 [INNER] JOIN table2 ON table1.column1 = table2.column1
🎜🎜와 같은 mysql_fetch_array() 함수를 사용할 때 사용자가 테이블 항목에 값을 할당하기가 더 쉽습니다. 9. 하위 쿼리를 사용하여 데이터 연결 🎜🎜🎜
SELECT a.name,a.address,a.date,b.chinese,b.math,b.english FROM tb_demo065 AS a INNER JOIN tb_demo065_tel AS b on a.id=b.id
🎜🎜 10. 다중 테이블 통합 쿼리🎜🎜 SQL 문에서 UNION을 사용하면 동일한 열의 여러 테이블에 한정된 데이터 정보를 표시할 수 있습니다. 🎜🎜
e.x:SELECT * FROM tb_demo074_student UNION SELECT * FROM tb_demo074_fasten

注:使用UNION时应注意以下两点:
(1)在使用UNION运算符组合的语句中,所有选择列表的表达式数目必须相同,如列名、算术表达式及聚合函数等
(2)在每个查询表中,对应列的数据结构必须一样。

十一、对联合后的结果进行排序
为了UNION的运算兼容,要求所有SELECT语句都不能有ORDER BY语句,但有一种情况例外,那就是在最后一个SELECT语句中放置ORDER BY 子句实现结果的最终排序输出。

e.x:SELECT * FROM tb_demo074_student UNION SELECT * FROM tb_demo074_fasten ORDER BY id

使用UNION条件上相对比较苛刻,所以使用此语句时一定要注意两个表项数目和字段类型是否相同

十二、条件联合语句

SELECT * FROM tb_demo076_BEIJING GROUP BY name HAVING name=&#39;人民邮电出版社&#39; OR name=&#39;机械工业出版社&#39; UNION SELECT * FROM tb_demo076_BEIJING GROUP BY name HAVING name <>&#39;人民邮电出版社&#39; AND name <>&#39;机械工业再版社&#39; ORDER BY id

上面语句应用了GROUP BY分组语句和HAVING语句实现条件联合查询。其实现目的是先保证将'人民邮电出版社'和'机械工业出版社'始终位于名单最前列,然后再输出其它的出版社

十三、简单内连接查询

SELECT filedlist FROM table1 [INNER] JOIN table2 ON table1.column1 = table2.column1

其中,filedlist是要显示的字段,INNER表示表之间的连接方式为内连接,table1.column1=table2.column1用于指明两表间的连接条件,如:

SELECT a.name,a.address,a.date,b.chinese,b.math,b.english FROM tb_demo065 AS a INNER JOIN tb_demo065_tel AS b on a.id=b.id

十四、复杂内连接查询
复杂的内连接查询是在基本的内连接查询的基础上再附加一些查询条件,如:

SELECT a.name,a.address,a.date,b.chinese,b.math,b.english FROM tb_demo065 AS a INNER JOIN tb_demo065_tel AS b on a.id=b.id WHERE b.id=(SELECT id FROM  tb_demo065 WHERE tb_demo065.name=&#39;$_POST[text]&#39;)

总之,实现表与表之间的关联的本质是两表之间存在共同的数据项或者相同的数据项,通过WHERE 子句或内连接INNER JOIN … ON 语句将两表连接起来,实现查询

十五、使用外连接实现多表联合查询
(1)LEFT OUTER JOIN表示表之间通过左连接方式相互连接,也可简写成LEFT JOIN,它是以左侧的表为基准故称左连接,左侧表中所有信息将被全部输出,而右侧表信息则只会输出符合条件的信息,对不符合条件的信息则返回NULL

e.x:SELECT a.name,a.address,b.math,b.english FROM tb_demo065 AS A LEFT OUTER JOIN tb_demo065_tel AS b ON a.id=b.id

(2)RIGHT OUTER JOIN表示表之间通过右连接方式相互连接,也可简写成RIGHT JOIN,它是以右侧的表为基准故称右连接,右侧表中所有信息将被全部输出,而左侧表信息则只会输出符合条件的信息,对不符合条件的信息则返回NULL

E.X:SELECT a.name,a.address,b.math,b.english FROM tb_demo065 AS A RIGHT OUTER JOIN tb_demo065_tel AS b ON a.id=b.id

十六、利用IN或NOTIN关键字限定范围

e.x:SELECT * FROM tb_demo083 WHERE code IN(SELECT code FROM tb_demo083 WHERE code BETWEEN &#39;$_POST[text1]&#39; AND &#39;$_POST[text2]&#39;)

利用IN可指定在范围内查询,若要求在某范围外查询可以用NOT IN代替它

十七、由IN引入的关联子查询

e.x:SELECT * FROM tb_demo083 WHERE code IN(SELECT code FROM tb_demo083 WHERE code = &#39;$_POST[text]&#39;)

十八、利用HAVING语句过滤分组数据
HAVING子句用于指定组或聚合的搜索条件,HAVING通常与GROUP BY 语句一起使用,如果SQL语句中不含GROUP BY子句,则HAVING的行为与WHERE子句一样.

e.x:SELECT name,math FROM tb_demo083 GROUP BY id HAVING math > &#39;95&#39;

推荐学习:mysql教程

위 내용은 멋진 이해---MySQL 다중 테이블 쿼리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 sina.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제