https://uncovered-nutmeg-b8e.notion.site/SQL-26c9cc5a40e14decb20f4dc72cbb194d
데이터베이스란? 데이터를 저장하는 곳
DBMS (Database Management System) : mysql
-> 데이터베이스 내 데이터를 접근하고 관리하는 시스템
mySQL
-> mysql -u root (접속)
<데이터베이스 용어>
테이블 : 데이터 요소들의 집합 -> 하나의 데이터베이스에 여러개의 테이블이 있을 수 있다.
컬럼 : 테이블의 열
SQL (Structured Query Language)
1.데이터베이스를 만드는 SQL문
CREATE DATABASE 이름 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
2.데이터베이스를 보기
show databases;
3.데이터베이스 삭제
DROP DATABASE 이름;
=> 테이블 삭제 drop table 테이블명;
4.데이터베이스 이용
USE 이름; ==> 데이터베이스 안으로 들어온 것.
5.테이블 만들기
CREATE TABLE 테이블명(
이름(컬럼명1) 데이터타입,
나이(컬럼명2) 데이터타입,
);
CREATE TABLE member(
이름 varchar(5) not null,
나이 int(3) not null,
)
=> eunum('a','b') a와 b중 하나의 값만 넣을 수 있다.
6.테이블 구성 보기
desc 테이블명;
=> 테이블 구성 '요소' 보기 => select * from member;
7.테이블 구성 요소 관리
CRUD( create read update delete )
1) c - insert (삽입)
INSERT INTO 테이블명 (컬럼1, 컬럼2) VALUES (값1,값2);
INSERT INTO member (id, name, birthday) VALUES ('kim', '홍길동', '2021-08-20');
2) u - update
UPDATE 테이블명 SET 컬럼1=값1, (컬럼2=값2) WHERE 컬럼2=조건2;
#컬럼2가 조건2인 데이터의 컬럼1을 값1로 변경한다.
UPDATE member SET name='김미미' WHERE ID='kim';
=> 조건 거는 법 where문 연산자
: WHERE 컬럼명=값
=같다
!= 같지 않다
<> 같지 않다
IN(10,21,40) 이 숫자 안에 있는거를 조건으로
BETWEEN ~ AND ~ 사이
(AGE >= 40 AND AGE <50
AGE AGE BTEWEEN 40 AND 50;)
+검색조건
and
or
not
in
+패턴(LIKE) %_ (1개의 단일문자)
SELECT ~~ FROM 테이블명 WHERE 컬럼 LIKE '김%' #김으로 시작하는건 다 나옴
SELECT * FROM member WHERE name LIKE '%정%' #정이 들어가면 다 나옴
SELECT * FROM member WHERE name LIKE '정_' #정리 정인
3) d - delete
DELETE FROM 테이블명 WHERE 컬럼1=조건1;
DELETE FROM 테이블명;
4) r -select
테이블 구성 '요소' 보기 => select * from member; => 이건 다 보는거
SELECT name, birthday FROM member;
=> 정렬
SELECT * FROM member ORDER BY name ASC; //오름차순
DESC; //내림차순
*가 컬럼이 들어간다.
파일시스템의 단점
1. 데이터 중복
2. 데이터 불일치
#SELECT > FROM > WHERE > ORDER BY > LIMIT (숫자 제한)
SELECT * FROM member ORDER BY name ASC LIMIT 100;
실습
1)
CREATE TABLE sql_practice(id varchar(10) not null, pw varchar(20) not null, name varchar(5) not null, gender enum('female','male') default 'female', birthday date not null);
1.insert문제
hong1234, 8o4bkg, 홍길동, male, 1990-01-31
sexysung, 87awjkdf, 성춘향, female, 1992-03-31
power70, qxur8sda, 변사또, male, 1970-05-02
hanjo, jk48fn4, 한조, male, 1984-10-18
widowmaker, 38ewifh3, 위도우, female, 1986-06-27
dvadva, k3f3ah, 송하나, female, 1994-06-03
jungkrat, 4ifha7f, 정크랫, male, 1975-11-11
INSERT INTO sql_practice (id,pw,name,gender,birthday) VALUES ('hong1234','8o4bkg','홍길동','male','1990-01-31');
INSERT INTO sql_practice (id,pw,name,gender,birthday) VALUES ('sexysung','87awjkdf','성춘향','female','1992-03-31');
INSERT INTO sql_practice (id,pw,name,gender,birthday) VALUES ('power70','qxur8sda','변사또','male','1970-05-02');
INSERT INTO sql_practice (id,pw,name,gender,birthday) VALUES ('hanjo', 'jk48fn4','한조','male','1987-10-18');
INSERT INTO sql_practice (id,pw,name,gender,birthday) VALUES ('widowmaker','38ewifh3','위도우','female','1986-06-03');
INSERT INTO sql_practice (id,pw,name,gender,birthday) VALUES ('davdav','k3f3ah','송하나','female','1994-06-03');
INSERT INTO sql_practice (id,pw,name,gender,birthday) VALUES ('jungkrat','4ifha7f','정크랫','male','1975-11-11');
select * from sql_practice; +------------+----------+-----------+--------+------------+
| id | pw | name | gender | birthday |
+------------+----------+-----------+--------+------------+
| hong1234 | 8o4bkg | 홍길동 | male | 1990-01-31 |
| sexysung | 87awjkdf | 성춘향 | female | 1992-03-31 |
| power70 | qxur8sda | 변사또 | male | 1970-05-02 |
| hanjo | jk48fn4 | 한조 | male | 1987-10-18 |
| widowmaker | 38ewifh3 | 위도우 | female | 1986-06-03 |
| davdav | k3f3ah | 송하나 | female | 1994-06-03 |
| jungkrat | 4ifha7f | 정크랫 | male | 1975-11-11 |
+------------+----------+-----------+--------+------------+
2.모든 회원목록을 가져오되, birthday 컬럼의 값을 기준으로 오름차순 정렬하여 가져오세요.
SELECT * from sql_practice ORDER BY birthday ASC;
+------------+----------+-----------+--------+------------+
| id | pw | name | gender | birthday |
+------------+----------+-----------+--------+------------+
| power70 | qxur8sda | 변사또 | male | 1970-05-02 |
| jungkrat | 4ifha7f | 정크랫 | male | 1975-11-11 |
| widowmaker | 38ewifh3 | 위도우 | female | 1986-06-03 |
| hanjo | jk48fn4 | 한조 | male | 1987-10-18 |
| hong1234 | 8o4bkg | 홍길동 | male | 1990-01-31 |
| sexysung | 87awjkdf | 성춘향 | female | 1992-03-31 |
| davdav | k3f3ah | 송하나 | female | 1994-06-03 |
+------------+----------+-----------+--------+------------+
SELECT * FROM sql_practice WHERE gender='male' ORDER BY birthday ASC;
+----------+----------+-----------+--------+------------+
| id | pw | name | gender | birthday |
+----------+----------+-----------+--------+------------+
| power70 | qxur8sda | 변사또 | male | 1970-05-02 |
| jungkrat | 4ifha7f | 정크랫 | male | 1975-11-11 |
| hanjo | jk48fn4 | 한조 | male | 1987-10-18 |
| hong1234 | 8o4bkg | 홍길동 | male | 1990-01-31 |
+----------+----------+-----------+--------+------------+
SELECT * FROM sql_practice WHERE birthday LIKE '199%-%%-%%';
+----------+----------+-----------+--------+------------+
| id | pw | name | gender | birthday |
+----------+----------+-----------+--------+------------+
| hong1234 | 8o4bkg | 홍길동 | male | 1990-01-31 |
| sexysung | 87awjkdf | 성춘향 | female | 1992-03-31 |
| davdav | k3f3ah | 송하나 | female | 1994-06-03 |
+----------+----------+-----------+--------+------------+
5.birthday컬럼의 값이 xxxx-06-xx인 회원목록을 가져오되, birthday의 값을 기준으로 오름차순 정렬하여 가져오세요.
SELECT * FROM sql_practice WHERE birthday LIKE '%%%%-06-%%' ORDER BY birthday ASC;
+------------+----------+-----------+--------+------------+
| id | pw | name | gender | birthday |
+------------+----------+-----------+--------+------------+
| widowmaker | 38ewifh3 | 위도우 | female | 1986-06-03 |
| davdav | k3f3ah | 송하나 | female | 1994-06-03 |
+------------+----------+-----------+--------+------------+
6.gender컬럼의 값이 'male'이고 birthday 컬럼의 값이 199x-xx-xx인 회원목록을 가져오세요.
SELECT * FROM sql_practice WHERE gender='male' and birthday LIKE '199%-%%-%%';
+----------+--------+-----------+--------+------------+
| id | pw | name | gender | birthday |
+----------+--------+-----------+--------+------------+
| hong1234 | 8o4bkg | 홍길동 | male | 1990-01-31 |
+----------+--------+-----------+--------+------------+
7.모든 회원목록 중에서 birthday 컬럼의 값을 기준으로 오름차순 정렬하여 가져오되 처음 3개의 레코드만 가져오세요.
SELECT * FROM sql_practice ORDER BY birthday ASC LIMIT 3;
+------------+----------+-----------+--------+------------+
| id | pw | name | gender | birthday |
+------------+----------+-----------+--------+------------+
| power70 | qxur8sda | 변사또 | male | 1970-05-02 |
| jungkrat | 4ifha7f | 정크랫 | male | 1975-11-11 |
| widowmaker | 38ewifh3 | 위도우 | female | 1986-06-03 |
+------------+----------+-----------+--------+------------+
8.gender컬럼의 값이 female이거나 birthday 컬럽의 값이 199x-xx-xx인 회원목록을 가져오세요.
SELECT * FROM sql_practice WHERE gender='female' or birthday LIKE '199%-%%-%%';
+------------+----------+-----------+--------+------------+
| id | pw | name | gender | birthday |
+------------+----------+-----------+--------+------------+
| hong1234 | 8o4bkg | 홍길동 | male | 1990-01-31 |
| sexysung | 87awjkdf | 성춘향 | female | 1992-03-31 |
| widowmaker | 38ewifh3 | 위도우 | female | 1986-06-03 |
| davdav | k3f3ah | 송하나 | female | 1994-06-03 |
+------------+----------+-----------+--------+------------+
9.id컬럼의 값이 hong1234인 레코드의 pw컬럼의 값을 12345678로 변경하세요.
UPDATE sql_practice SET pw='12345678' WHERE id='hong1234';
Query OK, 1 row affected (0.00 sec)
select * from sql_practice where id='hong1234';
+----------+----------+-----------+--------+------------+
| id | pw | name | gender | birthday |
+----------+----------+-----------+--------+------------+
| hong1234 | 12345678 | 홍길동 | male | 1990-01-31 |
+----------+----------+-----------+--------+------------+
mysql> DELETE FROM sql_practice WHERE id='jungkrat';
Query OK, 1 row affected (0.02 sec)
mysql> select * from sql_practice;
+------------+----------+-----------+--------+------------+
| id | pw | name | gender | birthday |
+------------+----------+-----------+--------+------------+
| hong1234 | 12345678 | 홍길동 | male | 1990-01-31 |
| sexysung | 87awjkdf | 성춘향 | female | 1992-03-31 |
| power70 | qxur8sda | 변사또 | male | 1970-05-02 |
| hanjo | jk48fn4 | 한조 | male | 1987-10-18 |
| widowmaker | 38ewifh3 | 위도우 | female | 1986-06-03 |
| davdav | k3f3ah | 송하나 | female | 1994-06-03 |
+------------+----------+-----------+--------+------------+
ORM의 역할 : SQL을 직접 작성하지 않아도 데이터베이스로 접근해 CRUD(조회/추가/수정/삭제)가 가능하게 해준다.
class User(models.Model): # 여기서 모델의 이름은 User이다.
GENDERS = ( ('M','남성(Man)'),('W','여성(Woman)') )
userid=models.CharField(max_length=64, verbose_name='아이디')
username=models.CharField(max_length=64, verbose_name='사용자명')
password=models.CharField(max_length=64, verbose_name='비밀번호')
gender=models.CharField(max_length=1, verbose_name='성별', choices=GENDERS)
registered=models.DateTimeField(auto_now_add=True, verbose_name='등록')
class User(models.Model):
userid = models.CharField(max_length=64, verbose_name='아이디')
#CharField는 문자열 필드
#max_length 최대 길이, 길이 제한
#verbose_name은 별칭같은 것
username = models.CharField(max_length=64, verbose_name='사용자명')
registerd = models.DateTimeField(auto_now_add=True, verbose_name='등록')
#auto_now_add 현재 시간을 자동으로 넣겠다.
#enum('M', 'W') M 뒤에 남성은 관리자페이지에서 볼 수 있는 별칭같은 것
GENDERS = (('M', '남성(Mam)'), ('W', '여성(Woman)'))
gender.models.CharField(max_length=1, verbose_name='성별', choices=GENDERS)
장고 관리자
root
qa2213886*
model.py 수정할 때마다 마이그레이션 및 마이그레이트 계속 해야되나요?
-> 안전빵으로..
python3 manage.py makemigrations
python3 manage.py migrate