찾다

4.1 简单子查询 究竟什么是子查询?子查询有什么用?带着这样的疑问,我们不妨先来解决本章第一个问题。 学员信息表(stuInfo)和学员成绩表(stuMarks)的数据。 stuNamestuNostuSexstuAgestuSeatstuAddress 张秋丽s25301男181北京海淀 李思文s25303女222河

4.1 简单子查询

  究竟什么是子查询?子查询有什么用?带着这样的疑问,我们不妨先来解决本章第一个问题。

  学员信息表(stuInfo)和学员成绩表(stuMarks)的数据。

stuName stuNo stuSex stuAge stuSeat stuAddress

张秋丽 s25301 男 18 1 北京海淀

李思文 s25303 女 22 2 河南洛阳

李文才 s25302 男 85 3 地址不详

欧阳俊雄 s25304 男 28 4 新疆

梅超风 s25318 女 23 5 地址不详

 

ExamNo stuNo writtenExam labExam

s271811 s25303 90 58

s271813 s25302 60 90

s271816 s25301 87 82

  问题:查看年龄比“李思文”大的学员,要求显示这些学员的信息。

  实现方法一:采用T-SQL变量实现,SQL语句如示例1所示。

  示例1

  Declare @age int    ---定义变量,用于存放“李思文”的年龄

  Select @age = stuAge From stuInfo where stuName = '李思文'   ---求出“李思文”的年龄

  Select * from stuInfo where stuAge > @age   ---筛选比“李思文”年龄大的学员

  GO

  实现方法二:采用子查询实现,SQL语句如示例2所示。

  我们可以合并上述两步。

  将语句  Select * from stuInfo where stuAge > @age

  替换为如示例2所示的语句

  示例2

  Select * from stuInfo Where stuAge > ( select stuAge from stuInfo where stuName > '李思文')

  Go

  你一定明白了,上述查询中的“( select stuAge from stuInfo where stuName > '李思文')”部分,就是子查询,因为它嵌入到查询中作为Where条件的一部分。

  所以它在Where语句中的一般用法如下。

  Select ··· from 表1 Where 字段1 > (子查询)

  除了“>” 号外,还可以使用其他运算符号,习惯上,外面的查询称为父查询,括号中嵌入的查询称为子查询。SQL Server 执行时,先执行子查询部分,求出子查询部分的值,然后再执行整个父查询。它的执行效率比采用SQL变量实现的方案要高,所以推荐采用子查询。因为子查询作为Where条件的一部分,所以还可以和Update、Insert、Delete一起使用,语法类似于Select语句。

  注: 将子查询和比较运算符联合使用,必须保证子查询返回的值不能多于一个。

  上述子查询将多个结果集合并在一起,除此之外,还可以将多表间的数据组合在一起,从而替换连接(Join)查询。

  问题:查询笔试刚好通过60分的学员名单。

  实现方法一: 采用表连接。

  示例3

  Select stuName from stuInfo inner join stuMarks

    On stuInfo.stuNo = stuMarks.stuNo where writtenExam = 60

  GO

  除了采用表连接以外,还可以采用子查询替换上述连接。

  实现方法二:采用子查询

  示例4

  Select stuName From stuInfo where stuNo = (select stuNo from stuMarks where writtenExam = 60)  GO

  注:一般来说,表连接都可以用子查询替换,但反过来说却不一定,有的子查询不能用表连接来替换。子查询比较灵活、方便,形式多样,适合于作为查询的筛选条件。而表连接更适合于查看多表的数据。

4.2 IN 和 Not In 子查询

  使用“=”、“>” 等比较运算符时,要求子查询只能返回一条或空的记录。在SQL Server中,香港虚拟主机,当子查询跟随在 = 、!= 、、>=之后,不允许子查询返回多条记录。例如上例查询笔试刚好及格的学员信息,成绩表中刚好只有一条记录满足条件:李文才(s25302)的笔试成绩刚好60分。如果有多条记录满足条件,既有多个学员的笔试成绩为60分,采用上述子查询将出现编译错误。

  示例5

  /*-- 采用in子查询查询参加考试的学员名单 --*/

  Select stuName from stuInfo where stuNo in (select stuNo from stuMarks) GO

  同理,如果希望查询未参加考试的学员名单呢?您一定想到了,加上否定的Not 即可。

  /*-- 采用Not in 子查询,查看未参加考试的学员名单 --*/

  Select stuName from stuInfo where stuNo Not in (select stuNo from stuMarks) GO

