MySQL 쿼리문

sumin·2022년 6월 7일
하.. 윈도우 설치 너무 힘들었다.... 오류..그리고 오류... 다시 오류......
낯선 MySQL과 친해지기 위해 강의를 들으며 실습한 내용을 정리해 보았다..

📌DDL (Data Define Language)

  • CREATE, ALTER, DROP 대표적인 쿼리문
  • 데이터베이스 & 테이블을 정의 하는 쿼리
  • 네이밍 컨벤션 Snake_Case 사용
  • 예약된 키워드들은 대문자로 사용한다 (CREATE, SHOW 등)
  • 마지막에 ;을 사용하여 명령을 마무리 해야한다

1. CREATE DATABASE

$ mysql -u root -p // mySQL 시작!
CREATE DATABASE my_favorite_artists; # Database 를 생성하는 명령어
SHOW DATABASES; # 현재 MySQL 에 저장되어있는 데이터베이스를 보는 명령어

2. CREATE TABLE

(1) artists table 생성하기

CREATE TABLE artists 
(
  id INT NOT NULL AUTO_INCREMENT, 
  # id 칼럼을 정수, NULL 을 허락하지 않으며 값을 자동증가하게 설정합니다.
  name VARCHAR(100) NOT NULL, 
  # name 칼럼을 100의 크기를 가지는 문자열, NULL 을 허락하지 않습니다.
  PRIMARY KEY (id) # 이 테이블의 Primary Key 를 id 로 설정합니다.
); # 쿼리문은 ; 로 구분되기 때문에 엔터를 쳐서 쿼리문을 멀티라인으로 작성할 수 있습니다.
  • CREATE TABLE <이름> : table 이름
  • id : 칼럼
  • INT : 데이터 타입
  • NULL : NULL 데이터를 허용
  • NOT NULL : NULL 데이터를 허용하지 않음
  • VARCHAR(100) : 소괄호 안에는 허용할 수 있는 글자 수를 적음

* NULL(undefined) : 데이터가 아예 안들어 왔을때
* id에는 NULL을 허용하지 않음
  • id INT NOT NULL AUTO_INCREMENT,
    : NULL 이라는 값을 허용할 것인지 물어보는 것

  • 값이 없는 것을 표현할 때
    ex) Phone VARCHAR(100) NOT NULL DEFAULT "", -> DEFAULT ""를 넣어줌
    (= 추후 빈 string이 들어갈 수 있다)

관계형 데이터베이스에서는 NOT NULL을 하는 것이 좋다
(가끔 사용될 때도 있다 update_at 같은 경우 등등..)
NULL 이라는 값이 없는 게 자연스럽게 표현됨

▽ 테이블을 생성한 후에 항상 원하는 대로 잘 생성 되었는지 확인

DESC artists; # Description 을 축약해 놓은 명령어로써, 테이블의 정보를 보여줍니다.

💡 NULL과 DEFAULT에 모두 허용이 되어 있지 않기 때문에
💡 나중에 값을 넣어주지 않으면 오류가 날 수 있다!

(2) songs table 생성하기

CREATE TABLE songs
(
  id INT NOT NULL AUTO_INCREMENT,
  title VARCHAR(100) NOT NULL,
  lyrics VARCHAR(2000),
  artist_id INT,
  PRIMARY KEY (id),
  FOREIGN KEY (artist_id) REFERENCES artists (id) 
  # 외래키를 걸어줄 칼럼과 참조할 테이블과 칼럼을 순서대로 적어줍니다.
);

  • lyrics와 artist_id(FK)는 NULL을 허용한다
    ex) artist 없이 노래만 넣고 싶을 때 NULL 허용
    MULTIPLE -> MUL ( = foreign key) : 여러 행이 동일한 값을 가질 수 있음을 의미
  1. MySQL 에 원하는 데이터베이스를 생성하는 명령어는 CREATE DATABASE {database_name}; 입니다.
  2. 생성된 데이터베이스에 접근하는 명령어는 USE {database_name} 입니다.
  3. 데이터베이스 내부에 테이블을 생성하는 명령어는 CREATE TABLE {table_name} (field_names); 입니다.

