11、子查询_MySQL
bitsCN.com
在SQL语句中,子查询需要放在圆括号中,在执行子查询时,其执行的过程是先查询出来子查询的结果,然后将子查询返回的结果作为其外层查询的查询条件。子查询根据返回的结果,可以分为单行子查询,多行子查询和多列子查询;根据返回的数据与外层查询之间的关系,可以分为相关子查询和不相关子查询。应该说,子查询在实际开发过程中有着非常广泛的应用。
单行子查询
在实际应用中,如果开发人员或者是用户明确知道其SQL语句中使用的子查询返回的结果是一行数据时,即子查询中返回的结果是一个值时,就可以使用算术比较运算符进行子查询的操作。其中,比较运算符包括=(等于)、>=(大于等于)、(大于)、(不等于)、!>(不大于)、!
多行子查询
所谓多行子查询是指子查询中返回的结果集中含有多行数据。当子查询返回的是多行数据时,需要使用多行运算符。多行运算符包括IN、ANY、ALL等运算符。
使用IN运算符,可以将满足列表中满足指定表达式的任何一个值都查询出来。在子查询中使用IN 运算符,则与子查询中查询出来的结果集中的任何一个值匹配的结果都会被查询出来。
ANY运算符也用于多行子查询中。ANY运算符的含义是只要与子查询中的任何一个结果值匹配,其值都会被返回。ANY运算符在使用时需要和比较运算符(=(等于)、>=(大于等于)、(大于)、(不等于))放在一起使用。SOME是ANY的一个同义词。
ALL运算符也用于多行子查询中。ALL运算符的含义是与子查询中的所有的结果值匹配时,其值才会被返回。ALL运算符在使用时需要和比较运算符(=(等于)、>=(大于等于)、(大于)、(不等于))放在一起使用。
多列子查询
所谓多列子查询,是指子查询的语句会返回多个数据列的子查询语句。在WHERE子句中也可以使用将多个属性值用括号括起来的方式实现多列子查询。在多列子查询中,WHERE子句中需要使用括号将多个属性括在一起,多个属性之间需要用逗号分开。
外层查询的WHERE子句中根据多列子查询返回的行数不同,可以选择使用不同的运算符。如果多列子查询中返回的数据行是单行的,即返回的结果值只有一个,则可以使用算术比较运算符;如果子查询中返回的数据行是多行的,即返回的结果值不只一个,则可以使用IN、ANY、ALL运算符。
SELECT teaID,teaName,age,sex,dept,profession FROM T_teacherWHERE (dept,profession) =(SELECT dept,professionFROM T_teacherWHERE teaID = 't103265')
相关子查询
在前面介绍的SQL语句子查询中,都是首先执行内层子查询的语句,然后将子查询返回的结果作为外层查询的查询条件检索数据的。这时的子查询只执行一次。与主查询相关的子查询需要引用主查询里的值,所以必须依赖于主查询,因为这种联系,与主查询相关的子查询不能脱离主查询作为一条独立的查询命令执行。
SELECT j FROM t2 where j IN (SELECT i FROM t1); -- 与主查询无关的子查询SELECT j FROM t2 where (SELECT i FROM t1 WHERE i = j); -- 与主查询相关的子查询
而相关子查询中,子查询需要重复执行。每处理一行外部的查询语句,子查询都会被执行一次。也就是说,相关子查询需要依赖与外层查询,外层查询和子查询之间是存在联系的。与主查询相关的子查询的工作情况是:把值从主查询传递到子查询,看她们是否满足在自查询中给出的条件。通常用EXISTS关键字或者NOT EXISTS关键字实现相关子查询。带有EXISTS关键字的子查询在执行时只会返回逻辑值TRUE或者TALSE,而不会返回任何数据。也就是说,带有EXISTS关键字的子查询不关心返回的是什么数据,而只关心返回的数据“有还是没有”。(测试某个子查询是否返回了数据行)。
使用NOT EXISTS关键字实行相关子查询的查询方法和使用 EXISTS关键字实行相关子查询的查询方法正好相反。如果NOT EXISTS子句的子查询中没有返回的结果,则外层查询的WHERE子句就返回TRUE,则此最终查询的结果集显示出来;如果NOT EXISTS子句的子查询中有返回的结果,则外层查询的WHERE子句就返回FALSE。
在SQL语句中使用子查询
子查询语句除了可以应用在WHERE子句中,也可以应用在SELECT子句、FROM子句、ORDER BY子句、HAVING子句、CREATE TABLE 语句、CREATE VIEW 语句、INSERT 语句、UPDATE语句、 DELETE等语句中。
在SELECT子句中使用子查询,查询学生编号为s102203的成绩信息
SELECT R.stuID,(SELECT stuNameFROM T_studentWHERE stuID = R.stuID) AS stuName, R.result,R.curIDFROM T_result RWHERE R.stuID = 's102203'ORDER BY R.result ASC
在FROM子句中使用子查询,该子查询查询出来的结果集组成一个临时的数据表。查询学生编号为s102203学生的选课成绩信息
SELECT R.stuID,C.curID, C.curName,R.resultFROM T_curriculum C,(SELECT curID,stuID,resultFROM T_result)RWHERE R.curID=C.curIDAND R.stuID = 's102203'ORDER BY R.result ASC
在HAVING子句中可以使用子查询,该子查询查询出来的结果集组成一个临时的数据表。查询以学生编号s2开头的学生的平均成绩。
SELECT R.stuID, AVG(R.result)FROM T_result R,T_curriculum CWHERE R.curID=C.curIDGROUP BY R.stuIDHAVING R.stuID IN(SELECT stuIDFROM T_studentWHERE stuID LIKE 's2%')ORDER BY R.stuID
多重子查询允许查询条件中有多个子查询语句。查询教师信息表中职称与教师编号为t181585教师相同但工资比该教师高的教师信息。
SELECT teaID,teaName,age,sex,dept,profession,salaryFROM T_teacherWHERE profession =(SELECT professionFROM T_teacherWHERE teaID = 't181585')ANDsalary>(SELECT salaryFROM T_teacherWHERE teaID = 't181585')
在CREATE TABLE语句中使用子查询实现数据表的复制,通过在CREATE TABLE语句中使用子查询可以在建立一张新的数据表的同时将原有表中的数据插入到新建的数据表中,即实现数据表中数据的复制功能。语法格式如下:
CREATE TABLE 表名AS SELECT语句

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