4.3 Exists 和 Not Exists 子查询

  Exists 语句我们并不陌生,在学习创建库和创建表的语句时曾提前用过,它是一个存在检测的子查询语句。例如,如果存在数据库stuDB,则先删除它,然后重新创建。

  IF Exists (select * from sysDatabases where name = 'stuDB')

    Drop DataBase stuDB

  Create DataBase stuDB

  ··· 创建的库代码略

  从理论上讲,Exists 也可以作为Where语句的子查询,但一般用于IF语句的存在检测。其基本语法如下:

  IF Exists(子查询)

    语句

  如果子查询的结果非空,则Exists(子查询)将返回真(true),否则返回假(false)。

  问题:检查本次考试,本班如果有人笔试成绩达到80分以上,则每人提2分,否则,每人允许提5分。

  示例8

  /*-- 采用Exists子查询,进行酌情加分 --*/

  IF Exists (select * from stuMarks where writtenExam > 80)

    Begin

    print '本班有人笔试成绩高于80分,每人只加2分,加分后的成绩为:'

    Update stuMarks set writtenExam = writtenExam + 2

    Select * from stuMarks

    End

  Else

    Begin

    print '本班无人笔试成绩高于80分,每人可以加5分,加分后的成绩为:'

    Update stuMarks set writtenExam = writtenExam + 5

    Select * from stuMarks

    End

  Go

  Exists 和 in 一样,同样允许添加Not取反,表示不存在。

  问题,检查本次考试,本班如果没有一人通过考试(笔试和机试成绩都>60分),则试题偏难,每人加3分,否则,每人只加1分。

  示例9

  /*--- 采用Not Exists子查询,根据试题难度加分 ---*/

  If Not Exists ( select * from stuMarks where writtenExam > 60 and LabExam > 60)

    Begin 

      Print '本班无人通过考试,试题骗难,每人加3分,加分后成绩为:'

      Update stuMarks set writtenExam = writtenExam + 3 , labExam = labExam + 3

      Select * from stuMarks

    End

  Else

    Begin

      Print '本班考试成绩一般,每人只加1分,加分后的成绩为:'

      Update stuMarks set writtenExam = writtenExam + 1, labExam = labExam + 1

      Select * from stuMarks

    End

  Go

4.4 T-SQL 语句的综合应用

  假定目前本次考试学员信息表(stuInfo)和学员成绩表(stuMarks)的原始数据如下:

stuName stuNo stuSex stuAge stuSeat stuAddress

张秋丽 s25301 男 18 1 北京海淀

李思文 s25303 女 22 2 河南洛阳

李文才 s25302 男 85 3 地址不详

欧阳俊雄 s25304 男 28 4 新疆

梅超风 s25318 女 23 5 地址不详

 

 

 

 

ExamNo stuNo writtenExam LabExam

s271811 s25303 93 59

s271813 s25302 63 91

s271816 s25301 90 83

s271817 s25318 63 53

 

 

 

 

  问题:

  (1)统计本次考试的缺考情况,结果如图第一个记录集所示。

应到人数 实到人数 缺考人数

5 4 1

 

 

姓名 学号 笔试成绩 机试成绩 是否通过

张秋丽 s25301 90 89 是

李思文 s25303 93 65 是

李文才 s25302 63 97 是

欧阳俊雄 s25304 缺考 缺考 否

梅超风 s25318 63 59 否

 

 

 

 

总人数 通过人数 通过率

