[ZB] SQL 01

SeriesWorld·2023년 11월 27일

ZB20-SQL

목록 보기
1/5
post-thumbnail

Database 관리

  • show databases: 설치된 db 목록 불러오기
  • create database [dbname]: db 생성
  • drop database [dbname]: db 삭제
  • CREATE DATABASE [dbname] DEFAULT CHARACTER SET utf8mb4: 해당 DB의 주 언어 설정

User 관리

  • user 정보는 mysql에서 관리한다.
use mysql;
select host, user from user;   # user 테이블에서 host, user 정보 호출
  • create user 'id'@'권한' identified by 'password': 권한을 가진 id를 생성하고, 비밀번호는 password이다.
    권한은 localhost(현재 pc에서만 접속 가능), %(외부에서 접속 가능)가 있다.
  • drop user 'id'@'권한': ~권한을 가진 유저(id)를 삭제한다.
  • user name과 권한은 세트다. name이 같더라도 권한이 다르면 다른 유저이다.

User 권한 관리

  • SHOW GRANTS FOR 'username'@'localhost': localhost인 username에게 부여된 모든 권한 목록 확인
  • GRANT ALL ON dbname.* to 'username'@'localhost': 해당 유저에게 dbname에 관한 모든 권한을 부여
  • REVOKE ALL ON dbname.* from 'username'@'localhost': 해당 유저의 dbname에 관한 모든 권한 삭제

Table

  • DESC mytable: 표의 상세 정보 호출

Table 생성

  • CREATE TABLE mytable(id int, name varchar(16))
    mytable이란 표를 만든다. 내용은 id에 숫자가 들어가고 name에는 문자(최대16자)가 들어간다.
  • 타입: varchar(문자 최대갯수), int(정수), double(실수), char(문자 1글자), date(날짜) 등
  • 옵션
    NOT NULL: 공백 비허용(반드시 값이 입력되어야 함)
    DEFAULT ~: 값이 입력되지 않으면 자동으로 ~값으로 입력
    AUTO_INCREMENT: 자동으로 값이 증가(일련번호 등에 용이)

Table 수정

  • ALTER TABLE mytable RENAME person: mytable의 이름을 person으로 변경
  • ALTER TABLE person ADD COLUMN agee double: person table에 agee(double타입) 컬럼 추가
  • ALTER TABLE person MODIFY COLUMN agee int: agee 컬럼의 타입을 int로 변경
  • ALTER TABLE person CHANGE COLUMN agee age int: agee컬럼의 이름을 age(int타입)로 변경, 이름과 타입을 동시에 바꿀 수 있다.
  • ALTER TABLE person DROP COLUMN age: age 컬럼 삭제
  • DROP table mytable: mytable 삭제

Table 내용 추가(INSERT)

  • INSERT INTO person (id, name, age, sex) VALUES (1, '홍길동', 43, 'M')
    person table의 id, name, age, sex 컬럼에 1, 홍길동, 43, M을 입력한다.
    모든 컬럼값을 추가하는 경우에는 컬럼 이름을 지정하지 않아도 된다.(단, 컬럼 순서와 동일하게 입력)

Table 내용 조회(SELECT)

  • SELECT ~ FROM ~~: ~~테이블에서 ~컬럼 자료 조회
    컬럼에 * 입력시 모든 컬럼 데이터 조회

WHERE 조건

  • SELECT ~ FROM ~~ WHERE ~~~: ~~표에서 ~~~조건에 맞는 ~컬럼 조회

비교연산자/논리연산자

  • 비교연산자 =, !=, <, >, <=, >=, <>
  • A AND B: A조건과 B조건 모두 참
  • A OR B: A조건 또는 B조건 참
  • NOT A: A조건이 거짓인 경우 참
  • BETWEEN A AND B: A와 B 사이에 있는 경우(A이상 B이하)

    기타 연산(+, -, *, /, %(나머지))도 가능

  • LIKE ~: A패턴에 맞는 경우
    %블라: ~블라로 끝나는 데이터
    블라%: 블라~로 시작하는 데이터
    %블라%: 데이터에 블라 문자열을 가지고 있는 데이터

ORDER BY 정렬

  • SELECT ~ FROM ~~ (WHERE ~) ORDER BY column1,column2... (ASC/DESC)
    입력된 컬럼값에 따라 오름차순/내림차순 정렬(ASC/DESC 미입력시 오름차순)
    ORDER BY column1 DESC, column2 ASC 이런 식도 가능
  • ORDER BY 뒤에는 숫자로 입력할 수도 있다.(SELECT에서 선택한 순서대로)

