-- 지역이‘경남’인 사람의 키보다 키가 크거나 같은 사람 추출
select name, height from userTBL
where height >= (select height from userTbl where addr=N'경남');
↑
/*하위 쿼리에서 둘 이상의 값을 반환하면 비교 연산자를 사용할 수 없음.
하위 쿼리의 결과가 173, 170이라는 두 개의 값을 반환하므로 발생하는 오류 */
↓
-- ANY : 하위 쿼리의 결과 여러 개 중 한 가지만 만족시키는 경우 --170보다 크거나(or) 173보다 크거나 즉 170보다 큰
select name, height from userTBL
where height >= ANY (select height from userTbl where addr=N'경남');
-- ALL : 하위 쿼리의 결과 여러 개를 모두 만족시키는 경우 ----170보다 크고(and) 173보다 큰 즉
173보다 큰
select name, height from userTBL
where height >= ALL (select height from userTbl where addr=N'경남');
-- =ANY(하위쿼리) , IN(하위쿼리)
select name, height from userTBL
where height = ANY (select height from userTbl where addr=N'경남');
select name, height from userTBL
where height IN (select height from userTbl where addr=N'경남');
-- 경기에 사는 사람보다 나이가 많은 사람
select birthYear from userTbl where addr=N'경기';
select name,birthYear from userTbl
where birthYear < (select birthYear from userTbl where addr=N'경기'); //에러남
select name,birthYear from userTbl
where birthYear < ANY (select birthYear from userTbl where addr=N'경기'); -- 1965 or 1950
select name,birthYear from userTbl
where birthYear < ALL (select birthYear from userTbl where addr=N'경기'); -- 1965 and 1950
-- 경기에 사는 사람과 나이가 같은 사람
select name,birthYear from userTbl
where birthYear = ANY (select birthYear from userTbl where addr=N'경기');
select name,birthYear from userTbl
where birthYear IN (select birthYear from userTbl where addr=N'경기');
ㄴ두 결과는 같음
/*
Q1. 김범수보다 키가 작은 사람의 이름과 키를 출력하시오.(열의.( 이름은 한글로 변환)
Q2. 은지원보다 형인 사람의 이름과 생년을 출력하시오.(열의 이름은 한글로 변환)
Q3. 경기에 사는 사람 중, 윤종신보다 키가 작은 사람의 이름, 지역, 키를 출력하시오.(열의.( 이름은 한글로 변환)
Q4. 지역이 경기인 사람보다 키가 크거나 같은 사람의 이름과 키를 출력하시오.(열의.( 이름은 한글로 변환)
Q5. 운동화를 구매한 사람의 아이디와 이름을 출력하시오.(열의.( 이름은 한글로 변환)
Q6. 단가(가격/price)이 100원보다 큰 물건을 구매한 사람의 아이디와 이름을 출력하시오.(열의 이름은 한글로 변환)
Q7. 전자 제품을 구매한 사람의 아이디와 이름을 출력하시오.(열의 이름은 한글로 변환)
Q8. 서울에 사는 사람이 구매한 경우 아이디와 물품명을 출력하시오.(열의.( 이름은 한글로 변환)
Q9. 서울 이외의 지역에 사는 사람이 구매한 경우 아이디와 물품명, 분류 내역을(groupName) 출력하시오.
Q10. 이름이 성시경인 사람과 나이 차이가 1010살 차이 미만인 사람(형/동생) / 동갑(친구) 포함
Q11. 이름이 성시경인 사람과 나이 차이가 1010살 차이 미만인 사람(형/동생) / 동갑(친구) 제외
*/
/* |
SELECT 필드명,......., "A", (SELECT ... FROM )
FROM 테이블명(인스턴스_명.데이터베이스_명.스키마_명.테이블_명) (SELECT ... FROM )
WHERE 조건절 (SELECT ... FROM )
/* ORDER BY : 원하는 순서대로 정렬하여 출력 (오름 asc / 내림 차순 desc) -- 기본적으로 오름 차순으로 정렬 (asc 생략 가능) -- 내림 차순으로 정렬하려면 필드명 뒤에 DESC 적어 주면 -- ntext, text, image, geography, geometry, xml 등의 형식에는 ORDER BY를 사용할 수 없음. -- ORDER BY 절은 쿼리 문의 제일 뒤에 와야 함. -- ORDER BY 절은 SQL Server의 성능을 상당히 떨어뜨릴 소지가 있으므로 꼭 필요한 경우가 아니면 되도록 사용하지 않는 것을 권장 */ |
--먼저 가입한 순서로 회원들을 출력 (이름, 가입 날짜)
select name '이름', mdate '가입날짜' from usertbl order by mdate;
select name '이름', mdate '가입날짜' from usertbl
order by mdate asc;
ㄴ위 두 개는 결과가 같음 -오름차순
select name '이름', mdate '가입날짜' from usertbl
order by mdate desc;
ㄴ내림차순
-- 키가 큰 순서대로 정렬
select * from usertbl
order by height desc;
-- 나이가 어린 순서대로 정렬
select * from usertbl
order by birthyear desc;
-- 주소가‘서울’이면서 동시에 국번이‘011’인 회원과 키가 같은 회원의 정보를 출력 (이름으로 오름/내림차순)
select * from usertbl
where height = (select height from usertbl where addr=N'서울' and mobile1='011')
order by name;
select * from usertbl
where height = (select height from usertbl where addr=N'서울' and mobile1='011') order by name desc;
-- 회원 테이블에서 회원들의 거주지역 확인
select addr from usertbl;
select addr from usertbl order by addr;
-- 중복 제거 : DISTINCT (중복 제거할 필드명 앞에 사용)
select DISTINCT addr from usertbl;
-- 회원의 전화번호 국번의 종류가 몇 개 인지를 출력하되 정렬해서 출력. select distinct mobile1 from usertbl order by mobile1;
select distinct mobile1 from usertbl where mobile1 not like 'NULL' order by mobile1; select count(distinct mobile1) as N'개수' from usertbl where mobile1 not like 'NULL';
-- count(*) : 행의 개수를 반환하는 함수
select * from usertbl;
select count(*) '실행결과 수' from usertbl;
/* AdventureWorks DB의 sales.creditCard 테이블에 ExpYear(신용카드유효년도)와 ExpMonth(신용카드유효월) 열을 참조하여 유효기간이 얼마 남지 않은 Vista 카드의 카드번호 10개를 알고 싶다면?
ORDER BY 사용한 경우 , order by 필드명1, 필드명2 ㄴ필드명1을 먼저 정렬 후, 필드명2를 정렬함 */
ex) select * from adventureworks.sales.creditcard where cardtype='Vista' order by expyear, expmonth; |
-- 상위 N개만 보여 주는 구문 : TOP(N) from adventureworks.sales.creditcard where cardtype='Vista' order by expyear, expmonth;
-- 전체의 1% 만 출력 : count(*) / 100 -- select TOP에 하위쿼리 사용되는 예제 SELECT TOP(SELECT COUNT(*)/100 FROMSales.CreditCard) * FROM adventureworks.Sales.CreditCard WHERE CardType= 'Vista' ORDER BY ExpYear, ExpMonth
-- 상위 0.1% 만 출력 SELECT TOP(SELECT COUNT(*)/1000 FROM Sales.CreditCard WHERE CardType= 'Vista') * FROMadventureworks.Sales.CreditCard WHERE CardType= 'Vista' ORDER BY ExpYear, ExpMonth;
-- 상위 N% 만 출력 : TOP(N) PERCENT (반올림) FROM adventureworks.Sales.CreditCard WHERE CardType= 'Vista' ORDER BY ExpYear, ExpMonth; |
/* 학생 100명 중 상위 3%에게만 장학금을 주려고 하는 경우,
점수 분포가 100점 1명, 99점 1명, 98점 5명이라면
공동 3등인 98점 5명 에게는 모두 장학금을 지급하는 것이 공평함.
이와 같이 마지막 출력 값과 동일한 값이 있으면 N%가 넘더라도
출력하는 ‘WITH TIES’옵션을 TOP(N) PECENT 구문에서 제공하고 있음. */
SELECT TOP(0.1) PERCENT WITH TIES * -- 동점자 처리를 위한 WITH TIES
FROM Sales.CreditCard WHERE CardType = 'Vista'
ORDER BY ExpYear, ExpMonth;
-- 샘플 추출 TABLESAMPLE절 /* 전체에서 무작위로 일정한 샘플 데이터를 추출하고자 하는 경우 : TABLESAMPLE 절 - tablesample 절은 대량의 행이 있는 테이블에서는 제대로 실행되지만 소량의 행이 있는 테이블에서는 예상대로 실행되지 않음. (이유는 샘플링의 기준을 행의 개수로 하지 않고 페이지를 기준으로 하기 때문.) */
SELECT * FROM adventureworks.Sales.SalesOrderDetail; SELECT * FROM adventureworks.Sales.SalesOrderDetail TABLESAMPLE(5 PERCENT); -- Sales.SalesOrderDetail 테이블의 경우 대략 12만 건 정도 되므로 그 5%인 6,000건 내외를 샘플링해 줌. -- 이 구문은 실행 시마다 다른 데이 터를 샘플링해 주며, 개수도 달라짐.
-- 5000개의 샘플 데이터를 추출하겠다!!!!! (개수 고정) SELECT TOP(5000) * FROM adventureworks.Sales.SalesOrderDetail TABLESAMPLE(5 PERCENT); |
SELECT select_list INTO new_table -- SELECT .... INTO : 실행 결과를 테이블로 생성 -- SELECT 복사할필드명,.... INTO 새로운테이블이름 FROM 기존테이블이름 select * from buytbl; select * INTO buyTbl2 FROM buyTbl; //복사하여 생성함
select * from buytbl2; select * from buytbl; |
/* SELECT TOP(5000) * FROM Sales.SalesOrderDetail TABLESAMPLE(5 PERCENT);의 결과를
sqldb에 sampletable 라는 이름의 테이블로 저장(생성) 시켜 보시오! */