Database

[SQL/MySQL] SELECT 데이터 조회

HSRyuuu 2023. 4. 25. 16:29

SELECT FROM

SQL에서 데이터를 조회할 때는 기본적으로 SELECT A FROM B를 사용한다.

SQL의 특징 중 하나는 사용하는 구문이 영어 그 자체와 비슷하다는 점이다.

SELECT(선택한다) A를 , FROM B (B로부터)라고 해석하면 어느 정도 말이 된다.

SELECT CustomerName FROM Customers;

위의 코드는 " 선택한다, CustomerName을, 어디로부터? , Customers 테이블로부터. "라고 해석할 수 있다.

이렇게 간단하면 좋겠지만, 이외에도 WHERE, AS, DISTINCT 등 여러 가지 키워드를 덧붙여서 조금 더 조건에 맞는 데이터를 조회하기 위한 방법들이 있다. 

 

조건을 더하기위해 WHERE을 사용한다.

SELECT... FROM... WHERE...

SELECT attribute(s) 

FROM table(s)

WHERE condition(s)

SELECT * FROM Customers WHERE CustomerID < 10;

조회 기본

1)  SELECT FROM - 전체 조회

* (asterisk) : 선택된 tuples의 모든 값들을 가져오려 할 때 사용한다.

 

아래 코드는 Customers 테이블의 모든 데이터를 조회한다.

SELECT * FROM Customers;

2) column(attribute) 조회

SELECT CustomerName FROM Customers;

(여러 개의 column을 한 번에 가져올 수도 있다.)

SELECT CustomerId, CustomerName, PostalCode FROM Customers;

3) row(tuple) 조회

WHERE의 조건에 맞는 tuple 들을 조회한다.

SELECT * FROM Customers WHERE CustomerID < 10;

WHERE : 조건 지정

위에서 SELECT와 FROM 사이에 조건을 넣기도 하고, 뒤에 WHERE을 사용해서 조건을 넣기도 했다.

이 두 개를 혼합해서 사용하면 좀 더 자세한 조건을 지정할 수 있다.

예제 1) : 원하는 column, 조건 지정

SELECT : customerId, CustomerName, country 세 개의 column 

FROM : Customers 테이블

WHERE : CustomerID가 3 이하인 tuple

SELECT customerId, CustomerName, country FROM Customers WHERE CustomerID <= 3;


예제 2) : 두 개의 테이블에서 조건 지정

SELECT : Employees 테이블에서 EmployeeID, LastName, FirstName 정보를 조회한다.

FROM : Employees, Orders 두 개의 테이블

WHERE : OrderID=10250이고, Employees.EmployeeID=Orders.EmployeeID 

 

즉, Orders의 OrderID가 10250인 tuple의 직원 정보를 찾는다.

SELECT Employees.EmployeeID, LastName, FirstName 
	FROM Employees,Orders 
	WHERE Orders.OrderID=10250 and Employees.EmployeeID=Orders.EmployeeID;

 위의 예제에서 WHERE의 조건들은 selection condition, join condition 두 개로 볼 수 있다.

 

Orders.OrderID=10250

- selection condition으로, Orders 테이블의 OrderID가 10250인 tuple을 선택한다.

Employees.EmployeeID=Orders.EmployeeID

-  join condition으로, Employees 테이블과 Orders 테이블을 연결시켜 준다.


3) attribute 이름이 두 개의 테이블에 모두 존재할 때

(예제 2)에서 Employees.EmployeeID와 같이 해당 attribute가 속해있는 테이블 명을 명시해 줬다.

그 이유는 Employees 테이블에도 EmployeeID가 존재하고, Orders 테이블에도 EmployeeID가 존재하기 때문이다.

따라서 두 테이블에 모두 존재하는 attribute의 경우에는 위와 같이 테이블명을 명시해줘야 한다.

 

하나의 테이블에만 존재하는 attribute의 경우에는 생략해도 된다.


AS : 별칭 지정

AS는 테이블이나 attribute에 별칭(alias)을 붙일 때 사용한다.

1) attribute에 별칭 지정

SELECT
    CustomerId AS ID,
    CustomerName AS name,
    PostalCode AS code
FROM Customers;