5 3 60%

 

 

  (2)提取学员的成绩信息并保存结果,香港服务器,包括学员姓名、学号、笔试成绩、机试成绩、是否通过。

  (3)比较笔试平均分和机试平均分,较低者进行循环提分,但提分后最高分不能超过97分。

  (4)提分后,香港空间,统计学员的成绩和通过情况,如上图第二个记录集所示。

  (5)提分后统计学员的通过率情况,如上图第三个记录集所示。

  示例10

  /*--- 本次考试的原始数据 ---*/

  select * from stuInfo

  select * from stuMarks

  /*--- 统计考试缺考情况 ---*/

  select 应到人数=(select Count(*) from stuInfo),

      实到人数=(select count(*) from stuMarks),

      缺考人数=((select count(*) from stuInfo) - (select count(*) from stuMarks))

  /*--- 统计考试通过情况,并将统计结果存放在新表newTable中 ---*/

  IF Exists (select * from sysobjects where name = 'newTable')

    Drop table newTable

  Select stuName, stuInfo.stuNo, writtenExam, labExam,

    isPass = Case

        When writtenExam >= 60 and labExam >=60 Then 1

        Else 0

        End

    Info newTable from stuInfo Left Join stuMarks

      On stuInfo.stuNo = stuMarks.stuNo

  /*--- 酌情加分:比较笔试和机试平均分,哪科偏低,就给哪科提分 ---*/

  Declare @avgWritten numeric (4,1), @avgLab numeric(4,1) ---定义变量存放笔试和机试平均分

  Select @avgWritten = Avg(writtenExam) from newTable where writtenExam IS Not null

  Select @avgLab = Avg(labExam) from newTable where labExam IS Not null

  IF @avgWritten

    While (1=1) ---循环给笔试加分,最高分不能超过97分

      Begin

        Update newTable set writtenExam = writtenExam + 1

        If(select Max(writtenExam) From newTable ) >= 97

          Break

      End

  Else

    While(1=1)  ---循环给机试加分,最高分不能超过97分

      Begin

        Update newTable set labExam = labExam + 1

        If(select Max(labExam) from newTable) >= 97

          Break

      End

  --- 因为提分,所以需要更新isPass(是否通过)列的数据

  Update newTable

    Set isPass = Case

      When writtenExam >= 60 and labExam >= 60 Then 1

      Else 0

    End

  /*--- 显示考试最终通过情况 ---*/

  Select 姓名=stuName, 学号=stuNo

    笔试成绩=Case

      when writtenExam IS null then '缺考'

      Else convert(varchar(5), writtenExam)

    End

    机试成绩=Case

      When labExam IS null then '缺考'

      Else convert(varchar(5),labExam)

    End

    是否通过=Case

      When isPass = 1 then '是'

      Else '否'

    End

  From newTable

  /*--- 显示通过率及通过人数 ---*/

  Select 总人数 = Count(*) , 通过人数 = Sum(isPass),

    通过率 = (convert (varchar(5), avg(isPass*100)) + '%' ) From newTable

  Go

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
InnoDB Redo Logs 및 Undo Logs의 역할을 설명하십시오.InnoDB Redo Logs 및 Undo Logs의 역할을 설명하십시오.Apr 15, 2025 am 12:16 AM

InnoDB는 Redologs 및 Undologs를 사용하여 데이터 일관성과 신뢰성을 보장합니다. 1. Redologs는 사고 복구 및 거래 지속성을 보장하기 위해 데이터 페이지 수정을 기록합니다. 2. 결점은 원래 데이터 값을 기록하고 트랜잭션 롤백 및 MVCC를 지원합니다.

설명 출력 (유형, 키, 행, 추가)에서 찾아야 할 주요 메트릭은 무엇입니까?설명 출력 (유형, 키, 행, 추가)에서 찾아야 할 주요 메트릭은 무엇입니까?Apr 15, 2025 am 12:15 AM

설명 명령에 대한 주요 메트릭에는 유형, 키, 행 및 추가가 포함됩니다. 1) 유형은 쿼리의 액세스 유형을 반영합니다. 값이 높을수록 Const와 같은 효율이 높아집니다. 2) 키는 사용 된 인덱스를 표시하고 NULL은 인덱스가 없음을 나타냅니다. 3) 행은 스캔 한 행의 수를 추정하여 쿼리 성능에 영향을 미칩니다. 4) Extra는 최적화해야한다는 Filesort 프롬프트 사용과 같은 추가 정보를 제공합니다.

설명에서 임시 상태를 사용하고 피하는 방법은 무엇입니까?설명에서 임시 상태를 사용하고 피하는 방법은 무엇입니까?Apr 15, 2025 am 12:14 AM

Temporary를 사용하면 MySQL 쿼리에 임시 테이블을 생성해야 할 필요성이 있으며, 이는 별개의, 그룹 비 또는 비 인덱스 열을 사용하여 순서대로 발견됩니다. 인덱스 발생을 피하고 쿼리를 다시 작성하고 쿼리 성능을 향상시킬 수 있습니다. 구체적으로, 설명 출력에 사용되는 경우, MySQL은 쿼리를 처리하기 위해 임시 테이블을 만들어야 함을 의미합니다. 이것은 일반적으로 다음과 같은 경우에 발생합니다. 1) 별개 또는 그룹을 사용할 때 중복 제거 또는 그룹화; 2) OrderBy가 비 인덱스 열이 포함되어있을 때 정렬하십시오. 3) 복잡한 하위 쿼리 또는 조인 작업을 사용하십시오. 최적화 방법은 다음과 같습니다. 1) Orderby 및 GroupB

