74

SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Embed Size (px)

Citation preview

Page 1: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE
Page 2: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT *FROM rWHERE A=B AND D>5

Page 3: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT A,CFROM rWHERE ...

Page 4: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE
Page 5: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT *FROM r, sWHERE r.B=s.B AND r.D=s.D

Page 6: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT *FROM r, sWHERE r.B<s.D

Page 7: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT *FROM rUNIONSELECT *FROM s

Page 8: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE
Page 9: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE
Page 10: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE
Page 11: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE
Page 12: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE
Page 13: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE
Page 14: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

주어진 테이블들로부터 적절한 행들과 컬럼들을 선택한다 SELECT 문의 기본 구성

SELECT 검색할 컬럼들을 지정한다

FROM 검색할 테이블을 지정한다

WHERE 검색할 테이블 내의 행을 결정한다 WHERE 절이 없는 경우에는 해당 테이블의 모든 행들을 검색한다

Page 15: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

형식SELECT [ALL | DISTINCT] select_list [INTO [new_table_name]][FROM { table_name | view_name } [(optimizer_hints)]

[[, { table_name2 | view_name2 } [(optimizer_hints)][…, { table_name | view_name } [(optimizer_hints)]]]

[WHERE clause][GROUP BY clause][HAVING clause][ORDER BY clause][COMPLETE clause][FOR BROWSE]

Page 16: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT *FROM authors

SELECT *FROM authors

au_id au_lname au_fname phone address city state zip contract ----------- ---------------- ------------- ------------ --------------------- --------------- ----- ----- -------- 172-32-1176 White Johnson 408 496-7223 10932 Bigge Rd. Menlo Park CA 94025 1 213-46-8915 Green Marjorie 415 986-7020 309 63rd St. #411 Oakland CA 94618 1 238-95-7766 Carson Cheryl 415 548-7723 589 Darwin Ln. Berkeley CA 94705 1 267-41-2394 O'Leary Michael 408 286-2428 22 Cleveland Av. #14 San Jose CA 95128 1 274-80-9391 Straight Dean 415 834-2919 5420 College Av. Oakland CA 94609 1 ...712-45-1867 del Castillo Innes 615 996-8275 2286 Cram Pl. #86 Ann Arbor MI 48105 1 722-51-5454 DeFrance Michel 219 547-9982 3 Balding Pl. Gary IN 46403 1 724-08-9931 Stringer Dirk 415 843-2991 5420 Telegraph Av. Oakland CA 94609 0 724-80-9391 MacFeather Stearns 415 354-7128 44 Upland Hts. Oakland CA 94612 1 756-30-7391 Karsen Livia 415 534-9219 5720 McAuley St. Oakland CA 94609 1 807-91-6654 Panteley Sylvia 301 946-8853 1956 Arlington Pl. Rockville MD 20853 1 846-92-7186 Hunter Sheryl 415 836-7128 3410 Blonde St. Palo Alto CA 94301 1 893-72-1158 McBadden Heather 707 448-4982 301 Putnam Vacaville CA 95688 0 899-46-2035 Ringer Anne 801 826-0752 67 Seventh Av. Salt Lake City UT 84152 1 998-72-3567 Ringer Albert 801 826-0752 67 Seventh Av. Salt Lake City UT 84152 1

(23 row(s) affected)

au_id au_lname au_fname phone address city state zip contract ----------- ---------------- ------------- ------------ --------------------- --------------- ----- ----- -------- 172-32-1176 White Johnson 408 496-7223 10932 Bigge Rd. Menlo Park CA 94025 1 213-46-8915 Green Marjorie 415 986-7020 309 63rd St. #411 Oakland CA 94618 1 238-95-7766 Carson Cheryl 415 548-7723 589 Darwin Ln. Berkeley CA 94705 1 267-41-2394 O'Leary Michael 408 286-2428 22 Cleveland Av. #14 San Jose CA 95128 1 274-80-9391 Straight Dean 415 834-2919 5420 College Av. Oakland CA 94609 1 ...712-45-1867 del Castillo Innes 615 996-8275 2286 Cram Pl. #86 Ann Arbor MI 48105 1 722-51-5454 DeFrance Michel 219 547-9982 3 Balding Pl. Gary IN 46403 1 724-08-9931 Stringer Dirk 415 843-2991 5420 Telegraph Av. Oakland CA 94609 0 724-80-9391 MacFeather Stearns 415 354-7128 44 Upland Hts. Oakland CA 94612 1 756-30-7391 Karsen Livia 415 534-9219 5720 McAuley St. Oakland CA 94609 1 807-91-6654 Panteley Sylvia 301 946-8853 1956 Arlington Pl. Rockville MD 20853 1 846-92-7186 Hunter Sheryl 415 836-7128 3410 Blonde St. Palo Alto CA 94301 1 893-72-1158 McBadden Heather 707 448-4982 301 Putnam Vacaville CA 95688 0 899-46-2035 Ringer Anne 801 826-0752 67 Seventh Av. Salt Lake City UT 84152 1 998-72-3567 Ringer Albert 801 826-0752 67 Seventh Av. Salt Lake City UT 84152 1

(23 row(s) affected)

Page 17: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT 키워드 다음의 select_list 에 컬럼들을 열거하면 된다SELECT column_name [, column_name …]

SELECT au_id, au_fname, au_lnameFROM authors

SELECT au_id, au_fname, au_lnameFROM authors

au_id au_fname au_lname----------- ------------------- ---------------172-32-1176 Johnson White 213-46-8915 Marjorie Green238-95-7766 Cheryl Carson...807-91-6654 Sylvia Panteley846-92-7186 Sheryl Hunter893-72-1158 Heather McBadden899-46-2035 Anne Ringer998-72-3567 Albert Ringer

(23 row(s) affected)

au_id au_fname au_lname----------- ------------------- ---------------172-32-1176 Johnson White 213-46-8915 Marjorie Green238-95-7766 Cheryl Carson...807-91-6654 Sylvia Panteley846-92-7186 Sheryl Hunter893-72-1158 Heather McBadden899-46-2035 Anne Ringer998-72-3567 Albert Ringer

(23 row(s) affected)

Page 18: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

컬럼 순서의 재배열 SELECT 키워드 다음에 열거하는 순서에 따라 결과로 나타나는 컬럼들의 순서가

결정된다

SELECT au_fname, au_lname, au_idFROM authors

SELECT au_fname, au_lname, au_idFROM authors

au_fname au_lname au_id -------------------- --------------- ----------- Johnson White 172-32-1176 Marjorie Green 213-46-8915 Cheryl Carson 238-95-7766 ...Sylvia Panteley 807-91-6654 Sheryl Hunter 846-92-7186 Heather McBadden 893-72-1158 Anne Ringer 899-46-2035 Albert Ringer 998-72-3567

(23 row(s) affected)

au_fname au_lname au_id -------------------- --------------- ----------- Johnson White 172-32-1176 Marjorie Green 213-46-8915 Cheryl Carson 238-95-7766 ...Sylvia Panteley 807-91-6654 Sheryl Hunter 846-92-7186 Heather McBadden 893-72-1158 Anne Ringer 899-46-2035 Albert Ringer 998-72-3567

(23 row(s) affected)

Page 19: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

컬럼 제목의 변경SELECT column_heading = column_name [, column_name …] 또는SELECT column_name column_heading [, column_name …]

컬럼의 제목을 컬럼 이름이 아닌 다른 것으로 변경할 수 있다

SELECT FIRST = au_fname, au_lname LAST, au_idFROM authors

SELECT FIRST = au_fname, au_lname LAST, au_idFROM authors

FIRST LAST au_id -------------------- --------------- ----------- Johnson White 172-32-1176 Marjorie Green 213-46-8915 Cheryl Carson 238-95-7766 ...Heather McBadden 893-72-1158 Anne Ringer 899-46-2035 Albert Ringer 998-72-3567

(23 row(s) affected)

FIRST LAST au_id -------------------- --------------- ----------- Johnson White 172-32-1176 Marjorie Green 213-46-8915 Cheryl Carson 238-95-7766 ...Heather McBadden 893-72-1158 Anne Ringer 899-46-2035 Albert Ringer 998-72-3567

(23 row(s) affected)

Page 20: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

WHERE 절에 탐색 조건을 근거하여 어떤 행을 검색할 지를 지정한다SELECT select_listFROM table_listWHERE search_conditions

주의 사항 WHERE 절에는 가능하면 NOT 은 사용하지 않는 것이 좋다

NOT 을 사용하면 색인의 도움을 받을 수 없다 !! 연산자 앞에는 가능하면 컬럼 이름이 오도록 한다

Page 21: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

비교 연산자의 사용 =, >, <, >=, <=, <>, !=, !, !>

알 수 없는 값의 비교 IS NULL, IS NOT NULL

SELECT *FROM authorsWHERE zip > ‘90000’

SELECT *FROM authorsWHERE zip > ‘90000’

SELECT au_lname, cityFROM authorsWHERE state = ‘CA’

SELECT au_lname, cityFROM authorsWHERE state = ‘CA’

SELECT titleFROM titlesWHERE price IS NULL

SELECT titleFROM titlesWHERE price IS NULL

Page 22: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

범위 비교 BETWEEN, NOT BETWEEN

리스트 비교 IN, NOT IN

SELECT pubdate, titleFROM titlesWHERE pubdate BETWEEN ‘1/1/91’ AND ‘12/31/91’

SELECT pubdate, titleFROM titlesWHERE pubdate BETWEEN ‘1/1/91’ AND ‘12/31/91’

SELECT title, typeFROM titlesWHERE type IN (‘mod_cook’, ‘trad_cook’)

SELECT title, typeFROM titlesWHERE type IN (‘mod_cook’, ‘trad_cook’)

SELECT title, typeFROM titlesWHERE type = ‘mod_cook’ OR type = ‘trad_cook’

SELECT title, typeFROM titlesWHERE type = ‘mod_cook’ OR type = ‘trad_cook’

Page 23: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

LIKE 키워드의 사용SELECT select_list

FROM table_list

WHERE expression [NOT] LIKE “string”

정규 표현식 (regular expression) 형식의 와일드카드 사용 와일드카드 ( Wildcard)

% : 임의의 0 개 이상의 문자열_ : 임의의 한 글자[] : 지정된 범위 또는 집합 안의 한 문자[^] : 지정된 범위 또는 집합에 없는 한 문자

Page 24: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT stor_nameFROM storesWHERE stor_name LIKE ‘%Books%’

SELECT stor_nameFROM storesWHERE stor_name LIKE ‘%Books%’

SELECT stor_nameFROM storesWHERE stor_name LIKE ‘Bo%’

SELECT stor_nameFROM storesWHERE stor_name LIKE ‘Bo%’

SELECT stor_nameFROM storesWHERE stor_name LIKE ‘%[S-V]%’

SELECT stor_nameFROM storesWHERE stor_name LIKE ‘%[S-V]%’

SELECT stor_nameFROM storesWHERE stor_name LIKE ‘%M[^c]%’

SELECT stor_nameFROM storesWHERE stor_name LIKE ‘%M[^c]%’

Page 25: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT title_id, title, pub_id, price, pubdateFROM titlesWHERE (title LIKE ‘T%’ OR pub_id = ‘0877’) AND

(price > $16.00)

SELECT title_id, title, pub_id, price, pubdateFROM titlesWHERE (title LIKE ‘T%’ OR pub_id = ‘0877’) AND

(price > $16.00)

SELECT title_id, title, pub_id, price, pubdateFROM titlesWHERE (title LIKE ‘T%’) OR

(pub_id = ‘0877’ AND price > $16.00)

SELECT title_id, title, pub_id, price, pubdateFROM titlesWHERE (title LIKE ‘T%’) OR

(pub_id = ‘0877’ AND price > $16.00)

SELECT title_id, title, pub_id, price, pubdateFROM titlesWHERE title LIKE ‘T%’ OR pub_id = ‘0877’ AND

(price > $16.00)

SELECT title_id, title, pub_id, price, pubdateFROM titlesWHERE title LIKE ‘T%’ OR pub_id = ‘0877’ AND

(price > $16.00)

Page 26: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT 문에서는 WHERE 절을 만족하는 모든 행을 표현하는 것이 디폴트이다SELECT [ ALL | DISTINCT ] select_listFROM table_listWHERE search_conditions

ALL 조건을 만족하는 모든 행을 표현한다

DISTINCT 중복을 제거하고 결과를 나타낸다

테이블 Vs. 릴레이션

Page 27: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT city, stateFROM authors

SELECT city, stateFROM authors

SELECT DISTINCT city, stateFROM authors

SELECT DISTINCT city, stateFROM authors

Page 28: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

하나 또는 그 이상의 열에 대한 질의 결과를 정렬한다 SQL 서버 설치할 때 선택한 정렬 순서를 따른다 (sp_helpsort)

SELECT column_name [, column_name… ]FROM table_list[ ORDER BY column_name | select_list_number | expression

[ ASC | DESC ] [, column_name | select_list_number | expression[ ASC | DESC ] … ]

WHERE search_conditions

Page 29: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

고려 사항 ORDER BY 절에 컬럼 명이 아닌 상대적인 컬럼 번호를 사용할 수 있다 오름차순 (ASC) 또는 내림차순 (DESC) 이 지정되지 않으면 오름차순으로

가정한다 최고 16 컬럼까지 정렬할 수 있다 정렬의 대상이 된 열이 select_list 에 반드시 나타날 필요는 없다

SELECT pub_id, type, price, titleFROM titlesORDER BY type, price DESC

SELECT pub_id, type, price, titleFROM titlesORDER BY type, price DESC

SELECT pub_id, type, price, titleFROM titlesORDER BY 2, 3 DESC

SELECT pub_id, type, price, titleFROM titlesORDER BY 2, 3 DESC

Page 30: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

산술 연산자들+, -, /, *, %

연산자 우선 순위( ) *, /, * -, +

한 수식에서 같은 우선 순위를 가지는 연산자들에 대해서는 왼쪽에 나타나는 연산자가 오른쪽에 나타나는 연산자에 우선한다

산술 연산자가 적용되는 자료형들 int, smallint, tinyint, float, real, money, smallmoney 단 , % 는 money, smallmoney, float, real 자료형에 대해서 수행되지 않는다

Page 31: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT price, (price * 1.1), titleFROM titles

SELECT price, (price * 1.1), titleFROM titles

price title-------- ----------- ---------------------------19.99 21.98900 The Busy Executive's Dat... 11.95 13.14500 Cooking with Computers: ...2.99 3.28900 You Can Combat Computer ......19.99 21.98900 Prolonged Data Deprivati...7.99 8.78900 Emotional Security: A Ne...20.95 23.04500 Onions, Leeks, and Garli...11.95 13.14500 Fifty Years in Buckingha...14.99 16.48900 Sushi, Anyone?

(18 row(s) affected)

price title-------- ----------- ---------------------------19.99 21.98900 The Busy Executive's Dat... 11.95 13.14500 Cooking with Computers: ...2.99 3.28900 You Can Combat Computer ......19.99 21.98900 Prolonged Data Deprivati...7.99 8.78900 Emotional Security: A Ne...20.95 23.04500 Onions, Leeks, and Garli...11.95 13.14500 Fifty Years in Buckingha...14.99 16.48900 Sushi, Anyone?

(18 row(s) affected)

Page 32: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

집계 함수 (Aggregate Functions)

Page 33: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

전체 테이블 또는 테이블 내의 컬럼들로 구성된 그룹들에 대한 요약 값을 새로운 컬럼으로 생성한다

aggregate_function ( [ALL | DISTINCT] expression )

expression 컬럼 이름 , 상수 , 산술 / 비트 연산자 등으로 구성된다

계산 함수들AVG ( [ALL|DISTINCT] expression )

SUM ( [ALL|DISTINCT] expression )

COUNT ( [ALL|DISTINCT] expression ), COUNT ( * )

MAX ( expression ), MIN ( expression ) SELECT 문이나 GROUP BY 와 함께 사용된다

일반적으로 select list 나 HAVING 절에 위치한다

Page 34: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT COUNT(*)FROM titles

SELECT COUNT(*)FROM titles

SELECT COUNT(price)FROM titles

SELECT COUNT(price)FROM titles

SELECT COUNT(DISTINCT title_id)FROM titles

SELECT COUNT(DISTINCT title_id)FROM titles

SELECT COUNT(*)FROM titlesWHERE price IS NOT NULL

SELECT COUNT(*)FROM titlesWHERE price IS NOT NULL

Page 35: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

계산 함수와 함께 각 그룹에 대해 하나의 행과 하나의 요약 정보를 생성한다

SELECT select_listFROM table_nameWHERE search_conditionsGROUP BY [ALL] aggregate_free_expression

[, aggregate_free_expression …]][HAVING search conditions]

GROUP BY 선택된 테이블의 각 그룹에 대한 요약 정보를 생성한다

HAVING 결과 행들에 대해 제약을 가한다 조건에 맞지 않는 그룹들을 제외한다

조직화된 요약 데이터를 구성하기 위해 사용된다

Page 36: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

참고 사항 ANSI 표준 SQL 에서의 요구사항

select_list 에 있는 모든 컬럼들은 반드시 GROUP BY 절에 나타나야 한다 HAVING 절에 있는 컬럼은 반드시 하나의 값을 반환해야 한다 HAVING 절을 포함한 질의는 반드시 GROUP BY 절을 포함해야 한다

Transact-SQL 에서는 ANSI 표준 SQL 보다 더 많은 옵션을 제공 GROUP BY 절은 수식을 포함할 수 있다 GROUP BY ALL 은 WHERE 절에서 제외된 그룹까지도 포함한다

ALL 은 SELECT 문이 WHERE 절을 포함할 때만 의미가 있다

Page 37: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT title_id, copies_sold = SUM(qty)FROM salesGROUP BY title_id

SELECT title_id, copies_sold = SUM(qty)FROM salesGROUP BY title_id

title_id copies_sold -------- ----------- BU1032 15 BU1111 25 BU2075 35 ...PS3333 15 PS7777 25 TC3218 40 TC4203 20 TC7777 20

(16 row(s) affected)

title_id copies_sold -------- ----------- BU1032 15 BU1111 25 BU2075 35 ...PS3333 15 PS7777 25 TC3218 40 TC4203 20 TC7777 20

(16 row(s) affected)

Page 38: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT title_id, copies_sold = SUM(qty)FROM salesGROUP BY title_idHAVING SUM(qty) > 30

SELECT title_id, copies_sold = SUM(qty)FROM salesGROUP BY title_idHAVING SUM(qty) > 30

title_id copies_sold -------- ----------- BU2075 35 MC3021 40 PC8888 50 PS2091 108 TC3218 40

(5 row(s) affected)

title_id copies_sold -------- ----------- BU2075 35 MC3021 40 PC8888 50 PS2091 108 TC3218 40

(5 row(s) affected)

Page 39: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT title_id, copies_sold = SUM(qty)FROM salesWHERE ord_date BETWEEN ‘1/1/1994’ AND ‘12/31/1994’GROUP BY ALL title_id

SELECT title_id, copies_sold = SUM(qty)FROM salesWHERE ord_date BETWEEN ‘1/1/1994’ AND ‘12/31/1994’GROUP BY ALL title_id

title_id copies_sold -------- ----------- BU1032 15 BU1111 NULL ...MC3021 40 PC1035 NULL PC8888 NULL PS1372 NULL PS2091 108 PS2106 NULL ...

(16 row(s) affected)

title_id copies_sold -------- ----------- BU1032 15 BU1111 NULL ...MC3021 40 PC1035 NULL PC8888 NULL PS1372 NULL PS2091 108 PS2106 NULL ...

(16 row(s) affected)

Page 40: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

조인의 구현 ANSI SQL 문법 SQL 서버 문법

Inner 조인 Cross 조인 Outer 조인 둘 이상의 테이블의 조인 Self 조인

Page 41: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

각 테이블에서의 컬럼들을 사용하여 두 개의 테이블을 연결한다 고려 사항

연결하는 컬럼은 조인에 포함된 각 테이블에 있는 데이터를 쉽게 일치시키거나 비교할 수 있어야 한다

ANSI SQL 문법 또는 SQL 서버 문법을 사용할 수 있다 하나의 SELECT 문에서 동시에 ANSI SQL 문법과 SQL 서버 문법을 사용할 수

없다 두 테이블 모두에 존재하는 컬럼 이름을 참조하는 경우에는 반드시

table_name.column_name 형식을 따라야 한다

Page 42: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

형식 SELECT table_name.column_name [, table_name.column_name … ] FROM { table_name [join_type] JOIN table_name ON search_conditions } WHERE [ search_condition … ] WHERE 절을 사용한 행의 선택에서 연결된 테이블을 구성한다 어떤 형식의 조인이 처리될 것인지 알리기 위해 ANSI 조인 키워드를 사용할 수 있다

INNER JOIN : 연결 조건을 만족하는 행들만을 포함한다 CROSS JOIN : 테이블 간의 모든 행들의 조합을 포함한다 OUTER JOIN : 연결 조건을 만족하는 행들과 연결된 테이블 중

한 테이블의 남은 행을 포함한다

Page 43: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

형식SELECT table_name.column_name [, table_name.column_name … ]FROM { table_name, table_name }WHERE table_name.column_name join_operator

table_name.column_name 컬럼 들의 값을 한 행씩 비교하여 비교 결과가 참일 때 그 행을 나열한다 FROM 절에 조인에 관련되는 모든 테이블을 나열하고 WHERE 절에 어떤 행들이

결과에 포함되어야 하는지를 명시한다 WHERE 절에 사용할 수 있는 연산자들

=, >, <, >=, <=, <>

Page 44: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

두 테이블의 연결 조건에 맞는 행들만을 포함한다 내부 연결의 일반적 유형

Equijoin 비교되는 컬럼의 값이 같은 경우에 연결이 이루어진다 중복된 컬럼 정보를 만들게 된다

Natural join Equijoin 이 만들어 내는 결과 집합에서 중복된 컬럼 데이터를 제거한다

Page 45: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

USE pubsSELECT authors.au_lname, authors.state, publishers.*FROM publishers INNER JOIN authors

ON publishers.city = authors.city

USE pubsSELECT authors.au_lname, authors.state, publishers.*FROM publishers INNER JOIN authors

ON publishers.city = authors.city

USE pubsSELECT authors.au_lname, authors.state, publishers.*FROM publishers, authorsWHERE publishers.city = authors.city

USE pubsSELECT authors.au_lname, authors.state, publishers.*FROM publishers, authorsWHERE publishers.city = authors.city

ANSI 조인ANSI 조인

Page 46: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

연결되는 테이블들의 모든 행들의 모든 조합을 결과에 포함한다 연결된 테이블의 Cartesian product 를 반환한다

SELECT pub_name, titleFROM titles CROSS JOIN publishers

SELECT pub_name, titleFROM titles CROSS JOIN publishers

SELECT pub_name, titleFROM titles, publishers

SELECT pub_name, titleFROM titles, publishers

ANSI 조인ANSI 조인

Page 47: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

한 테이블에 있는 행에는 제한 조건을 가하지 않는 반면에 다른 테이블에 대해서는 행에 제한을 한다

고려 사항 관계된 테이블에서 일치하지 않는 outer 테이블의 모든 행을 보여준다 두 테이블 간에만 이루어질 수 있다 기본 키와 참조 키가 동기화 되지 않았는지 등을 알아보는데 유용하게 사용된다

Page 48: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

ANSI SQL 문법 LEFT OUTER JOIN

왼쪽 테이블의 모든 행을 포함한다 RIGHT OUTER JOIN

오른쪽 테이블의 모든 행을 포함한다 FULL OUTER JOIN

왼쪽 , 오른쪽 테이블의 일치하지 않는 모든 행을 포함한다 SQL 서버 문법

*= 왼쪽 테이블의 모든 행을 포함한다

=* 오른쪽 테이블의 모든 행을 포함한다

Page 49: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT title, stor_id, ord_num, qty, ord_dateFROM titles LEFT OUTER JOIN sales

ON titles.title_id = sales.title_id

SELECT title, stor_id, ord_num, qty, ord_dateFROM titles LEFT OUTER JOIN sales

ON titles.title_id = sales.title_id

SELECT title, stor_id, ord_num, qty, ord_dateFROM titles, salesWHERE titles.title_id *= sales.title_id

SELECT title, stor_id, ord_num, qty, ord_dateFROM titles, salesWHERE titles.title_id *= sales.title_id

ANSI 조인ANSI 조인

Page 50: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT title, stor_id, ord_num, qty, ord_dateFROM sales, titles LEFT OUTER JOIN sales

ON titles.title_id = sales.title_idWHERE qty IS NULL

SELECT title, stor_id, ord_num, qty, ord_dateFROM sales, titles LEFT OUTER JOIN sales

ON titles.title_id = sales.title_idWHERE qty IS NULL

SELECT title, stor_id, ord_num, qty, ord_dateFROM titles, salesWHERE titles.title_id *= sales.title_id

AND qty IS NULL

SELECT title, stor_id, ord_num, qty, ord_dateFROM titles, salesWHERE titles.title_id *= sales.title_id

AND qty IS NULL

ANSI 조인ANSI 조인

Page 51: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

ANSI SQL 문법SELECT table_name.column_name [, table_name.column_name … ]FROM table_name [join_type] JOIN table_name ON search_conditions

… [join_type] JOIN table_name ON search_conditionsWHERE [ search_condition … ]

SQL 서버 문법SELECT table_name.column_name [, table_name.column_name … ]FROM table_name, table_name [, table_name …]WHERE table_name.column_name join_operator

table_name.column_name[AND table_name.column_name join_operator

table_name.column_name …]

Page 52: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT stor_name, qty, titleFROM titles INNER JOIN sales

ON titles.title_id = sales.title_idINNER JOIN stores

ON stores.stor_id = sales.stor_id

SELECT stor_name, qty, titleFROM titles INNER JOIN sales

ON titles.title_id = sales.title_idINNER JOIN stores

ON stores.stor_id = sales.stor_id

SELECT stor_name, qty, titleFROM titles, sales, storesWHERE titles.title_id = sales.title_id AND stores.stor_id = sales.stor_id

SELECT stor_name, qty, titleFROM titles, sales, storesWHERE titles.title_id = sales.title_id AND stores.stor_id = sales.stor_id

ANSI 조인ANSI 조인

Page 53: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

테이블의 행을 같은 테이블 안에 있는 다른 행과 연관시킨다 비교되는 컬럼은 같은 자료형이어야 하고 여러 방법에 대해 비교 가능해야 한다 같은 테이블을 조인하기 위해서는 하나의 테이블을 두 개의 다른 논리적 테이블로

참조할 수 있도록 별명을 할당해야 한다

Page 54: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

ANSI SQL 문법SELECT column_name, column_name [, column_name … ]FROM table_name alias [join_type] JOIN table_name alias

ON search_conditions SQL 서버 문법

SELECT column_name, column_name [, column_name … ]FROM table_name alias, table_name alias [, table_name … ]WHERE alias.column_name join_operator alias.column_name

Page 55: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

SELECT au1.au_fname, au1.au_lname, au2.au_fname, au2.au_lname, au2.zip

FROM authors au1 INNER JOIN authors au2 ON au1.zip = au2.zip

WHERE au1.city = ‘Oakland’ AND au1.state = ‘CA’ AND au1.au_id < au2.au_id

SELECT au1.au_fname, au1.au_lname, au2.au_fname, au2.au_lname, au2.zip

FROM authors au1 INNER JOIN authors au2 ON au1.zip = au2.zip

WHERE au1.city = ‘Oakland’ AND au1.state = ‘CA’ AND au1.au_id < au2.au_id

SELECT au1.au_fname, au1.au_lname, au2.au_fname, au2.au_lname, au2.zip

FROM authors au1, authors au2 WHERE au1.city = ‘Oakland’ AND au1.state = ‘CA’ AND

au1.zip = au2.zip AND au1.au_id < au2.au_id

SELECT au1.au_fname, au1.au_lname, au2.au_fname, au2.au_lname, au2.zip

FROM authors au1, authors au2 WHERE au1.city = ‘Oakland’ AND au1.state = ‘CA’ AND

au1.zip = au2.zip AND au1.au_id < au2.au_id

ANSI 조인ANSI 조인

Page 56: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE
Page 57: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Employee (fname, minit, lname, ssn, bdate, address, sex, salary, superssn, dno)

Department (dname, dnumber, mgrssn, mgrstartdate)

dept_locations (dnumber, dlocation)

Project (pname, pnumber, plocation, dnum)

works_on (essn, pno, hours)

Dependent (essn, dependent_name, sex, bdate, relationship)

Page 58: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Retrieve the birthdate and address of the employee whose name is ‘John B.Smith’

SELECT bdate, addressFROM employeeWHERE fname = ‘John’ AND minit=‘B’ AND

lname=‘Smith’

Page 59: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Retrive the name and address of all employees who work for the ‘Research’ department

SELECT fname, lname, addressFROM employee, departmentWHERE dname=‘Research’ AND dnumber=dno

Page 60: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

For every project located in ‘Stafford’ list the project number, the controlling department number, and the department manager’s last name, address, and birthdate

SELECT pnumber, dnum, lname, address, bdateFROM project, department, employeeWHERE dnum-dnumber AND mgrssn=ssn AND

plocation=‘Staffod’

Page 61: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

For each employee, retrieve the employee’s first and last name and the first and last name of his or her immediate supervisor

SELECT e.fname, e.lname, s.fname, s.lnameFROM employee e sWHERE e.superssn=s.ssn

Page 62: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Make a list of all project numbers for projects that involve an employee whose last name is ‘Smith’ as a worker or as a manager of the department that controls the project

(SELECT pnumberFROM project, department, employeeWHERE dnum=dnumber AND mgrssn=ssn AND

lname=‘Smith’)UNION(SELECT pnumberFROM project, works_on, employeeWHERE pnumber=pno AND essn=ssn AND

lname=‘Smith’)

Page 63: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Retrieve the name of each employee who has a dependent with the same first name and same sex as the employee

SELECT e.fname, e.lnameFROM employee eWHERE e.ssn IN (SELECT essn

FROM dependent WHERE essn=e.ssn AND

e.fname=dependent_name AND

sex=e.sex)

Page 64: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Retrieve the names of employees who have no dependents

SELECT fname, lnameFROM employeeWHERE NOT EXISTS (SELECT *

FROM dependent WHERE ssn=essn)

Page 65: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Retrieve the social security number of all employees who work on project number 1,2, or 3

SELECT DISTINCT essnFROM works_onWHERE pno IN (1,2,3)

Page 66: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Retrieve the names of all employees who do not have supervisors

SELECT fname, lnameFROM employeeWHERE superssn IS NULL

Page 67: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Find the sum of the salaries of all employees, the maximum salary, the minimum salary, and the average salary

SELECT SUM(salary), MAX(salary), MIN(salary)FROM employee

Page 68: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Retrieve the total number of employees in the company and the number of employees in the ‘Research’ department

SELECT COUNT(*) FROM employee

SELECT COUNT(*) FROM employee, department WHERE dno=dnumber AND dname=‘Research’

Page 69: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

For each department, retrieve the department number ,the number of employees in the department, and their average salary

SELECT dno, COUNT(*), AVG(salary)FROM employeeGROUP BY dno

Page 70: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

For each project on which more than two employees work retrieve the project number, project name, and number of employees who work on that project

SELECT pnumber, pname, COUNT(*)FROM project, works_onWHERE pnumber=pnoGROUP BY pnumber, pnameHAVING COUNT(*) >2

Page 71: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

For each project, retrieve the project number, project name, and number of employees from department 5 who work on that project

SELECT pnumber, pname, COUNT(*)FROM project, works_on, employeeWHERE pnumber=pno AND ssn=essn AND dno=5GROUP BY pnumber, pname

Page 72: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Retrieve all employees who were born during the 1950s

SELECT fname, lnameFROM employeeWHERE bdate LIKE ‘______5_’

Page 73: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

Find the salary lists to give all employees who work on the ‘Product X’ project a 10% raise

SELECT fname, lname, 1,1*salaryFROM employee, works_on, projectWHERE ssn=essn AND pno=pnumber AND pname=‘ProductX’

Page 74: SELECT * FROM r WHERE A=B AND D>5 SELECT A,C FROM r WHERE

List ordered by the employee’s department and within each department ordered alphabetically by name

SELECT dname, lname, fname, pnameFROM department, employee, works_on, projectWHERE dnumber=dno AND ssn=essn AND pno=pnumberORDERED BY dname, lname, fname