3. ALTER

  • table에 COLUMN을 추가/삭제할 수 있다
ALTER TABLE artists ADD COLUMN phone_number VARCHAR(20) NOT NULL DEFAULT "";
ALTER TABLE artists DROP COLUMN

(세부적인 문법은 꼭 확인해 보기 - 지금은 이런 식으로 추가하고 삭제할 수 있다는 것만 알아두자!!)

💡 COLUM 이름 변경하기

  • RENAME COLUMN은 이름만 바꾸는데 사용 가능
    데이터 정의나 위치 변경과 같은 추가적인 기능이 필요하면 CHANGE를 사용
ALTER TABLE table_name RENAME COLUMN old_column_name TO new_column_name;
ALTER TABLE table_name CHANGE old_column_name new_col_name Data Type;

💡 번외 ) artists에 phone_number를 추가 & 삭제 과정!

ALTER TABLE artists ADD COLUMN phone_number VARCHAR(20) NOT NULL DEFAULT "";
DESC artists; // 확인
INSERT INTO artists (name, phone_number) VALUES ("홍길동", "010-1234-5678");
SELECT * from artists; // 확인
ALTER TABLE artists DROP COLUMN phone_number; 


📌DML (Data Manipulation Language)

  • INSERT, UPDATE, DELETE 대표적인 쿼리문
    INSERT : 데이터 삽입
    UPDATE : 데이터 규칙 아래에서 수정을 할 때
    DELETE : 데이터 삭제 (조건이 붙거나 등등)

1. INSERT INTO (table)

  • 해당 테이블에 데이터를 넣는다
INSERT INTO artists (name) VALUES ('Radio Head'); 
#INSERT INTO 뒤에는 테이블 명과 칼럼값을 소괄호로 감싸 줍니다.
#VALUES 뒤에는 실제로 넣을 값을 소괄호로 감싸주고 앞서 테이블의 칼럼을 지정한 순서대로 데이터를 넣으면 됩니다.
INSERT INTO artists (name) VALUES ('Pink Floid');
INSERT INTO artists (name) VALUES ('새소년');
  • INSERT INTO artists (name) VALUES ('Radio Head');
    : artists table의 name 칼럼에 'Radio Head'을 넣겠다

🤔 ID는 왜 없을까? -> 아까 옵션(AUTO_INCREMENT)으로 주었기 때문에 쓰지 않음

INSERT INTO artists (name) VALUES ('가수명1'), ('가수명2'), ('가수명3');
# 여러개를 동시에 넣을 때

▽ 테이블 전체를 조회하는 쿼리문

SELECT * FROM artists; # * 는 와일드카드로써 테이블의 모든 칼럼을 조회하겠다는 의미와 같습니다.

▽ 여러 개의 칼럼을 넣을 때!

INSERT INTO songs (title, lyrics) VALUES ("제목", "가사");

💡 artist_id는 NULL을 허용했기 때문에 title, lyrics만 추가하여도 오류가 나지 않는다 !

2. UPDATE (table) SET (column)

  • 데이터를 수정하기 위해 사용
  • UPDATE 테이블이름 SET 칼럼이름 = 수정할 데이터 WHERE id = 아이디번호;
UPDATE artists SET name='Pink Floyd' WHERE id = 2;
# UPDATE 쿼리문은 데이터를 수정할 테이블을 기입합니다.
# 바꾸고자 하는 칼럼값에 새롭게 업데이트 할 데이터를 대입합니다.
# WHERE 문은 프로그래밍 언어의 if 문이라고 생각하면 됩니다. 조건을 주는 쿼리문 입니다.
# 이 예제에서는 id=2 즉, artists 테이블의 id가 2번인 데이터에 대해서 UPDATE를 하겠다는 의미입니다.
  • WHERE 뒤에는 고유key (pk)를 사용한다
    -> 의도하지 않은 데이터를 수정할 수도 있기 때문에 고유키를 사용해야 한다

3. DELETE FROM (table)

DELETE FROM artists WHERE name ='새소년';
# DELETE 쿼리문은 테이블의 이름과 WHERE 문으로 조건을 걸어주면 됩니다. 