다른 SQL 트랜잭션 격리 수준 (커밋되지 않은 읽기, 읽기, 커밋 가능한 읽기, 반복 가능한 읽기, 시리얼이즈 가능) 및 MySQL/innoDB에서의 의미를 설명하십시오.다른 SQL 트랜잭션 격리 수준 (커밋되지 않은 읽기, 읽기, 커밋 가능한 읽기, 반복 가능한 읽기, 시리얼이즈 가능) 및 MySQL/innoDB에서의 의미를 설명하십시오.Apr 15, 2025 am 12:11 AM

MySQL/InnoDB는 4 개의 트랜잭션 격리 수준을 지원합니다. Readuncommitted, ReadCommitted, ReturableRead 및 Serializable. 1. READUCMITTED는 커밋되지 않은 데이터를 읽을 수 있으므로 더러운 판독 값을 유발할 수 있습니다. 2. ReadCommitted는 더러운 읽기를 피하지만 반복 할 수없는 독서가 발생할 수 있습니다. 3. RepeatableRead는 더러운 읽기와 반복 할 수없는 독서를 피하는 기본 레벨이지만 팬텀 독서가 발생할 수 있습니다. 4. 직렬화 가능한 것은 모든 동시성 문제를 피하지만 동시성을 줄입니다. 적절한 격리 수준을 선택하려면 균형 잡힌 데이터 일관성 및 성능 요구 사항이 필요합니다.

MySQL 대 기타 데이터베이스 : 옵션 비교MySQL 대 기타 데이터베이스 : 옵션 비교Apr 15, 2025 am 12:08 AM

MySQL은 웹 응용 프로그램 및 컨텐츠 관리 시스템에 적합하며 오픈 소스, 고성능 및 사용 편의성에 인기가 있습니다. 1) PostgreSQL과 비교하여 MySQL은 간단한 쿼리 및 높은 동시 읽기 작업에서 더 잘 수행합니다. 2) Oracle과 비교할 때 MySQL은 오픈 소스와 저렴한 비용으로 인해 중소 기업에서 더 인기가 있습니다. 3) Microsoft SQL Server와 비교하여 MySQL은 크로스 플랫폼 응용 프로그램에 더 적합합니다. 4) MongoDB와 달리 MySQL은 구조화 된 데이터 및 트랜잭션 처리에 더 적합합니다.

MySQL Index Cardinality는 쿼리 성능에 어떤 영향을 미칩니 까?MySQL Index Cardinality는 쿼리 성능에 어떤 영향을 미칩니 까?Apr 14, 2025 am 12:18 AM

MySQL Index Cardinality는 쿼리 성능에 중대한 영향을 미칩니다. 1. 높은 카디널리티 인덱스는 데이터 범위를보다 효과적으로 좁히고 쿼리 효율성을 향상시킬 수 있습니다. 2. 낮은 카디널리티 인덱스는 전체 테이블 스캔으로 이어질 수 있으며 쿼리 성능을 줄일 수 있습니다. 3. 관절 지수에서는 쿼리를 최적화하기 위해 높은 카디널리티 시퀀스를 앞에 놓아야합니다.

MySQL : 신규 사용자를위한 리소스 및 튜토리얼MySQL : 신규 사용자를위한 리소스 및 튜토리얼Apr 14, 2025 am 12:16 AM

MySQL 학습 경로에는 기본 지식, 핵심 개념, 사용 예제 및 최적화 기술이 포함됩니다. 1) 테이블, 행, 열 및 SQL 쿼리와 같은 기본 개념을 이해합니다. 2) MySQL의 정의, 작업 원칙 및 장점을 배우십시오. 3) 인덱스 및 저장 절차와 같은 기본 CRUD 작업 및 고급 사용량을 마스터합니다. 4) 인덱스의 합리적 사용 및 최적화 쿼리와 같은 일반적인 오류 디버깅 및 성능 최적화 제안에 익숙합니다. 이 단계를 통해 MySQL의 사용 및 최적화를 완전히 파악할 수 있습니다.

실제 MySQL : 예 및 사용 사례실제 MySQL : 예 및 사용 사례Apr 14, 2025 am 12:15 AM

MySQL의 실제 응용 프로그램에는 기본 데이터베이스 설계 및 복잡한 쿼리 최적화가 포함됩니다. 1) 기본 사용 : 사용자 정보 삽입, 쿼리, 업데이트 및 삭제와 같은 사용자 데이터를 저장하고 관리하는 데 사용됩니다. 2) 고급 사용 : 전자 상거래 플랫폼의 주문 및 재고 관리와 같은 복잡한 비즈니스 로직을 처리합니다. 3) 성능 최적화 : 인덱스, 파티션 테이블 및 쿼리 캐시를 사용하여 합리적으로 성능을 향상시킵니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse용 SAP NetWeaver 서버 어댑터

Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.