달리는 자동차
집계함수 본문
집계함수는 결과 레코드 들에 대한 레코드의 개수, 값들의 합, 평균, 최대값, 최소값 등의 산술적인 연산을 한 결과값을 출력한다. 다음은 MySQL에서 집계함수 목록이다.
집계함수 | 의미 |
count(필드명) | null값이 아닌 레코드의 수 |
sum(필드명) | 필드명의 값들의 합계 |
avg(필드명) | 필드명의 값들의 평균 |
max(필드명) | 필드명의 값들중 가장 큰 값 |
min(필드명) | 필드명의 값들 중 가장 작은 값 |
count(*) | 레코드의 개수 |
num | name | gender | job | area | rank |
20200001 | elsa | w | princess | arendal | 5 |
20200002 | mickey | m | magician | usa | 7 |
20200003 | minnie | w | disney character | usa | 2 |
20200004 | rapunzel | w | princess | usa | 3 |
20200005 | snow white | w | princess | usa | 4 |
20200006 | mike wazowski | m | Scarer | japan | 8 |
20200007 | hiro | m | scientist | usa | 6 |
20200008 | YI sun sin | m | general officer | korea | 1 |
20200010 | cinderella | m | princess | usa | 8 |
데이터베이스는 study_db, 테이블명은 student 로 한다.
데이터베이스 생성
CREATE DATABASE study_db; |
테이블을 만들려면 study_db를 선택한다.
USE study_db; |
다음은 student로 테이블 생성 명령문
CREATE TABLE 'student'( 'num' int(11) NOT NULL, 'name' varchar(10) DEFAULT NULL, 'gender' char(1) DEFAULT NULL, 'job' varchar(20) DEFAULT NULL, 'area' varchar(15) DEFAULT NULL, 'email' varchar(50) DEFAULT NULL, 'rank' int(11) DEFAULT NULL, PRIMARY KEY('num') ) ENGINE=InnoDB DEFAULT CHARSET = utf8; |
테이블을 만들었으니 이제 데이터를 입력한다. 만일 데이터 입력시 필드의 값을 더 늘리려 한다면
ALTER TABLE student CHANGE name name varchar(20); DESC student; |
값 입력
INSERT INTO student VALUES(20120001,'elsa','w','princess','arendal',5); |
INSERT INTO student VALUES(20120002,'mickey','m','princess','usa',7); |
INSERT INTO student VALUES(20120003,'minnie','w','princess','usa',2); |
INSERT INTO student VALUES(20120004,'rapunzel','w','princess','usa',3); |
INSERT INTO student VALUES(20120005,'snow white','w','princess','arendal',4); |
INSERT INTO student VALUES(20120006,'mike wazowski','w','princess','arendal',1); |
INSERT INTO student VALUES(20120007,'hiro','w','princess','arendal',8); |
INSERT INTO student VALUES(20120008,'YI sun sin','w','princess','arendal',9); |
귀찮아서 데이터 아무렇게나 넣었다 위의 표처럼 생각해줬으면 좋을듯
SELECT COUNT(*) FROM student;
count |
8 |
지역별(area)로 그룹화 한다. GROUP BY문을 사용한다. 꼭 집계함수를 쓸때 GROUP BY를 쓰는것은 아니고
어떤 필드값으로 그룹화 할때 GROUP BY를 사용한다.
SELECT area, avg(rank) FROM student GROUP BY area; |
area | avg(rank) |
arendal japan korea usa |
5.0000 8.0000 1.0000 5.1429 |
->즉, 지역별로 그룹화 해서 area 와 avg를 보여준다.
이번에는 특정 문자열을 가진 레코드를 검색해본다.
특정 문자열을 가진 레코드를 검색하기 위해 사용되는 연산자는 like이며 문자열 상수에 일치하기 위한 문자
_언더스코어 와 % 퍼센트 가 제공된다.
이름이 m으로 시작하는 레코드를 찾을 때 SELECT * FROM student WHERE name LIKE 'm'%; ->m으로 시작하는 정보를 가져온다. SELECT * FEOM student WHERE name NOT LIKE 'm%'; -> m으로 시작하는 이름을 제외하고 다가져온다. |
SELECT * FROM student WHERE area ='usa' AND name like 'm'; |
usa에 살면서 이름이 m으로 시작하는 사람을 모두 찾아온다.
SQL select 구문의 group by절
GROUP BY
- 테이블의 레코드를 grouping하기 위해 사용된다.
- 해당 절은 각각의 그룹에 대해 하나의 행을 만드는데 이 과정을 aggregation이라 부른다.
- GROUP BY 는 주로 aggregate function 집합함수와 함께 쓰인다. (COUNT, MAX, SUM, AVG)와 함께 쓰인다.
- 1개 이상의 column에 대해 grouping할 수 있다.
- select 절에는 GROUP BY에 쓰인 column만 사용가능하다.
DROP TABLE IF EXISTS Person;
CREATE TABLE IF NOT EXISTS Person(
id SERIAL PRIMARY KEY,
name varchar(40) NOT NULL,
age int NOT NULL,
gender bit(1) NOT NULL,
city varchar(20) NOT NULL
);
INSERT INTO Person(
name,age,money,gender, city)
VALUES
('Junkyu Park', 27, 50000, b'0', 'Ulsan'),
('Sangheon Lee', 27, 3000000, b'0', 'Ansan'),
('Taesung Kim', 27, 40000, b'0', 'Daegu')
;
SELECT * from Person;
여기서 GROUP BY를 통해 city 컬럼을 그룹핑 하면 city가 같은 데이터들을 하나의 데이터로 묶어버린다.
SELECT Person.city from person
GROUP BY Person.city;
그러나 여기서 select 절에 group by 에 명시되지 않은 column을 추가하면 에러가 발생한다.
SELECT Person.city, Person.name from Person
GROUP BY Person.city; //에러 발생 -> Person.name 컬럼은 GROUP BY에 명시되어 있지 않음
- GROUP BY를 집계함수와 함꼐 사용할 수 있다.
SELECT Person.city, SUM(Person.money) from person GROUP BY Person.city
//같은 도시에 살고 있는 사람들을 그룹핑 한 다음 그도시에 사는 사람들이 가진 돈의 총합을 구하는 쿼리이다.
rgy1989.tistory.com/entry/SQL-EXIST-NOT-EXIST
exist 와 not exist 차이
int(5) 와 char(5)의 차이
요약->
테이블을 선언 할 때마다 정보에서 길이에 해당하는 값은 타입이 int와 char에 다르게 적용됩니다. int 타입의 별칭에서는 zerofill의 범위 지정으로 해당 숫자의 자릿수에 맞게 0을 채우겠다고, char 타입의 번호는 해당 숫자까지만 길이가 제한됩니다.
'SQL > MySQL' 카테고리의 다른 글
테이블 조인 (JOIN) (0) | 2020.09.15 |
---|---|
레코드 변경 삭제 (0) | 2020.09.15 |
필드 중복값제거 (0) | 2020.09.15 |
테이블 생성 (0) | 2020.09.14 |
데이터 형 과 저장크기 (0) | 2020.09.14 |