TABLE 내용 수정(UPDATE ~ SET)

  • UPDATE ~ SET ~~: ~테이블에 ~~내용을 수정한다.
    ex) UPDATE person SET age=20: 모든 컬럼의 age를 20으로 수정, WHERE절을 써서 조건을 붙일 수 있다.

TABLE 내용 삭제(DELETE)

  • DELETE FROM ~ WHERE ~~ : ~ 테이블에서 ~~ 조건에 해당되는 data 삭제(row)

UNION

  • 여러 개의 SQL문을 합쳐서 하나의 SQL문으로 만드는 방법(컬럼 개수가 같아야 함)
  • SELECT ~ FROM ~~ UNION SELECT ? FROM ??
    ~~테이블의 ~ 데이터와, ??테이블의 ? 데이터를 합쳐서 중복값을 제거하고 보여준다.
    UNION ALL인 경우 중복 포함 모든 데이터를 보여준다.
  • SELECT문 두 개를 하나로 묶는 개념
  • 컬럼 개수만 같으면 되기 때문에 아래와 같은 이슈가 발생할 수 있다.
    mysql> SELECT name, job_title, birthday FROM celeb WHERE job_title LIKE '%가수%'
        -> UNION
        -> SELECT name, birthday, age FROM celeb WHERE birthday BETWEEN '19800101' AND '19891231';
    +--------+--------------+------------+
    | name   | job_title    | birthday   |
    +--------+--------------+------------+
    | 아이유 | 가수, 텔런트 | 1993-05-16 |
    | 이미주 | 가수         | 1994-09-23 |
    | 이수연 | 가수         | 1999-05-04 |
    | 강동원 | 1981-01-18   | 41         |
    +--------+--------------+------------+
    4 rows in set (0.00 sec)
    • 앞에 입력한 컬럼을 기준으로, UNION 뒤에서 선택한 컬럼 데이터가 들어간다.(컬럼 일치 여부와 상관없이)

JOIN

  • 두 개 이상의 테이블을 결합하는 것
  • FROM, JOIN 구문에서 table을 불러올 때 띄어쓰기로 구분자를 지정할 수 있다.
SELECT c.id, c.name, s.id, s.host
FROM celeb c, snl_show s
WHERE c.name=s.host;

JOIN 종류

INNER JOIN

  • 교집합
SELECT column1, column2, ...
FROM tableA
INNER JOIN table B
ON tableA.column = tableB.column
WHERE condition;

FULL OUTER JOIN

  • 합집합
  • MYSQL에서는 지원하지 않음. left join, right join을 union으로 합칠 수 있다.

LEFT JOIN

  • 교집합 + 왼쪽에만 있는 데이터

RIGHT JOIN

  • 교집합 + 오른쪽에만 있는 데이터

SELF JOIN

  • inner join과 같은 결과
  • from으로 두 개의 테이블을 불러와 where절에서 조건으로 교집합을 구한다
SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb, snl_show
WHERE celeb.name=snl_show.host;

CONCAT

  • 여러 문자열을 하나로 합치거나 연결
    ex) SELECT CONCAT('str1', 'str2'); -> str1str2

ALIAS

  • 컬럼이나 테이블 이름 별칭 생성(약자 or 더 알아보기 쉬운 단어로 설정 가능)
    ex) SELECT name as '이름' FROM celeb; -> 출력시 table 컬럼이 name이 아닌 이름으로 출력된다.
  • as는 생략 가능하다.
  • CONCAT + ALIAS 혼합 사용 예시
SELECT CONCAT(name, ' : ', job_title) as profile FROM celeb;
+---------------------------+
| profile                   |
+---------------------------+
| 아이땡 : 가수, 텔런트     |
| 이미땡 : 가수             |
| 송땡 : 텔런트             |
| 강동땡 : 영화배우, 텔런트 |
| 유재땡 : MC, 개그맨       |
| 차승땡 : 영화배우, 모델   |
| 이수땡 : 가수             |
+---------------------------+

DISTINCT

  • 중복 제거

LIMIT

  • SELECT문 맨 뒤에 입력시 출력되는 데이터 개수를 제한

0개의 댓글