MySQL 데이터 쿼리 SQL

MySQL 데이터 쿼리 SQL

SQL 쿼리 문 : SELECT

먼저 테이블을 줘

여기에 사진 설명 삽입

데이터 검색 선택


단일 열 검색

select 字段 from tbname;
# 例: select name from stu;

명확한 순서 규칙, 반환 된 데이터의 순서가없는 경우 반환 된 데이터의 순서는 특별한 의미가 없습니다.

데이터가 반환되는 순서는 데이터가 테이블에 추가되는 순서 일 수도 있고 아닐 수도 있습니다. 동일한 번호가 반환되는 한 정상입니다.

여러 열 검색

select 字段1,字段2,... from tbname;
# 例: select id,name,age,sex from stu;

여러 열을 선택할 때 열 이름 사이에 쉼표를 추가해야하지만 마지막 열 이름 뒤에 쉼표를 추가하지 마십시오.

마지막 열 이름 뒤에 쉼표를 추가하면 오류가 발생합니다.

모든 열 검색

select * from tbname;
# 例: select * from stu;

일반적으로 테이블의 각 열이 실제로 필요하지 않는 한 와일드 카드를 사용하지 마십시오. * 와일드 카드를 사용하지 않는 것이 가장 좋습니다.

와일드 카드를 사용하여 이름을 알 수없는 열 검색

다양한 검사 라인의 구별

select distinct 字段1,字段2... from stu;
# 例: select distinct class_id from stu;

DISTINCT 키워드는 다른 값만 반환합니다. 열에 a와 b 값이 많으면 a와 b 만 반환됩니다.

여기에 사진 설명 삽입

결과 제한 LIMIT

select * from tbname limit 3,4;
# 代表从第三行开始检索,检索四行数据
# 代替的语法: limit 4 offset 3 意为从行3开始检索四行,和上面一样
# 例: select * from stu limit 3,4;

여기에 사진 설명 삽입

정규화 된 테이블 이름 사용

select name from stu;
select stu.name from stu;
select stu.name from demoDB.stu;

검색된 데이터 정렬 ORDER BY


데이터 정렬 기준

select * from tbname order by 字段;

기본적으로 쿼리되는 데이터는 무작위로 정렬되지 않습니다. 정렬 규칙이 지정되지 않은 경우 데이터는 일반적으로 기본 테이블에 나타나는 순서대로 표시됩니다.

관계형 데이터베이스 설계 이론은 정렬 순서가 명확하게 지정되지 않은 경우 검색된 데이터의 순서가 의미가 있다고 가정해서는 안된다고 믿습니다.

일반적으로 ORDER BY 절에서 사용되는 열은 표시를 위해 선택된 열이됩니다.

그러나 반드시 그런 것은 아니며 검색되지 않은 열로 데이터를 정렬하는 것은 완전히 합법적입니다.

여러 열로 정렬

select * from tbname order by 字段1,字段2,...;

여러 데이터 열을 정렬해야하는 경우 열 이름을 쉼표로 구분하면 정렬이 이전 및 다음 순서로 비교되며 기본값은 오름차순입니다.

select * from tbname order by 字段1(desc),字段2(desc),...;

지정된 열 이름을 오름차순 또는 내림차순으로 정렬합니다 (예 : select * from stu order by class_id, age desc; first sort class_id in ascending order and then sort age in 내림차순)

노트

ORDER BY 절이 ORDER BY 절의 위치에 주어지면 from 절 뒤에 있는지 확인해야합니다.

LIMIT를 사용하는 경우 ORDER BY 절이 완료된 후에 위치해야합니다. 절을 사용하는 순서가 잘못되면 오류 메시지가 표시됩니다.

데이터 검색 조건 필터 WHERE


데이터베이스에는 일반적으로 많은 양의 데이터가 포함되어 있으며 테이블의 모든 행을 검색 할 필요가 거의 없습니다.

일반적으로 특정 작업 또는 보고서의 요구에 따라 테이블 데이터의 하위 집합 만 추출됩니다.

필요한 데이터 만 검색하려면 검색 조건을 공식화해야합니다.

select 字段 from tbname where 条件; 

where와 order by를 동시에 사용하는 경우, 앞은 어디에 있어야하고 뒤는 order by가 있어야합니다.

WHERE 절 연산자

운영자 기술
= 같은
<> 、! = 같지 않음
< 보다 작음
<= 이하
> 보다
> = 보다 크거나 같음
와 ~ 사이에있는 … 두 값 사이에서 지정
NULL입니다. Null 값

결합 된 WHERE 절

MySQL에서는 여러 WHERE 절을 지정할 수 있습니다.

두 가지 방법 : AND 및 OR는 두 절을 연결합니다. 논리 연산자라고도합니다.

