TIL 48- SQL

Churro.·2021년 12월 22일
0

Database

3-tier : 클라이언트, 서버, 데이터베이스

  • 자연스럽게 나뉘어진 결과
  • 나뉘어져 있어 오류 잡기 수월
  • 세분화, 전문화 인력 가능

SQL 사용법

1️⃣ 접속

mysql -u root -p'비번' (short option)

mysql —user root —password='비번' (long option)

mysql -u root -p비번 (제일 짧은 형식)

2️⃣ DB생성

show databases; (데이터베이스를 보여달라)

create database mydb; (mydb라는 이름을 가진 데이터베이스 생성)

show databases; (만든 거 확인)

3️⃣테이블 생성

create table mytable (firstName text, lastName text);

select database(); 하면 NULL 이라고 뜸.

ctrl+d 눌러서 나가기

mysql -u root -p비번 mydb;

select database(); 하면 mydb가 뜸.

create table mytable (firstName text, lastName text); (mytable이라는 이름의 테이블 생성)

show tables;

select * from mytable; 하면 empty set이라고 뜸.

insert into mytable (firstName, lastName) values ('Hello', 'Kim');

select * from mytable; (테이블 안에 내용 보기)


💡 \h create user 치면 도움말(명령어 list)

💡 GRANT ALL ON mydb.* TO user; → 모든 것에 대한 모든 권한을 user에게 줌

💡 ctrl+d 는 나가기 (가끔 ctrl+c)

👉 생성한 테이블의 속성(?)을 보고 싶을 때 : describe mytable;

👉  특정 데이터베이스 안에서 작업 원할 때 :

use 데이터베이스명; (database changed라고 뜨면 정상)
show tables;

SQL 문법

  • a% → a로 시작하는
  • %a → a로 끝나는
  • DESC 내림차순 , 아무것도 안쓰면 오름차순
  • 조건은 WHERE 다음에 위치
  • BETWEEN 은 이상, 이하 ( ≥ ≤ )
  • <,> 는 미만,초과

SELECT * FROM Persons WHERE LastName BETWEEN 'Hansen' AND 'Pettersen' (includes)

SELECT * FROM Persons WHERE LastName>'Hansen' AND LastName<'Pettersen' (X includes)


INSERT INTO Persons (lastName) VALUES ( 'Jimmy')

→ Persons라는 테이블의 lastName column에 Jimmy 라는 데이터를 넣고 싶다


UPDATE Persons SET lastName='Nilsen' WHERE lastName='Hansen'

→ Hansen을 Nilsen으로 변경


DELETE FROM Persons WHERE firstName='Peter'

→ Persons라는 테이블의 firstName이 Peter인 애들 삭제


SHOW는 db나 table 목록을 보여줌

table의 내용을 보려면 select


delete from mytable where firstName='Red';


delete from mytable; 전체내용 삭제


select * from mytable left (outer) join mytable2 on mytable.firstName=mytable2.firstName;

⇒ mytable은 왼쪽에 다 나오고, mytable2중에서 mytable과 firstName일치하는 애들만 오른쪽에 출력

select * from mytable right (outer) join mytable2 on mytable.firstName=mytable2.firstName;

⇒ mytable2는 오른쪽에 다 나오고, mytable중에서 mytable2와 firstName일치하는 애들만 왼쪽에 출력

select lastName, count(lastName) from mytable group by lastName;

⇒ 동일한 lastName 몇개 있는지 보여줌


💡 join = inner join

💡 join ⛔️ outer join

💡 outer join은 left, right 로 나뉘어짐

💡 left outer join = left join

SPRINT learn-sql

client: 우리가 사용하는 node.js

server: database (여기서 db 이름은 learnmysql)

시작 전, vscode terminal에서 npm install mysql, npm install dotenv 설치해야 한다.

(mysql 모듈과 dotenv 모듈 설치하여 database와 정해진 모듈 rules 이용해 쉽게 소통하기 위해)

(📌 mysql은 오래된 버전이라 mysql2 설치 추천.

mysql로 이미 설치완료했다면, mysql -u root -p비번 learnmysql에 접속 후, alter user 'root'@'localhost' identified with mysql_native_password by '비번'; )

성공적으로 설치 되었다면 terminal통해 learnmysql 접속해서 database 만들어주고 sprint 시작하기.

Pt3- table의 뼈대를 생성해줌 (schema-설계도)

Pt4,5- query 사용하여 table에서 추가,삭제,조회 등


SELECT * FROM table -> table의 모든 column을 보여줘
SELECT name, title FROM table -> table의 name, title column만 보여줘
(WHERE로 조건을 별도 지정하지 않았을 때, 기본적으로 row는 0~n까지 다 보여주게끔 설정되어 있다.)

SELECT 표시할column AS 표시할column의새이름 FROM table1 JOIN table2 ON table1.id=table2.userId WHERE table1.name='DuriCha';
👉ON 일치조건 (table1.id=table2.userId)
👉WHERE 조건에 일치하는 결과물 중 표시할 정보 (table1.name='DuriCha')

... table1 JOIN table2 ON 조건;
👉 JOIN은 table1과 2를 가로로 붙여준다 (ON을 쓰지 않을 시, 모든 조합이 나옴(경우의수)- 쓸모X) (ON 뒤에는 항상 조건이 붙어야 한다. ON으로 끝나면 X)

NULL 사용시 '=' 쓰지 않는다.
is null / is not null 로 사용.

COUNT(column명) 👉 column에 몇개 있는지 세줌
COUNT(1) 👉 record(data)의 갯수만큼 무조건 세줌 (1은 true니까)

...table1 LEFT JOIN table2 : 왼쪽은 다 나옴 (table1의 data는 일치여부 상관없이 다 나옴)
...table1 RIGHT JOIN table2 : 오른쪽은 다 나옴 (table2의 data는 일치여부 상관없이 다 나옴)

JOIN 은 왜 쓰는가 ?
1대 다: FOREIGN KEY 로 그냥 표현하면 됨
다대 다 : FOREIGN KEY 로 표현불가. sprint의 'content_category' table은 실질적 data는 없는데, 다대다 표현하기 위해 존재 -> content와 category 연결해주는 table일 뿐.

SELECT 기준column, aggregate function GROUP BY 기준column 👉 group by 뒤에 나오는 기준column과 select 뒤의 기준column은 동일해야 한다. aggregate function은 집계함수로, count()가 이에 포함된다.

profile
I, sum of records.

0개의 댓글