이 기사는 MySQL의 Alter Table 문을 사용하여 열 추가/드롭 테이블/열 변경 및 열 데이터 유형 변경을 포함하여 테이블을 수정하는 것에 대해 설명합니다.

기사는 인증서 생성 및 확인을 포함하여 MySQL에 대한 SSL/TLS 암호화 구성에 대해 설명합니다. 주요 문제는 자체 서명 인증서의 보안 영향을 사용하는 것입니다. [문자 수 : 159]

기사는 MySQL에서 파티셔닝, 샤딩, 인덱싱 및 쿼리 최적화를 포함하여 대규모 데이터 세트를 처리하기위한 전략에 대해 설명합니다.

기사는 MySQL Workbench 및 Phpmyadmin과 같은 인기있는 MySQL GUI 도구에 대해 논의하여 초보자 및 고급 사용자를위한 기능과 적합성을 비교합니다. [159 자].

이 기사에서는 Drop Table 문을 사용하여 MySQL에서 테이블을 떨어 뜨리는 것에 대해 설명하여 예방 조치와 위험을 강조합니다. 백업 없이는 행동이 돌이킬 수 없으며 복구 방법 및 잠재적 생산 환경 위험을 상세하게합니다.

기사는 외국 열쇠를 사용하여 데이터베이스의 관계를 나타내고 모범 사례, 데이터 무결성 및 피할 수있는 일반적인 함정에 중점을 둡니다.

이 기사에서는 PostgreSQL, MySQL 및 MongoDB와 같은 다양한 데이터베이스에서 JSON 열에서 인덱스를 작성하여 쿼리 성능을 향상시킵니다. 특정 JSON 경로를 인덱싱하는 구문 및 이점을 설명하고 지원되는 데이터베이스 시스템을 나열합니다.

기사는 준비된 명령문, 입력 검증 및 강력한 암호 정책을 사용하여 SQL 주입 및 무차별 적 공격에 대한 MySQL 보안에 대해 논의합니다 (159 자)