2) TABLE에 별칭 지정

WHERE의 (예제 2)에 쓰였던 SQL을 아래와 같이 바꿀 수 있다.

SELECT E.EmployeeID, E.LastName, E.FirstName 
	FROM Employees AS E, Orders AS O 
	WHERE O.OrderID=10250 and E.EmployeeID=O.EmployeeID;

DISTINCT : 중복 제거

검색 결과가 여러 개인데, 중복이 있을 때 정확히 일치하는 중복을 제거해 준다.

 

아래 예제는 position이 DSGN(디자인)인 employee가 참여하고 있는 project를 조회한다.

SELECT : project id, project name

FROM : employee , works_on , project 테이블

WHERE 

- selection condition : employee.position='DSGN'

-  join condition : E.id=W.empl_id and W.proj_id=P.id

SELECT DISTINCT P.id, P.name
	FROM employee AS E, works_on AS W, project AS P
    WHERE E.position='DSGN' and E.id=W.empl_id and W.proj_id=P.id

LIKE

% 기호는 0개 이상의 임의의 개수를 가지는 문자를 의미한다.

예제 1)  ~로 시작하는, ~로 끝나는 ( % )

아래 예제는 employee 테이블에서, 이름이 N으로 시작하거나 N으로 끝나는 임직원의 이름을 조회한다.

SELECT name 
	FROM employee
    WHERE name LIKE 'N%' or name LIKE '%N';

예제 2)  ~를 포함하는 ( %...%)

아래 예제는 employee 테이블에서, 이름에 NG가 들어가는 임직원의 이름을 조회한다.

SELECT name 
	FROM employee
    WHERE name LIKE '%NG%';

예제 3) 글자수 지정 ( _ )

아래 예제는  employee 테이블에서, 이름이 J로 시작하고, 4글자인 임직원의 이름을 조회한다.

( "_" 사이에 띄어쓰기는 안 한다.)

 

SELECT name 
	FROM employee
    WHERE name LIKE 'J_ _ _';

예제 4) escape

% 또는 _ 앞에 백슬래시 "\"와 함께 사용한다.

아래 예제는 %로 시작하거나 _ 로 끝나는 프로젝트 이름을 조회한다.

SELECT name 
	FROM project
    WHERE name LIKE '\%%' or name LIKE'%\_';

ORDER BY :  정렬 지정 

  • ASC : 오름차순 (default)
  • DESC : 내림차순

OrderDetails 테이블에서 ProductId를 오름차순으로, 같은 ProductId끼리는 Quantity를 내림차순으로 정렬

SELECT * FROM OrderDetails ORDER BY ProductID ASC, Quantity DESC;

LIMIT : 가져올 개수 지정

  • LIMIT {가져올 개수}
  • LIMIT {건너뛸 개수, 가져올 개수}

10개의 데이터를 가져온다.

SELECT * FROM Customers LIMIT 10;

20개를 건너뛰고, 그다음 10개를 가져온다.

SELECT * FROM Customers LIMIT 20, 10;

예제

  • 조건 1(WHERE) : Quantity가 10 이상 30 이하인 tuple들.
  • 조건 2(ORDER BY) : Quantity 기준으로 오름차순 정렬
  • 조건 3(LIMIT) : 30개의 tuple 건너뛰고, 10개 가져오기. ( 31~40번째 )
  • 조건 4(SELECT) : 해당 tuple의 OrderDetailID, Quantity column만 가져오기 
SELECT OrderDetailID, Quantity FROM OrderDetails
  WHERE Quantity<=30 and Quantity>=10
  ORDER BY Quantity
  LIMIT 30,10;

예제에서 사용한 TABLE

더보기

(Customers)


(Orders)


(OrderDetails)

(employees)

w3 schools
웹 환경에서 여러 가지 프로그래밍 언어 실습을 할 수 있는 사이트이다.
여기서 제공하는 실습용 테이블들을 사용할 것이다.
http://https://www.w3schools.com/mysql/trymysql.asp?filename=trysql_editor

W3스쿨즈는 온라인으로 웹 기술을 배우는 교육용 웹 사이트이다. 콘텐츠에는 HTML, CSS, 자바스크립트, JSON,
반응형