본문 바로가기

DB

MySQL select문

참고 사이트

https://dev.mysql.com/doc/refman/8.0/en/select.html

 

MySQL :: MySQL 8.0 Reference Manual :: 13.2.13 SELECT Statement

13.2.13 SELECT Statement SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr [, select_expr] ... [into_option] [FROM table_referenc

dev.mysql.com

기본적인 where 절
SELECT column name FROM table이름 WHERE 조건식;

ex)
SELECT * FROM usertbl;
SELECT * FROM usertbl where name='장나라';

관계연산자 사용
SELECT userid,name FROM usertbl where birthyear >= 1970 AND height >= 182;
SELECT userid,name FROM usertbl where birthyear >= 1970 OR height >= 182;

SELECT name,hight FROM usertbl WHERE height BETWEEN 180 AND 183;

SELECT name, addr FROM usertbl WHERE addr IN('경남','전남','경북');
SELECT name,height FROM usertbl WHERE name LIKE '김%';
SELECT name,height FROM usertbl WHERE name LIKE '_지원';

SELECT name,height FROM usertbl
  WHERE height > (SELECT height FROM usertbl where name='김경호');

SELECT name,height FROM usertbl
  WHERE height >= (SELECT height FROM usertbl WHERE addr='경남');
=> 둘이상의 값이 리턴되면 오류가 발생한다.
해결방법 => 
SELECT name,height FROM usertbl
  WHERE height >= ANY (SELECT height FROM usertbl WHERE addr='경남');
* ANY 대신에 IN을 사용해도 결과는 같다.

ORDER BY
SELECT name,mdate from usertbl ORDER BY mdate [ASC] ; 오름차순 정렬
SELECT name,mdate from usertbl ORDER BY mdate DESC; 내림차순 정렬

DISTINCT - 중복제거
SELECT addr FROM usertbl;
SELECT DISTINCT addr FROM usertbl;

LIMIT - 일부레코드를 건너띄고 출력
USE employees;
SELECT emp_no, hire_date FROM employees
  ORDER by hire_date ASC;

USE employees;
SELECT emp_no, hire_date FROM employees
  ORDER by hire_date ASC LIMIT 10; 
LIMIT 10 => LIMIT 0,10과 같다.  앞에 숫자는 skip 할 레코드 갯수, 뒤에 숫자는 출력할 레코드 갯수

GROUP BY
SELECT userid, amount from buytbl order by userid;
SELECT userid,sum(amount) FROM buytbl GROUP BY userid;

sum() 은 집계함수
집계함수 
AVG() 평균
MIN() 최소값
MAX()최대값
COUNT() 레코드갯수
COUNT(DISTINCT) - 중복을 제거한 레코드 갯수

use sqldb;
select AVG(amount) as '평균 구매 개수' from buytbl;
SELECT userid, AVG(amount) as '평균 구매 개수' FROM buytbl
  GROUP BY userid;

SELECT name,MAX(height),MIN(height) FROM usertbl;
SELECT COUNT(*) FROM usertbl;
SELECT COUNT(mobile1) AS '휴대폰이 있는 사용자' FROM usertbl;

HAVING
USE sqlDB;
SELECT userid AS '사용자', SUM(price * amount) AS '총구매액'
  FROM buytbl
  WHERE SUM(price * amount) > 1000
  GROUP BY userid;
=> 여기서 에러가 발생 , WHERE 대신에 HAVING으로 수정해야 한다.
SELECT userid AS '사용자', SUM(price * amount) AS '총구매액'
  FROM buytbl
  GROUP BY userid
  HAVING SUM(price * amount) > 1000;

INSERT 
use sqldb;
CREATE TABLE t1(id int, username char(3));
INSERT INTO t1 VALUES(1,'홍길동');
INSERT INTO t1(id,username) VALUNES(2,'유재석');

UPDATE
 UPDATE 테이블 이름 SET column이름=value1, colum이름2=value2 ...

DELETE 
DELETE FROM 테이블이름 WHERE 조건;

 

오늘 수업

-- git을 설치합니다.
yum -y install git

-- GitHub에서 "test_db" 프로젝트를 복제합니다.
git clone https://github.com/datacharmer/test_db.git

