쿼리 기록
쿼리를 설명하기에 앞서 여러분을 위한 데이터 테이블을 준비했습니다. 이 테이블에는 은행 잔액과 사용자에 대한 기본 정보가 저장됩니다.
money라는 테이블 구조를 정의했습니다.
테이블을 생성하는 구문은 다음과 같습니다.
CREATE TABLE money ( id INT NOT NULL AUTO_INCREMENT , username VARCHAR(50) NOT NULL , balance FLOAT NOT NULL , province VARCHAR(20) NOT NULL , age TINYINT UNSIGNED NOT NULL , sex TINYINT NOT NULL , PRIMARY KEY (id(10)) ) ENGINE = InnoDB CHARACTER SET utf8;
테이블 구조와 데이터는 다음과 같습니다.
참고:
잔액은 잔액을 의미합니다.
지방은 지방을 의미합니다.
기본 쿼리
참고: "*"는 모두 일치를 의미하는 정규식입니다. 위 쿼리 문은 다음과 동일합니다.
mysql> select * from money; +----+-----------+---------+-----------+-----+-----+ | id | username | balance | province | age | sex | +----+-----------+---------+-----------+-----+-----+ | 1 | 李文凯 | 120.02 | 湖北 | 29 | 1 | | 2 | 范冰冰 | 260.23 | 山东 | 40 | 0 | | 3 | 黄晓明 | 150.86 | 山东 | 40 | 1 | | 4 | 井柏然 | 810 | 辽宁 | 27 | 1 | | 5 | 李冰冰 | 20.15 | 黑龙江 | 43 | 0 | | 6 | 成龙 | 313 | 山东 | 63 | 1 | | 7 | 杨幂 | 123 | 北京 | 30 | 0 | | 8 | 刘诗诗 | 456 | 北京 | 29 | 1 | | 9 | 柳岩 | 23.4 | 湖南 | 36 | 0 | | 10 | 赵本山 | 3456 | 辽宁 | 63 | 1 | | 11 | 汪峰 | 34.32 | 北京 | 44 | 1 | | 12 | 郭德纲 | 212 | 天津 | 43 | 1 | +----+-----------+---------+-----------+-----+-----+ 12 rows in set (0.00 sec)
필드 쿼리 지정
mysql> select id,username, balance from money; +----+-----------+---------+ | id | username | balance | +----+-----------+---------+ | 1 | 李文凯 | 120.02 | | 2 | 范冰冰 | 260.23 | | 3 | 黄晓明 | 150.86 | | 4 | 井柏然 | 810 | | 5 | 李冰冰 | 20.15 | | 6 | 成龙 | 313 | | 7 | 杨幂 | 123 | | 8 | 刘诗诗 | 456 | | 9 | 柳岩 | 23.4 | | 10 | 赵本山 | 3456 | | 11 | 汪峰 | 34.32 | | 12 | 郭德纲 | 212 | +----+-----------+---------+ 12 rows in set (0.00 sec)
중복되지 않은 레코드 고유에 대한 단일 필드 쿼리
mysql> select distinct age deptno from money; +--------+ | deptno | +--------+ | 29 | | 40 | | 27 | | 43 | | 63 | | 30 | | 36 | | 44 | +--------+ 8 rows in set (0.00 sec)
조건부 쿼리
mysql> select * from money where age = 29; +----+-----------+---------+----------+-----+-----+ | id | username | balance | province | age | sex | +----+-----------+---------+----------+-----+-----+ | 1 | 李文凯 | 120.02 | 湖北 | 29 | 1 | | 8 | 刘诗诗 | 456 | 北京 | 29 | 1 | +----+-----------+---------+----------+-----+-----+ 2 rows in set (0.00 sec)
여기서
비교 연산자가 조건을 충족하는 레코드를 결과 집합에 나열할 수 있는 조건입니다. 위의 예에서 필드의 '=' 뒤에 추가되는 내용은 다음과 같습니다.
또한 >, <, >=, <=, !=와 같은 비교 연산자를 사용할 수도 있습니다.
논리 연산자
또는 및 and와 같은 논리 연산자를 사용하여 다중 조건 결합 쿼리를 수행하는 데 여러 조건을 사용할 수도 있습니다.
mysql> select * from money where id <10 and province='湖北'; +----+-----------+---------+----------+-----+-----+ | id | username | balance | province | age | sex | +----+-----------+---------+----------+-----+-----+ | 1 | 李文凯 | 120.02 | 湖北 | 29 | 1 | +----+-----------+---------+----------+-----+-----+ 1 row in set (0.00 sec)
결과 집합 정렬
선택 항목이 나온 후 결과 집합을 정렬하려면 order by를 사용하세요. 여기서 desc 및 asc 키워드 정렬 순서에 있습니다. desc는 필드별로 내림차순으로 정렬하는 것을 의미하고, asc는 오름차순으로 정렬하는 것을 의미합니다. 키워드를 쓰지 않으면 기본값은 오름차순으로 정렬됩니다.
아아아아다중 필드 정렬
order by 뒤에는 여러 개의 서로 다른 정렬 필드가 올 수 있으며, 정렬 필드의 서로 다른 결과 집합의 순서도 다릅니다. 정렬 필드의 값이 동일하면 동일한 값을 가진 필드가 그에 따라 정렬됩니다. 두 번째 정렬 필드로 이동합니다.
* 참고: 첫 번째 필드에 이미 결과가 정렬된 경우. 두 번째 필드 정렬 필드는 적용되지 않습니다. 이 경우 두 번째 필드는 유효하지 않습니다. *
mysql> select id,username, balance from money order by balance desc; +----+-----------+---------+ | id | username | balance | +----+-----------+---------+ | 10 | 赵本山 | 3456 | | 4 | 井柏然 | 810 | | 8 | 刘诗诗 | 456 | | 6 | 成龙 | 313 | | 2 | 范冰冰 | 260.23 | | 12 | 郭德纲 | 212 | | 3 | 黄晓明 | 150.86 | | 7 | 杨幂 | 123 | | 1 | 李文凯 | 120.02 | | 11 | 汪峰 | 34.32 | | 9 | 柳岩 | 23.4 | | 5 | 李冰冰 | 20.15 | +----+-----------+---------+ 12 rows in set (0.00 sec)
결과 집합 제한
쿼리 또는 정렬된 결과 집합의 경우 전체가 아닌 일부만 표시하려면 제한을 사용하세요. 키 단어 결과 세트의 수를 제한합니다.
mysql> select id,username, balance from money order by balance desc,age asc; +----+-----------+---------+ | id | username | balance | +----+-----------+---------+ | 10 | 赵本山 | 3456 | | 4 | 井柏然 | 810 | | 8 | 刘诗诗 | 456 | | 6 | 成龙 | 313 | | 2 | 范冰冰 | 260.23 | | 12 | 郭德纲 | 212 | | 3 | 黄晓明 | 150.86 | | 7 | 杨幂 | 123 | | 1 | 李文凯 | 120.02 | | 11 | 汪峰 | 34.32 | | 9 | 柳岩 | 23.4 | | 5 | 李冰冰 | 20.15 | +----+-----------+---------+ 12 rows in set (0.00 sec)
결과 집합을 제한하고 정렬
mysql> select * from money limit 5; +----+-----------+---------+-----------+-----+-----+ | id | username | balance | province | age | sex | +----+-----------+---------+-----------+-----+-----+ | 1 | 李文凯 | 120.02 | 湖北 | 29 | 1 | | 2 | 范冰冰 | 260.23 | 山东 | 40 | 0 | | 3 | 黄晓明 | 150.86 | 山东 | 40 | 1 | | 4 | 井柏然 | 810 | 辽宁 | 27 | 1 | | 5 | 李冰冰 | 20.15 | 黑龙江 | 43 | 0 | +----+-----------+---------+-----------+-----+-----+ 5 rows in set (0.00 sec)
결과 간격 선택 설정
레코드 0부터 시작하여 3개의 레코드를 취한다고 가정합니다. 세 번째 레코드부터 3개 레코드를 더 가져오고 싶습니다. 6번째 레코드부터 4개의 레코드를 가져오려면 어떻게 해야 하나요?
이때 결과 집합 간격 선택을 사용해야 합니다.
아아아아세 번째부터 세 개 더 어때요?
mysql> select id,username, balance from money order by balance desc limit 5; +----+-----------+---------+ | id | username | balance | +----+-----------+---------+ | 10 | 赵本山 | 3456 | | 4 | 井柏然 | 810 | | 8 | 刘诗诗 | 456 | | 6 | 成龙 | 313 | | 2 | 范冰冰 | 260.23 | +----+-----------+---------+ 5 rows in set (0.00 sec)
위의 아이디어를 통해 디스플레이는 페이징을 완료합니다.
각 페이지에 10개의 레코드가 표시되면
페이지 1은 제한 0,10
페이지 2는 제한 10,10
페이지 3은 제한 20,10
등등...
통계기능 활용
1. 전체 사용자 수를 알고 싶다면?
2. 데이터 테이블에서 누가 가장 부유한지 확인하는 방법은 무엇인가요?
3. 사용자의 평균 지출 금액을 알고 싶다면 어떻게 해야 할까요?
4. 전체 사용자의 총액을 알고 싶다면 어떻게 해야 할까요?
가장 일반적으로 사용되는 네 가지 통계 함수가 있습니다.
mysql> select id,username, balance from money limit 0,3; +----+-----------+---------+ | id | username | balance | +----+-----------+---------+ | 1 | 李文凯 | 120.02 | | 2 | 范冰冰 | 260.23 | | 3 | 黄晓明 | 150.86 | +----+-----------+---------+ 3 rows in set (0.00 sec)
필드에 별칭을 지정할 수도 있습니다. as 키워드를 사용하세요.
mysql> select id,username, balance from money limit 3,3; +----+-----------+---------+ | id | username | balance | +----+-----------+---------+ | 4 | 井柏然 | 810 | | 5 | 李冰冰 | 20.15 | | 6 | 成龙 | 313 | +----+-----------+---------+ 3 rows in set (0.00 sec)
평균 금액 확인
mysql> select count(id) from money; +-----------+ | count(id) | +-----------+ | 12 | +-----------+ 1 row in set (0.00 sec)
총액 확인
mysql> select count(id) as zongshu from money; +---------+ | zongshu | +---------+ | 12 | +---------+ 1 row in set (0.00 sec)
최대 금액 확인
mysql> select avg(balance) from money; +--------------------+ | avg(balance) | +--------------------+ | 498.24833393096924 | +--------------------+ 1 row in set (0.00 sec)
최소 금액 확인
mysql> select sum(balance) from money; +-------------------+ | sum(balance) | +-------------------+ | 5978.980007171631 | +-------------------+ 1 row in set (0.00 sec)
그룹별
금액표를 보면 지역별로 데이터가 정리되어 있습니다. 동일한 지역이 제거됩니다. 즉, 지방은 그룹입니다.
mysql> select max(balance) from money; +--------------+ | max(balance) | +--------------+ | 3456 | +--------------+ 1 row in set (0.00 sec)
전체 그룹 수(카테고리) 통계:
mysql> select min(balance) from money; +--------------------+ | min(balance) | +--------------------+ | 20.149999618530273 | +--------------------+ 1 row in set (0.00 sec)
도 수를 세어 그룹 표시
mysql> select * from money group by province; +----+-----------+---------+-----------+-----+-----+ | id | username | balance | province | age | sex | +----+-----------+---------+-----------+-----+-----+ | 7 | 杨幂 | 123 | 北京 | 30 | 0 | | 12 | 郭德纲 | 212 | 天津 | 43 | 1 | | 2 | 范冰冰 | 260.23 | 山东 | 40 | 0 | | 1 | 李文凯 | 120.02 | 湖北 | 29 | 1 | | 9 | 柳岩 | 23.4 | 湖南 | 36 | 0 | | 4 | 井柏然 | 810 | 辽宁 | 27 | 1 | | 5 | 李冰冰 | 20.15 | 黑龙江 | 43 | 0 | +----+-----------+---------+-----------+-----+-----+
그룹화를 기반으로 하며 롤업을 이용한 통계
에서는 거의 사용되지 않습니다. 이 지식 포인트는 이해 수준으로 설정됩니다.
주요 기능은 그룹화된 데이터를 집계한 후 전체 집계를 수행하는 것입니다.
위 통계를 바탕으로 총 개수를 계산하면 다음 예의 결과에서 12개의 NULL이 추가로 발생합니다. 마지막에.
mysql> select deptno, count(1) from emp group by deptno; +--------+----------+ | deptno | count(1) | +--------+----------+ | 1 | 1 | | 2 | 5 | | 3 | 1 | | 5 | 4 | +--------+----------+ 4 rows in set (0.04 sec)
그런 다음 결과가 필터링됩니다.
have 절은 where와 유사하지만 둘 다 조건을 설정하는 문입니다.
having은 필터링 그룹이고 필터링 기록은 어디에 있나요?
mysql> select count(province),province from money group by province; +-----------------+-----------+ | count(province) | province | +-----------------+-----------+ | 3 | 北京 | | 1 | 天津 | | 3 | 山东 | | 1 | 湖北 | | 1 | 湖南 | | 2 | 辽宁 | | 1 | 黑龙江 | +-----------------+-----------+ 7 rows in set (0.00 sec)
SQL 전체 사용
위 문에서는 특정 문을 전체가 아닌 개별적으로 사용했습니다.
이제 문을 통합해서 한번 같이 사용해보겠습니다. 전체 SQL 문에 사용되는 구문 구조는 다음과 같습니다.
SELECT
[필드 1 [별칭 1], [함수(필드 2),]...필드 n]
FROM 테이블 이름
[WHERE where 조건]
[GROUP BY 필드]
[HAVING where_contition]
[주문 조건]
[제한 조건]
참고: 위의 [ ] 옵션을 나타내기 위해 명령문에 사용될 수 있습니다.
최종 구문 요약은 다음과 같습니다.
머니 테이블 필드를 쿼리하기 위해 전체 결합 사용을 수행합니다. : id, 사용자 이름, 잔액, 지방은 id>1의 잔액이 50보다 커야 하며 지역은 그룹화에 사용됩니다. 내림차순은 사용자 ID를 사용하며, 3개 항목만 표시가 허용됩니다.
마지막으로 다음과 같이 SQL 문을 작성하면 쿼리 결과는 다음과 같습니다.
mysql> select count(province),province from money group by province with rollup; +-----------------+-----------+ | count(province) | province | +-----------------+-----------+ | 3 | 北京 | | 1 | 天津 | | 3 | 山东 | | 1 | 湖北 | | 1 | 湖南 | | 2 | 辽宁 | | 1 | 黑龙江 | | 12 | NULL | +-----------------+-----------+ 8 rows in set (0.00 sec)