AND는 반환하기 전에 충족되고 연결되어야하는 모든 조건을 검색하기 위해 WHERE 절에서 사용됩니다. 그렇지 않으면 빈 세트를 반환합니다.

select 字段 from tbname where 字段=.. and 字段=..;
# 例:
select name from stu where age = 22 and sex = 'm';

또는

OR는 WHERE 절에서 사용되며 또는 연결의 조건 중 하나만 반환 할 수 있습니다. 그렇지 않으면 빈 세트를 반환합니다.

AND와 OR을 함께 사용할 수 있지만 SQL의 계산 순서에주의를 기울여야합니다. SQL은 OR 연산자를 처리하기 전에 AND 연산자에 우선 순위를 부여합니다.

예 : 클래스 1과 클래스 2의 여학생을 쿼리합니다.

select * from stu where class_id=1 or class_id=2 and sex='女';

이렇게하면 다음과 같은 상황이 발생합니다.
여기에 사진 설명 삽입

AND의 우선 처리 메커니즘 때문에 SQL은 2 급 여학생과 1 급 학생 모두가 조회해야한다고 생각합니다.

해결책은 다음과 같습니다.

select * from stu where class_id=1 and sex='女' or class_id=2 and sex='女';
# 或者
select * from stu where (class_id=1 or class_id=2) and sex='女';

괄호가 and보다 우선합니다.

IN과 NOT

IN 연산자는 조건 범위를 지정하는 데 사용되며 범위의 각 조건을 일치시킬 수 있습니다. AND 및 OR와 함께 사용할 수 있습니다.

select name from stu where class_id in (1,2) and sex='女';

IN 연산자를 사용하는 이유는 무엇입니까? 장점은 다음과 같습니다.

  • 긴 목록의 법적 옵션을 사용할 때 IN 연산자의 구문이 더 명확하고 직관적입니다.
  • IN을 사용하면 계산 순서가 이해하기 쉽습니다 (연산자가 적기 때문에).
  • IN 연산자는 일반적으로 OR 연산자 목록보다 빠릅니다.
  • IN의 가장 큰 장점은 다른 SELECT 문을 포함 할 수있어 WHERE 절을보다 동적으로 만들 수 있다는 것입니다.

아니

NOT 연산자는이 조건을 제외한 모든 데이터를 지정하는 데 사용됩니다.

select name from stu where class_id not in (1);

와일드 카드 사용

LIKE 및 와일드 카드

LIKE는 제품 이름에 텍스트 a가 포함 된 모든 제품 검색과 같은 퍼지 검색에 적합합니다.

  • %문자를 나타내는 검색에서 백분율 기호 (%) 와일드 카드는 횟수에 관계없이 나타납니다.

    select name from stu where name like 'a%'; # 表示匹配第一个字符为a的所有数据
    select name from stu where name like '%a'; # 表示匹配最后一个字符为a的所有数据
    select name from stu where name like '%a%'; # 表示匹配包含字符a的所有数据
    
  • 밑줄 ( _) 와일드 카드 문자는 밑줄을 사용할 때 하나의 밑줄이 하나의 문자와 같습니다.

    select name from stu where name like '_a';# 表示匹配最后一个字符为a且总长度为两个字符的数据
    select name from stu where name like 'a_';# 表示第一个字符为a且总长度为两个字符的数据
    

와일드 카드 사용에 대한 팁

  • 와일드 카드를 과도하게 사용하지 마십시오. 다른 운영자가 동일한 목적을 달성 할 수있는 경우 다른 운영자를 사용해야합니다.
  • 정말로 와일드 카드를 사용해야 할 때 '% a'와 같이 절대적으로 필요한 경우가 아니면 처음에 넣지 마십시오. 처음에 와일드 카드를 넣으면 검색 속도가 가장 느립니다.
  • 와일드 카드 위치에주의하십시오.

일반 REGEXP

select name from stu where name regexp '[0-5]abc'; # 第一个字符为0-5,后面为abc的所有数据

MySQL의 통계 함수 (집계 함수)

수렴 기능 사용

우리는 종종 데이터를 모두 검색하지 않고 요약해야하는데,이를 위해 MySQL은 특별한 기능을 제공합니다.

이러한 기능을 사용하여 MySQL 쿼리를 사용하여 특정 데이터를 검색하고 보고서를 분석 및 구성 할 수 있습니다.

예 :

  • 테이블의 행 수 결정
  • 테이블의 열 합계를 가져옵니다.
  • 테이블 열 (또는 모든 행, 일부 특정 행)의 최대, 최소 및 평균 값을 찾습니다.
함수 기술
카운트() 열의 행 수를 반환합니다.
MAX () 열의 최대 값을 반환합니다.
MIN () 열의 최소값을 반환합니다.
합집합() 열 값의 합계를 반환합니다.
AVG () 열의 평균 값을 반환합니다.