-- MySQL 데이터베이스에 접속하여 사용자 이름이 "root"이고 해당 사용자의 비밀번호를 입력한 후, 
-- "employees.sql" 파일의 SQL쿼리를 실행합니다.
mysql -u root -p < employees.sql


mysql -q root -p >> show databases;

show databases; 를 통해 employees가 생성된 것을 볼 수 있다.
이 SQL 쿼리는 &quot;employees&quot; 테이블에서 성이 &#39;Range&#39;이고 이름이 &#39;Adel&#39;인 직원의 사원 번호(emp_no)&#44; 이름(first_name)&#44; 성(last_name)을 선택하는 것을 의미합니다.
이 SQL 쿼리는 "employees" 테이블에서 성이 'Range'이고 이름이 'Adel'인 직원의 사원 번호( emp_no ), 이름( first_name ), 성( last_name )을 선택하는 것을 의미합니다.

 

연습 1) usertbl에서 키가 180 이상이고 185 미만인 사람 이름과 키 출력

== usertbl에서 height가 180 이상 185 미만 인 사람의 이름과 키 출력
SELECT name,height FROM usertbl where height >= 180 AND height < 185;
+-----------+--------+
| name      | height |
+-----------+--------+
| 임재범    |    182 |
| 이승기    |    182 |
+-----------+--------+
2 rows in set (0.00 sec)

 

연습 2) usertbl에서 키 순서대로(내림차순)으로 출력(키가 같으면 나이순대로(오름차순)출력)

== usertbl에서 

MariaDB [sqldb]> SELECT name, birthyear, height FROM usertbl ORDER BY height DESC, birthyear;
+-----------+-----------+--------+
| name      | birthyear | height |
+-----------+-----------+--------+
| 성시경    |      1979 |    186 |
| 임재범    |      1963 |    182 |
| 이승기    |      1987 |    182 |
| 김경호    |      1971 |    177 |
| 바비킴    |      1973 |    176 |
| 은지원    |      1972 |    174 |
| 김범수    |      1979 |    173 |
| 조관우    |      1965 |    172 |
| 윤종신    |      1969 |    170 |
| 조용필    |      1950 |    166 |
+-----------+-----------+--------+
10 rows in set (0.00 sec)

 

연습 3) buytbl에서 물건구매를 많이 한 순서대로 출력하는데 세번째 레코드까지만 출력

== buytbl에서 amount 값이 높은 순서대로 출력하는데 3번째 레코드 까지만 출력

MariaDB [sqldb]> select * FROM buytbl ORDER BY amount DESC LIMIT 3;
+-----+--------+-----------+-----------+-------+--------+
| num | userid | prodName  | groupName | price | amount |
+-----+--------+-----------+-----------+-------+--------+
|   6 | BBK    | 메모리    | 전자      |    80 |     10 |
|   7 | SSK    | 책        | 서적      |    15 |      5 |
|   4 | BBK    | 모니터    | 전자      |   200 |      5 |
+-----+--------+-----------+-----------+-------+--------+
3 rows in set (0.00 sec)

 

연습 4) buytbl에서 각 상품 구매갯수를 출력하세요.

== 

MariaDB [sqldb]> select prodname,sum(amount) as '각 상품구매개수' from buytbl group by prodname;
+-----------+------------------------+
| prodname  | 각 상품구매개수        |
+-----------+------------------------+
| 노트북    |                      1 |
| 메모리    |                     10 |
| 모니터    |                      6 |
| 운동화    |                      6 |
| 책        |                      8 |
| 청바지    |                      4 |
+-----------+------------------------+
6 rows in set (0.00 sec)

 

실습 1) 

http://twoseven.kr/class803/db/sql_lab.txt

실습을 하기 위해서 아래의 파일을 다운로드 받으세요
(mysqldump 로 백업한 파일입니다)
wget http://twoseven.kr/class803/db/old-world.tgz (<- sql 소스파일을  압축한 파일입니다.)

>> tar -xzvf /tmp/sql/old-world.tgz -C /tmp/sql/worlddb

