선택(SQL)
Select (SQL)SQL SELECT 문은 하나 이상의 테이블에서 레코드 결과 집합을 반환한다.[1][2]null
SELECT 문은 하나 이상의 데이터베이스 테이블 또는 데이터베이스 보기에서 0개 이상의 행을 검색한다.대부분의 애플리케이션에서,SELECT
가장 일반적으로 사용되는 DML(데이터 조작 언어) 명령이다.SQL은 선언적인 프로그래밍 언어인 만큼,SELECT
쿼리는 결과 집합을 지정하지만 계산 방법은 지정하지 마십시오.데이터베이스는 쿼리를 실행, 데이터베이스 버전 및 데이터베이스 소프트웨어에 따라 다를 수 있는 "쿼리 계획"으로 변환한다.이 기능을 "쿼리 최적화 도구"라고 하는데, 이는 해당 제약조건 내에서 쿼리에 대해 가능한 최선의 실행 계획을 찾는 것을 담당하기 때문이다.null
SELECT 문에는 많은 선택 조항이 있다.
SELECT
절은 쿼리에 의해 반환되어야 하는 열 또는 SQL 식 목록이다.이것은 대략 관계 알제브래프로젝션 작업이다.AS
선택적으로 의 각 열 또는 식에 대한 별칭을 제공SELECT
절이것은 관계 대수 이름 바꾸기 연산이다.FROM
데이터를 가져올 테이블을 지정하십시오.[3]WHERE
검색할 행을 지정하십시오.이것은 대략 관계 대수 선택 연산이다.GROUP BY
각 그룹에 집계 함수를 적용할 수 있도록 속성을 공유하는 행을 그룹화하십시오.HAVING
GROUP BY 절에 의해 정의된 그룹 중에서 선택한다.ORDER BY
반환된 행의 순서 지정 방법을 지정하십시오.
개요
SELECT
SQL에서 가장 일반적인 작업으로 "쿼리"라고 불린다.nullSELECT
하나 이상의 테이블 또는 식에서 데이터를 검색하십시오.표준SELECT
문장은 데이터베이스에 지속적인 영향을 미치지 않는다.다음과 같은 일부 비표준 구현SELECT
다음과 같은 지속적인 효과를 가질 수 있다.SELECT INTO
일부 데이터베이스에 제공된 구문.[4]
쿼리를 통해 사용자는 원하는 데이터를 기술할 수 있으며, 데이터베이스 관리 시스템(DBMS)은 원하는 결과를 생성하는 데 필요한 물리적 작업을 계획, 최적화 및 수행할 수 있다.null
쿼리는 일반적으로 다음 항목 바로 뒤에 최종 결과에 포함할 열 목록을 포함한다.SELECT
키워드별표(")*
") 쿼리가 쿼리된 테이블의 모든 열을 반환해야 함을 지정하는 데 사용할 수 있다.nullSELECT
SQL에서 가장 복잡한 문이며, 선택적 키워드와 절에는 다음이 포함된다.
- 그
FROM
데이터를 검색할 테이블을 나타내는 조항.그FROM
조항은 선택사항을 포함할 수 있다.JOIN
표 결합 규칙을 지정하는 하위 절. - 그
WHERE
절에는 조회가 반환하는 행을 제한하는 비교 술어가 포함되어 있다.그WHERE
절은 비교 술어가 True로 평가되지 않는 결과 집합에서 모든 행을 제거한다. - 그
GROUP BY
절에서는 공통 값을 갖는 행을 더 작은 행 집합으로 투영한다.nullGROUP BY
종종 SQL 집계 기능과 함께 사용하거나 결과 집합에서 중복 행을 제거하기 위해 사용된다.그WHERE
조항이 적용되다GROUP BY
절 - 그
HAVING
절에는 에서 생성된 행을 필터링하는 데 사용되는 술어가 포함되어 있다.GROUP BY
절왜냐하면 그 결과물에 작용하기 때문이다.GROUP BY
절, 집계 함수는 에서 사용될 수 있다.HAVING
조항의 술어 - 그
ORDER BY
절은 결과 데이터를 정렬하는 데 사용할 열[s]과 이를 정렬할 방향(하강 또는 하강)을 식별한다.an 없이ORDER BY
절, SQL 쿼리에 의해 반환된 행의 순서가 정의되지 않음. - 그
DISTINCT
키워드[5] -[6] 중복 데이터 제거
의 다음 예SELECT
query는 값비싼 책들의 목록을 반환한다.쿼리는 가격 열이 100.00보다 큰 값을 포함하는 북 테이블에서 모든 행을 검색한다.결과는 제목별로 오름차순으로 정렬된다.선택 목록의 별표(*)는 북 테이블의 모든 열이 결과 집합에 포함되어야 함을 나타낸다.null
선택 * From 책 어디에 값을 매기다 > 100.00 주문 BY 칭호를 붙이다;
아래 예제는 책 목록과 각 책과 관련된 작가 수를 반환하여 여러 표, 그룹화 및 집계에 대한 질의를 보여준다.null
선택 책.칭호를 붙이다 AS 제목, 수를 세다(*) AS 작가들 From 책 가입하다 book_author 켜기 책.isbn = book_author.isbn 그룹 BY 책.칭호를 붙이다;
예제 출력은 다음과 유사할 수 있다.
제목 작성자 -------------------------------------- SQL 예시와 가이드 4 SQL 1의 기쁨 SQL 2 Pitfalls 소개
isbn이 두 테이블의 유일한 공통 열 이름이고 제목이 책 테이블에만 있다는 전제조건 하에서, 위 쿼리를 다음과 같은 형태로 다시 쓸 수 있다.
선택 칭호를 붙이다, 수를 세다(*) AS 작가들 From 책 내추럴 가입하다 book_author 그룹 BY 칭호를 붙이다;
그러나 많은[quantify] 공급업체는 이 접근법을 지원하지 않거나 자연 결합이 효과적으로 작동하기 위해 특정 칼럼 이름 지정 규칙을 요구한다.null
SQL은 연산자와 저장된 값의 값을 계산하는 함수를 포함한다.SQL은 다음의 예에서와 같이 선택 목록의 표현을 사용하여 데이터를 투영할 수 있도록 허용하는데, 100.00 이상에 해당하는 장부 목록을 가격의 6%로 계산된 판매세액이 포함된 부가적인 sales_tax 칼럼과 함께 반환한다.null
선택 isbn, 칭호를 붙이다, 값을 매기다, 값을 매기다 * 0.06 AS sales_tax From 책 어디에 값을 매기다 > 100.00 주문 BY 칭호를 붙이다;
서브쿼리
쿼리는 관계 연산자 또는 집계 함수를 통해 하나의 쿼리의 결과를 다른 쿼리에서 사용할 수 있도록 중첩될 수 있다.중첩된 쿼리는 하위 쿼리로도 알려져 있다.조인 및 기타 테이블 연산이 많은 경우 연산적으로 우수(즉, 더 빠른) 대안을 제공하는 반면, 하위 쿼리의 사용은 유용하거나 필요할 수 있는 실행 계층 구조를 도입한다.다음 예에서 집계 함수는AVG
하위 질의 결과를 입력하여 수신:
선택 isbn, 칭호를 붙이다, 값을 매기다 From 책 어디에 값을 매기다 < (선택 AVG(값을 매기다) From 책) 주문 BY 칭호를 붙이다;
하위 쿼리는 외부 쿼리의 값을 사용할 수 있으며, 이 경우 상관 관계 하위 쿼리로 알려져 있다.null
1999년부터 SQL 표준은 공통 테이블 표현식(IBM DB2 버전 2 구현 후 명명 및 설계, Oracle은 이러한 서브쿼리 팩토링이라고 함)이라는 명명된 서브쿼리를 허용한다.CTE는 또한 자신을 언급함으로써 재귀적일 수 있다; 결과 메커니즘은 트리나 그래프 통과를 허용한다(관계로 표현될 때), 그리고 더 일반적으로 고정점 계산을 한다.null
파생표
파생 테이블은 FROM 절의 SQL 하위 쿼리를 참조하는 것이다.본질적으로 파생된 표는 에서 선택하거나 결합할 수 있는 하위 질의어다.파생 테이블 기능을 통해 사용자는 하위 쿼리를 테이블로 참조할 수 있다.파생된 표를 인라인 보기 또는 목록에서 선택이라고도 한다.null
다음 예에서 SQL 문은 초기 북스 테이블에서 파생 테이블 "Sales"로 조인하는 것을 포함한다.이 파생 테이블은 ISBN을 사용하여 북스 테이블에 가입하는 관련 도서 판매 정보를 캡처한다.결과적으로, 파생된 표는 결과 집합에 추가 열(판매 품목 수 및 도서를 판매한 회사)을 제공한다.null
선택 b.isbn, b.칭호를 붙이다, b.값을 매기다, 판매의.항목_항목, 판매의.company_nm From 책 b 가입하다 (선택 SUM(항목_Sold) 항목_Sold, 회사_Nm, ISBN From 북_세일즈 그룹 BY 회사_Nm, ISBN) 판매의 켜기 판매의.isbn = b.isbn
예
표 "T" | 질의 | 결과 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| SELECT * FROM T; |
| ||||||||||||
| SELECT C1 FROM T; |
| ||||||||||||
| SELECT * FROM T WHERE C1 = 1; |
| ||||||||||||
| SELECT * FROM T ORDER BY C1 DESC; |
| ||||||||||||
존재하지 않음 | SELECT 1+1, 3*2; |
|
T 테이블 지정, 쿼리 SELECT * FROM T
표의 모든 행의 모든 요소를 표시한다.null
동일한 테이블에서 쿼리는SELECT C1 FROM T
표의 모든 행의 C1 열에서 요소가 나타난다.이것은 관계 대수에서의 투영과 유사하지만, 일반적인 경우 결과는 중복 행을 포함할 수 있다.이것은 일부 데이터베이스 용어로 수직 파티션이라고도 하며, 지정된 필드 또는 열만 보도록 쿼리 출력을 제한한다.null
동일한 테이블에서 쿼리는SELECT * FROM T WHERE C1 = 1
C1열의 값이 '1'로 표시되는 모든 행의 모든 요소들이 – 관계 대수학 용어로는 WHERE 절 때문에 선택이 수행될 것이다.이것은 또한 수평 파티션이라고도 하며, 지정된 조건에 따라 질의에 의한 행 출력을 제한한다.null
두 개 이상의 테이블에서 결과 집합은 행의 모든 조합이 될 것이다.두 테이블이 T1과 T2라면SELECT * FROM T1, T2
모든 T2 행과 T1 행의 모든 조합이 이루어질 것이다.예를 들어 T1이 3행이고 T2가 5행이면 15행이다.null
표준은 아니지만, 대부분의 DBMS는 하나의 행이 있는 가상 테이블을 사용하는 척하여 테이블 없이 선택 절을 사용할 수 있다.이것은 주로 테이블이 필요하지 않은 곳에서 계산을 수행하는 데 사용된다.null
SELECT 절은 이름별로 속성(열) 목록을 지정하거나 "모든 속성"을 의미하는 와일드카드 문자("*")를 지정한다.null
결과 행 제한
종종 반환되는 행의 최대 수를 나타내는 것이 편리하다.이는 쿼리가 예상보다 많은 정보를 반환하는 경우 테스트에 사용하거나 과도한 리소스 사용을 방지하기 위해 사용될 수 있다.이를 위한 접근 방식은 공급업체마다 다를 수 있다.null
ISO SQL:2003에서 결과 집합은 다음을 사용하여 제한될 수 있다.
ISO SQL:2008은FETCH FIRST
절null
Postgre에 따르면SQL v.9 설명서, SQL 창 함수는 "현재 행과 어떻게든 관련된 테이블 행 집합에 걸쳐 계산을 수행"하며 집계 함수와 유사한 방식으로 수행된다.[7]그 이름은 신호 처리 창 기능을 불러온다.창 기능 호출에는 항상 OUP 절이 포함되어 있다.null
ROW_NUMBER() 창 기능
ROW_NUMBER() OVER
예를 들어, 10개 이하의 행을 반환하기 위해 반환된 행의 간단한 표에 사용할 수 있다.
선택 * From ( 선택 ROW_NUMBER() 오버 (주문 BY sort_key ASC) AS low_number, 기둥 From 탭 이름 ) AS foo 어디에 low_number <= 10
ROW_NUMBER는 비결정론적일 수 있다. sort_key가 고유하지 않으면 쿼리를 실행할 때마다 sort_key가 동일한 모든 행에 다른 행 번호를 할당할 수 있다.sort_key가 고유하면 각 행에는 항상 고유한 행 번호가 부여된다.null
LANK() 창 기능
그RANK() OVER
윈도우 기능은 ROW_NUMBER와 같이 작동하지만, 동점 조건의 경우, 예를 들어 상위 10명 이하의 어린이를 반환하는 경우, n개 행보다 많거나 적게 반환할 수 있다.
선택 * From ( 선택 랭크() 오버 (주문 BY 나이를 먹다 ASC) AS 순위, person_id, person_name, 나이를 먹다 From 사람 ) AS foo 어디에 순위 <= 10
위의 코드는 열 줄 이상을 반환할 수 있는데, 예를 들어 같은 나이의 두 사람이 있을 경우 열 한 줄을 반환할 수 있다.null
FETCH First 절
ISO SQL:2008 결과 제한은 다음 예와 같이 지정할 수 있으므로FETCH FIRST
절null
선택 * From T FETCH 퍼스트 10 행 오직
이 조항은 현재 CA DATACOM/DB 11, IBM DB2, SAP SQL Anywhere, Postgre에서 지원되고 있다.SQL, EffiProz, H2, HSQLDB 버전 2.0, Oracle 12c 및 Mimer SQL.
Microsoft SQL Server 2008 이상에서는 를 지원하지만, 의 일부로 간주된다.ORDER BY
절그ORDER BY
,OFFSET
그리고FETCH FIRST
이 용법에는 모든 조항이 필요하다.null
선택 * From T 주문 BY acolumn DECK 오프셋 0 행 FETCH 퍼스트 10 행 오직
비표준 구문
일부 DBMS는 SQL 표준 구문 대신 또는 SQL 표준 구문 외에 비표준 구문을 제공한다.아래에는 다양한 DBMS에 대한 단순 제한 질의의 변형들이 나열되어 있다.
세트 로카운트 10 선택 * From T | MS SQL Server(T에서 상위 10개 * 선택에는 해당되지 않지만 Microsoft SQL Server 6.5에서도 작동함) |
선택 * From T 한계 10 오프셋 20 | Netezza, MySQL, MariaDB, SAP SQL Anywhere, PostgreSQL(또한 표준 지원, 버전 8.4 이후), SQLite, HSQLDB, H2, Vertica, Polyhedra, Couchbase Server, Snowlake Computing, OpenLink Virtuosossosso. |
선택 * 로부터 T 어디에 로운움 <= 10 | 오라클 |
SELECT FIRST 10 * from T | 잉그레스 |
SELECT FIRST 10 * FROM T order by a | 인포믹스 |
SELECT SKIP 20 FIRST 10 * FROM T order by c, d | Informix(열 번호는 순서별 평가 후 필터링됨)SKIP 조항은 v10.00에 도입되었다.xC4 픽스 팩) |
SELECT TOP 10 * FROM T | MS SQL Server, SAP ASE, MS Access, SAP IQ, Teradata |
선택 * From T 샘플 10 | 테라다 |
SELECT TOP 20, 10 * FROM T | OpenLink Virtuoso(스킵 20, 다음 10개 제공)[8] |
SELECT TOP 10 START AT 20 * FROM T | SAP SQL Anywhere(버전 9.0.1 이후 표준 지원) |
SELECT FIRST 10 SKIP 20 * FROM T | 파이어버드 |
선택 * From T 행 20 토 30 | Firebird(버전 2.1 이후) |
선택 * From T 어디에 ID_T > 10 FETCH 퍼스트 10 행 오직 | DB2 |
선택 * From T 어디에 ID_T > 20 FETCH 퍼스트 10 행 오직 | DB2(테이블 T의 키 열과 비교한 후 새 행이 필터링됨) |
행 페이지 지정
행 페이지[9] 지정은 데이터베이스에 있는 질의 전체 데이터의 일부만 제한하고 표시하기 위해 사용되는 접근법이다.서버는 수백, 수천 개의 행을 동시에 표시하는 대신 한 페이지(한정된 행 집합, 예를 들어 10개의 행만)만 요청받고 사용자는 다음 페이지를 요청하여 탐색하기 시작한다.특히 클라이언트와 서버 사이에 전용 연결이 없는 웹 시스템에서는 매우 유용하므로 클라이언트가 서버의 모든 행을 읽고 표시하기 위해 기다릴 필요가 없다.null
페이지 지정 접근 방식의 데이터
{rows}
= 페이지의 행 수{page_number}
= 현재 페이지 수{begin_base_0}
= 행 수 - 페이지가 시작되는 1 = (page_number-1) * 행
가장 간단한 방법(그러나 매우 비효율적)
- 데이터베이스에서 모든 행 선택
- 모든 행을 읽지만 읽은 행의 수가 다음 사이에 있는 경우에만 표시되도록 보내기
{begin_base_0 + 1}
그리고{begin_base_0 + rows}
선택 * 로부터 {테이블} 주문 에 의해 {유니크_키}
기타 간단한 방법(모든 행을 읽는 것보다 약간 더 효율적)
- 표의 시작부터 표시할 마지막 행까지 모든 행 선택(
{begin_base_0 + rows}
) - 읽어라
{begin_base_0 + rows}
행 그러나 읽은 행의 low_number가 다음보다 큰 경우에만 표시되도록 전송{begin_base_0}
SQL | 방언 |
---|---|
선발하다 * 로부터 {테이블} 주문 에 의해 {유니크_키} FETCH 퍼스트 {begin_base_0 + 노를 젓다} 행 오직 | SQL ANSI 2008 PostgreSQl SQL Server 2012 더비 오라클 12c DB2 12 미머 SQL |
선택 * 로부터 {테이블} 주문 에 의해 {유니크_키} 한계 {begin_base_0 + 노를 젓다} | MySQL SQLite |
선택 톱 {begin_base_0 + 노를 젓다} * 로부터 {테이블} 주문 에 의해 {유니크_키} | SQL Server 2005 |
세트 로카운트 {begin_base_0 + 노를 젓다} 선택 * 로부터 {테이블} 주문 에 의해 {유니크_키} 세트 로카운트 0 | Sybase, SQL Server 2000 |
선택 * From ( 선택 * From {테이블} 주문 BY {유니크_키} ) a 어디에 넝쿨째 <= {begin_base_0 + 노를 젓다} | 오라클 11 |
위치 지정 방법
- 선택만
{rows}
표시할 다음 행부터 시작하는 행({begin_base_0 + 1}
) - 데이터베이스에서 읽은 모든 행을 표시하려면 읽기 및 보내기
SQL | 방언 |
---|---|
선택 * 로부터 {테이블} 주문 에 의해 {유니크_키} 오프셋 {begin_base_0} 행 FETCH 다음 {노를 젓다} 행 오직 | SQL ANSI 2008 PostgreSQl SQL Server 2012 더비 오라클 12c DB2 12 미머 SQL |
선택 * 로부터 {테이블} 주문 에 의해 {유니크_키} 한계 {노를 젓다} 오프셋 {begin_base_0} | MySQL 마리아DB PostgreSQl SQLite |
선택 * 로부터 {테이블} 주문 에 의해 {유니크_키} 한계 {begin_base_0}, {노를 젓다} | MySQL 마리아DB SQLite |
선택 톱 {begin_base_0 + 노를 젓다} *, _beakes=정체성(10) 로 #temp 로부터 {테이블} 주문 BY {유니크_키} 선발하다 * 로부터 #temp 어디에 _beakes > {begin_base_0} 드롭 테이블 #temp | Sybase 12.5.3: |
세트 로카운트 {begin_base_0 + 노를 젓다} 선발하다 *, _beakes=정체성(10) 로 #temp 로부터 {테이블} 주문 BY {유니크_키} 선발하다 * 로부터 #temp 어디에 _beakes > {begin_base_0} 드롭 테이블 #temp 세트 로카운트 0 | Sybase 12.5.2: |
선발하다 톱 {노를 젓다} * 로부터 ( 선발하다 *, ROW_NUMBER() 에 걸쳐서 (주문 에 의해 {유니크_키}) 로서 _beakes 로부터 {테이블} ) xx 어디에 _beakes > {begin_base_0}
| SQL Server 2005 |
세트 로카운트 {begin_base_0 + 노를 젓다} 선발하다 *, _beakes=정체성(인트로,1,1) 로 #temp 로부터 {테이블} 주문 BY {독특한-핵심을} 선발하다 * 로부터 #temp 어디에 _beakes > {begin_base_0} 드롭 테이블 #temp 세트 로카운트 0 | SQL Server 2000 |
선택 * From ( 선택 넝쿨째-1 로서 _beakes, a.* From( 선택 * From {테이블} 주문 BY {유니크_키} ) a 어디에 넝쿨째 <= {begin_base_0 + 캔트_regs} ) 어디에 _beakes >= {begin_base_0} | 오라클 11 |
필터를 사용한 방법(대규모 데이터 집합에 더 정교하지만 필요함)
- 그때만 선택
{rows}
필터가 있는 행:- 첫 번째 페이지: 첫 번째 페이지만 선택
{rows}
행, 데이터베이스 유형에 따라 다름 - 다음 페이지: 첫 번째 페이지만 선택하십시오.
{rows}
행(데이터베이스 유형에 따라){unique_key}
보다 크다{last_val}
(의 가치{unique_key}
현재 페이지의 마지막 행 중) - 이전 페이지: 데이터를 역순으로 정렬하고 첫 번째 페이지만 선택하십시오.
{rows}
행, 여기서{unique_key}
보다 작다{first_val}
(의 가치{unique_key}
현재 페이지의 첫 번째 행)에서 올바른 순서로 결과를 정렬하십시오.
- 첫 번째 페이지: 첫 번째 페이지만 선택
- 데이터베이스에서 읽은 모든 행을 표시하려면 읽기 및 보내기
첫 페이지 | 다음 페이지 | 이전 페이지 | 방언 |
---|---|---|---|
선발하다 * 로부터 {테이블} 주문 에 의해 {유니크_키} FETCH 퍼스트 {노를 젓다} 행 오직 | 선발하다 * 로부터 {테이블} 어디에 {유니크_키} > {last_val} 주문 에 의해 {유니크_키} FETCH 퍼스트 {노를 젓다} 행 오직 | 선발하다 * 로부터 ( 선발하다 * 로부터 {테이블} 어디에 {유니크_키} < {first_val} 주문 에 의해 {유니크_키} DECK FETCH 퍼스트 {노를 젓다} 행 오직 ) a 주문 에 의해 {유니크_키} | SQL ANSI 2008 PostgreSQl SQL Server 2012 더비 오라클 12c DB2 12 미머 SQL |
선발하다 * 로부터 {테이블} 주문 에 의해 {유니크_키} 한계 {노를 젓다} | 선발하다 * 로부터 {테이블} 어디에 {유니크_키} > {last_val} 주문 에 의해 {유니크_키} 한계 {노를 젓다} | 선발하다 * 로부터 ( 선발하다 * 로부터 {테이블} 어디에 {유니크_키} < {first_val} 주문 에 의해 {유니크_키} DECK 한계 {노를 젓다} ) a 주문 에 의해 {유니크_키} | MySQL SQLite |
선발하다 톱 {노를 젓다} * 로부터 {테이블} 주문 에 의해 {유니크_키} | 선발하다 톱 {노를 젓다} * 로부터 {테이블} 어디에 {유니크_키} > {last_val} 주문 에 의해 {유니크_키} | 선발하다 * 로부터 ( 선발하다 톱 {노를 젓다} * 로부터 {테이블} 어디에 {유니크_키} < {first_val} 주문 에 의해 {유니크_키} DECK ) a 주문 에 의해 {유니크_키} | SQL Server 2005 |
세트 로카운트 {노를 젓다} 선발하다 * 로부터 {테이블} 주문 에 의해 {유니크_키} 세트 로카운트 0 | 세트 로카운트 {노를 젓다} 선발하다 * 로부터 {테이블} 어디에 {유니크_키} > {last_val} 주문 에 의해 {유니크_키} 세트 로카운트 0 | 세트 로카운트 {노를 젓다} 선발하다 * 로부터 ( 선발하다 * 로부터 {테이블} 어디에 {유니크_키} < {first_val} 주문 에 의해 {유니크_키} DECK ) a 주문 에 의해 {유니크_키} 세트 로카운트 0 | Sybase, SQL Server 2000 |
선발하다 * 로부터 ( 선발하다 * 로부터 {테이블} 주문 에 의해 {유니크_키} ) a 어디에 넝쿨째 <= {노를 젓다} | 선발하다 * 로부터 ( 선발하다 * 로부터 {테이블} 어디에 {유니크_키} > {last_val} 주문 에 의해 {유니크_키} ) a 어디에 넝쿨째 <= {노를 젓다} | 선발하다 * 로부터 ( 선발하다 * 로부터 ( 선발하다 * 로부터 {테이블} 어디에 {유니크_키} < {first_val} 주문 에 의해 {유니크_키} DECK ) a1 어디에 넝쿨째 <= {노를 젓다} ) a2 주문 에 의해 {유니크_키} | 오라클 11 |
계층 질의
일부 데이터베이스는 계층 데이터에 대해 전문화된 구문을 제공한다.null
SQL:2003의 창 함수는 결과 집합의 파티션에 적용되는 집계 함수다.null
예를 들어,
합계를 내다(인구) 오버( 파티션 BY 도회 )
현재 행과 동일한 도시 값을 갖는 모든 행의 모집단의 합계를 계산한다.null
파티션은 집계를 수정하는 OUP 절을 사용하여 지정된다.구문:
<Over_CLAUSE> : : : = Over ( [PARTATION BY <expression>, …] [ORDER BY <expression> ] )
OUP 절은 결과 집합을 분할하고 정렬할 수 있다.순서는 행_number와 같은 주문 상대 함수에 사용된다.null
평가 ANSI 쿼리
ANSI SQL에 따른 SELECT 문 처리는 다음과 같다.[10]
선발하다 g.* 로부터 사용자들 u 내면의 합류하다 무리 g 에 관하여 g.사용자 ID = u.사용자 ID 어디에 u.성 = '스미스' 그리고 u.이름 = '존'
- FROM 절이 평가되며, FROM 절의 처음 두 표에 대해 교차 결합 또는 데카르트 제품이 생성되어 가상 테이블이 Vtable1로 생성된다.
- ON 조항은 vtable1에 대해 평가되며 조인 조건 g를 충족하는 기록만 평가된다.Userid = u.사용자 ID가 Vtable2에 삽입됨
- 외부 조인을 지정하면 vTable2에서 삭제된 레코드가 VTable 3에 추가되며, 예를 들어 위의 쿼리가 다음과 같은 경우:그룹에 속하지 않은 모든 사용자가 Vtable3에 다시 추가됨
선발하다 u.* 로부터 사용자들 u 남겨진 합류하다 무리 g 에 관하여 g.사용자 ID = u.사용자 ID 어디에 u.성 = '스미스' 그리고 u.이름 = '존'
- WHERE 절이 평가되며, 이 경우 사용자 John Smith에 대한 그룹 정보만 vTable4에 추가된다.
- GROUP BY를 평가한다. 위의 쿼리가 다음과 같은 경우:vTable5는 그룹별로 정렬된 vTable4에서 반환된 멤버로 구성되며, 이 경우 GroupName
선발하다 g.그룹 이름, 수를 세다(g.*) 로서 NumberOfMembers 로부터 사용자들 u 내면의 합류하다 무리 g 에 관하여 g.사용자 ID = u.사용자 ID 무리를 짓다 에 의해 그룹 이름
- HAVING 절이 참인 그룹에 대해 HAVING 절을 평가하여 vTable6에 삽입한다.예를 들면 다음과 같다.
선발하다 g.그룹 이름, 수를 세다(g.*) 로서 NumberOfMembers 로부터 사용자들 u 내면의 합류하다 무리 g 에 관하여 g.사용자 ID = u.사용자 ID 무리를 짓다 에 의해 그룹 이름 하고 있다 수를 세다(g.*) > 5
- SELECT 목록이 평가되어 Vtable 7로 반환됨
- DICT 절을 평가함, 중복 행이 제거되어 Vtable 8로 반환됨
- ORDER BY 절을 평가하여 행을 정렬하고 VCursor9를 반환한다.ANSI는 커서를 (관계적이 아닌) 순서 행 집합으로 정의하기 때문에 이것은 커서가 아니라 테이블이 아니다.
RDBMS 공급업체의 창 기능 지원
관계형 데이터베이스와 SQL 엔진의 벤더에 의한 윈도우 기능 기능의 구현은 크게 다르다.대부분의 데이터베이스는 적어도 어느 정도의 창 기능 향기를 지원한다.그러나 자세히 살펴보면 대부분의 벤더는 표준의 하위 집합만 구현한다는 것이 명확해진다.강력한 RANGE 절을 예로 들어보자.Oracle, DB2, Spark/Hive, Google Big Query만이 이 기능을 완전히 구현한다.보다 최근에는 벤더가 표준에 새로운 확장(예: 어레이 집계 기능)을 추가했다.이는 분산 관계형 데이터베이스(MPP)에 비해 데이터 공동 지역성 보장이 약한 분산 파일 시스템(하둡, 스파크, 구글 빅쿼리)에 대해 SQL을 실행하는 경우에 특히 유용하다.분산 파일 시스템에 대해 쿼리를 실행하는 SQL 엔진은 모든 노드에 데이터를 균등하게 배포하는 대신 데이터를 중첩하여 데이터 공동 지역성 보증을 달성할 수 있으므로 네트워크 전체에 걸쳐 심한 떨림을 수반하는 잠재적인 고비용 조인을 방지할 수 있다.윈도우 기능에 사용할 수 있는 사용자 정의 집계 기능도 매우 강력한 기능이다.null
T-SQL에서 데이터 생성
모두 합을 기준으로 데이터를 생성하는 방법
선발하다 1 a, 1 b 결합하다 전부 선발하다 1, 2 결합하다 전부 선발하다 1, 3 결합하다 전부 선발하다 2, 1 결합하다 전부 선발하다 5, 1
SQL Server 2008은 SQL3("SQL:1999") 표준에 지정된 "행 생성자" 지원
선발하다 * 로부터 (가치 (1, 1), (1, 2), (1, 3), (2, 1), (5, 1)) 로서 x(a, b)
참조
- ^ Microsoft. "Transact-SQL Syntax Conventions".
- ^ MySQL. "SQL SELECT Syntax".
- ^ FROM 조항을 생략하는 것은 표준이 아니지만 대부분의 주요 DBMS에서 허용된다.
- ^ "Transact-SQL Reference". SQL Server Language Reference. SQL Server 2005 Books Online. Microsoft. 2007-09-15. Retrieved 2007-06-17.
- ^ SAS 9.4 SQL Procedure User's Guide. SAS Institute. 2013. p. 248. ISBN 9781612905686. Retrieved 2015-10-21.
Although the UNIQUE argument is identical to DISTINCT, it is not an ANSI standard.
- ^ Leon, Alexis; Leon, Mathews (1999). "Eliminating duplicates - SELECT using DISTINCT". SQL: A Complete Reference. New Delhi: Tata McGraw-Hill Education (published 2008). p. 143. ISBN 9780074637081. Retrieved 2015-10-21.
[...] the keyword DISTINCT [...] eliminates the duplicates from the result set.
- ^ PostgreSQL 9.1.24 설명서 - 3장.고급 기능
- ^ OpenLink Software. "9.19.10. The TOP SELECT Option". docs.openlinksw.com. Retrieved 1 October 2019.
- ^ 잉그. 오스카 보닐라, MBA
- ^ Microsoft SQL Server 2005 내부: Itzik Ben-Gan, Lubor Kollar 및 Dejan Sarka의 T-SQL 쿼리
원천
- 수평 및 수직 파티셔닝, Microsoft SQL Server 2000 북스 온라인.
외부 링크
- SQL, Stefan Deßloch의 창 테이블 및 창 기능
- Oracle SELECT 구문
- Firebird SELECT 구문
- MySQL SELECT 구문
- PostgreSQL SELECT 구문
- SQLite SELECT 구문