노트:

count 사용시 컬럼 이름을 지정하면 값이 NULL 인 행은 무시되지만 함수에 별표 (*)를 사용하면 무시되지 않습니다.

그룹 별 및 HAVING

그룹화

SQL 집계 함수를 사용하여 데이터를 요약 할 수 있습니다. 여기에서 행에 대한 기술을 수행하고, 합계와 평균을 계산하고, 모든 데이터를 검색하지 않고도 최대 값과 최소값을 얻을 수 있습니다.

지금까지 모든 계산은 테이블의 모든 데이터 또는 특정 WHERE 절과 일치하는 데이터에 대해 수행되었습니다.

하지만 그런 다음 그룹화 후 다시 필터링해야하는 방식으로 그룹화를 사용할 수 있습니다.

예 : 모든 수업의 학생 수를 가져와야합니다.

mysql> select class_id,count(*) as nums from stu where class_id=1;
+----------+------+
| class_id | nums |
+----------+------+
|        1 |    6 |
+----------+------+
1 row in set (0.00 sec)

mysql> select class_id,count(*) as nums from stu where class_id=2;
+----------+------+
| class_id | nums |
+----------+------+
|        2 |    4 |
+----------+------+
1 row in set (0.00 sec)

두 번 쿼리해야합니다.

하지만 학교의 각 학급의 학생 수를 쿼리해야한다면이 방법은 분명히 부적절합니다.

이때 그룹화가 필요하며 SQL 그룹화를 사용하면 데이터를 여러 논리 그룹으로 나눌 수 있으므로 각 그룹을 집계하고 계산할 수 있습니다 (group by).

구문 : select field, function (*) as column name from tbname group by field;

mysql> select class_id,count(*) as nums from stu group by class_id;
+----------+------+
| class_id | nums |
+----------+------+
|        1 |    6 |
|        2 |    4 |
+----------+------+
2 rows in set (0.00 sec)

시스템이 5 명 미만의 클래스 또는 5 명 이상의 클래스를 리턴하도록하려면 어떻게해야합니까?

위의 반환 된 결과 (아래 HAVING 필터 그룹)에서 다시 필터링해야합니다.

HAVING

GROUP BY를 사용하여 데이터를 그룹화하는 것 외에도 MySQL은 해당 그룹을 포함하여 그룹을 필터링하고 해당 그룹을 제외 할 수 있습니다.

예를 들어 위에서 언급했듯이 시스템이 5 명 미만의 클래스를 반환하도록합니다.

실제로 앞에서 언급 한 모든 WHERE 절은 HAVING으로 대체 할 수 있습니다. 유일한 차이점은 WHERE필터링 하고 HAVING은 그룹을 필터링 한다는 것 입니다.

구문 : 구문 : select field, function (*) as column name as tbname group by field by field with condition;

# 大于五人的班级
mysql> select class_id,count(*) as nums from stu group by class_id having nums>5;
+----------+------+
| class_id | nums |
+----------+------+
|        1 |    6 |
+----------+------+
1 row in set (0.00 sec)

# 小于五人的班级
mysql> select class_id,count(*) as nums from stu group by class_id having nums<5;
+----------+------+
| class_id | nums |
+----------+------+
|        2 |    4 |
+----------+------+
1 row in set (0.00 sec)

지침

이제 클래스 이름을 저장하기 위해 class_name 필드를 추가해야하는 경우 class_id, class_name 및 인원 수를 필터링합니다.

mysql> select class_id,count(*) as '数量' from stu group by class_id;
+----------+--------+
| class_id | 数量   |
+----------+--------+
|        1 |      6 |
|        2 |      4 |
+----------+--------+
2 rows in set (0.00 sec)

-- 在select里面有class_id、class_name,group by后面只有id就会出错

mysql> select class_id,class_name,count(*) as '数量' from stu group by class_id;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'yuge.stu.class_name' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

-- 正确的语句,应该是吧select所有列都作为分组条件。
mysql> select class_id,class_name,count(*) as '数量' from stu group by class_id,class_name;
+----------+------------+--------+
| class_id | class_name | 数量   |
+----------+------------+--------+
|        1 | c1         |      6 |
|        2 | c2         |      4 |
+----------+------------+--------+
2 rows in set (0.00 sec)

sql_mode = only_full_group_by와 호환되지 않음

-정확한 문장, 모든 열을 그룹화 조건으로 선택해야합니다.

mysql> select class_id,class_name,count(*) as '数量' from stu group by class_id,class_name;
+----------+------------+--------+
| class_id | class_name | 数量   |
+----------+------------+--------+
|        1 | c1         |      6 |
|        2 | c2         |      4 |
+----------+------------+--------+
2 rows in set (0.00 sec)

추천

출처blog.csdn.net/weixin_43701183/article/details/114117685