-> '새소년'과 관련된 데이터들을 모두 지운다(row)

  • '새소년'의 ID = 3도 사라진 것을 확인할 수 있다.
    만약 ID 4,5 있다면 artists의 테이블은 1,2,4,5의 아이디와 데이터들만 있다
  1. DML은 Data Manipulation Language 의 약자로써 데이터를 조작하는 쿼리문들을 뜻 합니다.
  2. 테이블에 데이터를 넣을 때 사용하는 명령어는 INSERT INTO {table_name} (column1, column2, ... ) VALUES (data1-1, data1-2, ... ), (data2-1, data2-2, ... ); 의 형태로 사용합니다.
  3. 이미 입력된 데이터를 수정하는 명령어는 UPDATE {table_name} SET {column_name}={new_data} WHERE {condition}; 입니다.
  4. 기존에 입력되어 있던 데이터를 지우는 명령어는 DELETE FROM {table_name} WHERE {condition}; 입니다.

📌DQL (Data Query Language) & JOIN

  • 데이터를 가져오는데 어떤 데이터를 가져올건지 , 그 데이터를 어떻게 가져올건지 기술하는 부분
  • 데이터를 요청하는 기술

▽ DQL을 하기 앞서 앞의 aritsts와 songs 초기화

TRUNCATE songs;

TRUNCATE artists;
ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`my_favorite_artists`.`songs`, CONSTRAINT `songs_ibfk_1`)
// foreign key 때문에 -> foreign key constraint fail unset 구글 검색 -> SET FOREIGN_KEY_CHECKS=0;

SET FOREIGN_KEY_CHECKS=0;

TRUNCATE artists;

SET FOREIGN_KEY_CHECKS=1;

//초기화 완료!

1. SELECT

  • SELECT * (전체, wild card) : 전체 칼럼을 선택 (다 가져옴)
  • SELECT name FROM artists : artists의 name만 가져옴
SELECT * FROM artists
SELECT name FROM artists; 

(1) WHERE 조건문

  • where 뒤에 쓰는건 자동으로 조건문으로 인식
  • where행(row)을 가져오는 것
    id, title, artist_id들은 열(calumn)
SELECT id, title, artist_id FROM songs WHERE artist_id = 1;

(2) WHERE + LIKE 조건문

SELECT id, title, artist_id FROM songs WHERE title LIKE "ALL%";
// ALL 뒤에 뭐가 있든 다 찾겠다 : 문자열 데이터를 사용해서 보여줌

(3) COLUM의 key값을 바꾸기

-- nickname -> username
SELECT users.nickname AS username

2. JOIN

  • fk를 사용해서 두개의 table을 합쳐준다
  • table을 join 할때에는 칼럼에 테이블 이름을 붙여서 작성해야함
    SELECT id ~~ -> SELECT songs.id ~~
  • join에 아무것도 안 붙어있음 -> inner join
    두가지 타이틀이나 아티스트가 연관된게 있어야 사용....??
SELECT songs.id, songs.title, artists.name FROM songs JOIN artists ON songs.artist_id = artists.id;

  • left join & right join
SELECT songs.id, songs.title, artists.name FROM songs JOIN artists ON songs.artist_id = artists.id; 
//FROM songs left에 있음 JOIN 뒤는 right에 있음

(1) JOIN + WHERE + LIKE 조건문

SELECT artists.id, artists.name, songs.title
FROM artists
JOIN songs
ON artists.id = songs.artist_id
WHERE songs.lyrics LIKE '%you%' OR songs.lyrics LIKE '%i%'; 
# 가사에 you 또는 i가 들어간 데이터만 조회합니다.
// where을 먼저 거치고 JOIN을 한다..!?

  1. DQL은 Data Query Language 의 약자로 데이터를 쿼리하는데 사용되는 SQL문을 뜻합니다.
  2. 기본적인 SELECT 문에 LIKE, WHERE 를 사용하여 제한적인 조건이 적용된 데이터를 선택할 수 있습니다.
  3. JOIN 문을 사용하면 서로 다른 테이블 공유하는 컬럼을 기준으로 연결된 데이터를 쿼리할 수 있습니다.

느아아아아아아~~ 어렵다~~ 🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪🤪

0개의 댓글