다운로드 받은 sql 파일을 실행해서 아래의 질문에 대한 답을 찾으세요
(* sql 소스파일은 아스키 파일이므로 편집기등으로 소스파일 내용 확인가능합니다)

1. 우리나라의 도시중 인구수가 가장 많은 도시는 서울입니다. 그러면
인구수가 가장 적은 도시는 어디인가요?  

2. 우리나라의 전체 인구수는 몇명인가요?

3. 우리나라는 아시아 국가중 gnp 가 몇번째로 높은 나라인가요?

4. 인구수가 가장 많은 나라를 순서대로 5개만 찾으세요.
  
5. 스페인에서 가장 많이 사용하는 언어는 spanish 입니다.
그러면 스페인에서 두번째로 많이 사용하는 언어는 무엇인가요?

 

우리나라의 도시중 인구수가 가장 많은 도시는 서울입니다. 그러면 인구수가 가장 적은 도시는 어디인가요?

MariaDB [world]> SELECT * FROM city WHERE CountryCode = 'KOR' ORDER BY population LIMIT 1;
+------+-----------+-------------+--------------+------------+
| ID   | Name      | CountryCode | District     | Population |
+------+-----------+-------------+--------------+------------+
| 2400 | Mun-gyong | KOR         | Kyongsangbuk |      92239 |
+------+-----------+-------------+--------------+------------+
1 row in set (0.00 sec)

 

우리나라의 전체 인구수는 몇명인가요?

MariaDB [world]> select *,sum(population) from city where CountryCode='KOR' group by CountryCode; 
| ID   | Name  | CountryCode | District | Population | sum(population) |
+------+-------+-------------+----------+------------+-----------------+
| 2331 | Seoul | KOR         | Seoul    |    9981619 |        38999893 |
+------+-------+-------------+----------+------------+-----------------+
1 row in set (0.00 sec)

 

우리나라는 아시아 국가 중 GNP가 몇번째로 높은 나라인가요? (10개 국가 까지만 출력)

MariaDB [world]> select code,name,continent,gnp from country 
where continent='Asia' order by gnp desc limit 10;
+------+--------------+-----------+------------+
| code | name         | continent | gnp        |
+------+--------------+-----------+------------+
| JPN  | Japan        | Asia      | 3787042.00 |
| CHN  | China        | Asia      |  982268.00 |
| IND  | India        | Asia      |  447114.00 |
| KOR  | South Korea  | Asia      |  320749.00 |
| TWN  | Taiwan       | Asia      |  256254.00 |
| TUR  | Turkey       | Asia      |  210721.00 |
| IRN  | Iran         | Asia      |  195746.00 |
| MMR  | Myanmar      | Asia      |  180375.00 |
| HKG  | Hong Kong    | Asia      |  166448.00 |
| SAU  | Saudi Arabia | Asia      |  137635.00 |
+------+--------------+-----------+------------+
10 rows in set (0.00 sec)

 

스페인에서 가장 많이 사용하는 언어는 spanish 입니다. 그러면 스페인에서 두번째로 많이 사용하는 언어는 무엇인가요?

MariaDB [world]> select * from countrylanguage where countrycode='ESP' order by percentage desc;
+-------------+----------+------------+------------+
| CountryCode | Language | IsOfficial | Percentage |
+-------------+----------+------------+------------+
| ESP         | Spanish  | T          |       74.4 |
| ESP         | Catalan  | F          |       16.9 |
| ESP         | Galecian | F          |        6.4 |
| ESP         | Basque   | F          |        1.6 |
+-------------+----------+------------+------------+
4 rows in set (0.00 sec)

 

 

아시아 국가의 GNP 평균은 얼마인가요?

MariaDB [world]> select continent,avg(GNP) from country where continent='Asia';
+-----------+---------------+
| continent | avg(GNP)      |
+-----------+---------------+
| Asia      | 150105.725490 |
+-----------+---------------+
1 row in set (0.00 sec)

'DB' 카테고리의 다른 글

MySql 샘플 DB  (0) 2024.02.01
Table 조인  (1) 2024.02.01
DB 생성과 정규화  (2) 2024.01.31
MariaDB 한글 깨짐 해결 방법  (0) 2024.01.30
MySQL 기초  (0) 2024.01.29