mysql 고급(9) 다중 테이블 쿼리

黄舟
풀어 주다: 2017-02-09 15:32:01
원래의
1074명이 탐색했습니다.

MySQL 다중 테이블 쿼리

1 다중 테이블 쿼리에 SELECT 절 사용

SELECT 필드 이름 FROM 테이블 1, 테이블 2... WHERE 테이블 1. 필드 = 테이블 2. field AND other 쿼리 조건

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 필드 정보가 동일하다는 조건을 기반으로 두 테이블 간의 연결이 설정됩니다. 실제 개발에서는 이러한 방식으로 사용하는 것이

을 달성하기 위해 기본 키와 외래 키를 사용하는 것이 가장 좋습니다. 2. 다중 테이블 쿼리에는

과 같은 테이블 별칭을 사용합니다. 🎜>

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='$_POST[textid]'
로그인 후 복사

SQL 언어에서는 두 가지 방법으로 테이블에 대한 별칭을 지정할 수 있습니다.

첫 번째는

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
로그인 후 복사

와 같이 키워드 AS를 통해 지정하는 것입니다. 테이블을 사용하여


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) 테이블 별칭이 정의되면 더 이상 테이블 이름을 사용할 수 없습니다

3. 여러 결과 세트를 병합합니다

SQL 언어에서는 여러 SELECT 문의 쿼리 결과가 UNION 또는 ALL을 통해 결합하여 출력합니다.

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
로그인 후 복사

4가지 단순 중첩 쿼리


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

SELECT id,name,sex,date FROM tb_demo068 WHERE id in(SELECT id FROM tb_demo068 WHERE id='$_POST[test]')
로그인 후 복사

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


5 복합 중첩 쿼리

여러 테이블 간의 중첩 쿼리는 구문 형식은 다음과 같습니다.

test_expression[NOT] IN{
 subquery
}
로그인 후 복사

매개변수 설명: test_expression은 SQL 표현식을 참조하고 하위 쿼리에는 특정 결과 집합이 포함됩니다. 서브 쿼리

다중 테이블 중첩 쿼리의 원칙: 테이블이 몇 개 중첩되더라도 테이블 간에는 일종의 상관 관계가 있어야 합니다. 이 상관 관계는 WHERE 절을 통해 쿼리를 구현합니다

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

다중 테이블 쿼리를 구현할 때 ANY, SOME, ALL 조건자를 동시에 사용할 수 있으며 이러한 조건자를 정량적 비교 조건부라고 하며 결합할 수 있습니다. 비교 연산자와 함께 모든 반환 값이 검색 조건을 충족하는지 확인하는 데 사용됩니다. SOME 및 ANY 조건자는 존재하며 반환 값이 검색 조건을 충족하는지 여부에만 초점을 맞춥니다. ALL 술어는 검색 요구 사항을 충족하는 술어가 있는지 여부에만 관심이 있습니다.

SELECT * FROM tb_demo069_people WHERE uid IN(SELECT deptID FROM tb_demo069_dept WHERE deptName='$_POST[select]')
SELECT a.id,a.name FROM tb_demo067 AS a WHERE id<3)
로그인 후 복사

>ANY는 하위 쿼리의 특정 값보다 큽니다. 🎜>

>=ANY는 하위 쿼리의 값보다 크거나 같습니다. 특정 값

<=ANY는 하위 쿼리의 특정 값보다 작거나 같습니다.

=ANY는 하위 쿼리의 특정 값과 같습니다

!=ANY 또는 < >ANY는 하위 쿼리의 값과 같지 않습니다.

>ALL이 더 큽니다. 하위 쿼리의 모든 값

>=ALL이 하위 쿼리보다 크거나 같음 모든 값 ​​

<=ALL이 작거나 같음 하위 쿼리의 모든 값과 동일

=ALL 하위 쿼리의 모든 값과 동일

!=ALL 또는 <>ALL 하위 쿼리의 모든 값과 동일하지 않음 하위 쿼리

7 하위 쿼리를 사용하여 테이블 파생

실제 프로젝트 개발 프로세스에서는 여러 핵심 필드가 있는 정보 테이블을 보다 완전한 정보만 포함하는 테이블을 파생하는 데 자주 사용됩니다.

SELECT people.name,people.chinese,people.math,people.english FROM (SELECT name,chinese,math,english FROM tb_demo071) AS people
로그인 후 복사

와 같은 하위 쿼리를 통해 이 목표를 달성하세요. 참고: 하위 쿼리는 다음 규칙을 따라야 합니다.

(1)由比较运算符引入的内层子查询只包含一个表达式或列名,在外层语句中的WHERE子句内命名的列必须与内层子查询命名的列兼容

(2)由不可更改的比较运算符引入的子查询(比较运算符后面不跟关键字ANY或ALL)不包括GROUP BY 或 HAVING子句,除非预先确定了成组或单个的值

(3)用EXISTS引入的SELECT列表一般都由*组成,不必指定列名

(4)子查询不能在内部处理其结果

八 使用子查询作表达式

SELECT (SELECT AVG(chinese)FROM tb_demo071),(SELECT AVG(english)FROM tb_demo071),(SELECT AVG(math)FROM tb_demo071) FROM tb_demo071
로그인 후 복사

注:在使用子查询时最好为列表项取个别名,这样可以方便用户在使用mysql_fetch_array()函数时为表项赋值,如

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
로그인 후 복사

九 使用子查询关联数据

SELECT * FROM tb_demo072_student WHERE id=(SELECT id FROM tb_demo072_class WHERE className = &#39;$_POST[text]&#39;)
로그인 후 복사

十 多表联合查询

利用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;
로그인 후 복사


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