[리베이트] 자주 사용하는 SQL 요약[MySQL]

60154 단어 MySQLSQLtech
자주 사용하는 MySQL의 SQL 문장을 역인용할 수 있도록 일본어로 정리해 봤습니다!
이 SQL은 무엇을 하는지 일본어로 쉽게 쓸 수 있다.Ctrl (command) + F 키로 하고 싶은 일을 검색할 수 있도록 비슷한 문구가 포함되어 있습니다.
OR 매핑기를 사용하면 SQL을 직접 쓸 기회가 많지 않다고 생각합니다. 단지 조사가 잘 안 되거나 데이터를 조금만 수정하면 어떤 말은 SQL을 쓰는 것이 비교적 편리합니다.

문장 양식

  • (일본어로) 뭐 하는 거야 SQL
  • SQL
  • 결과
  • 한 조의 형식으로 총결하다.

    (사전 요구 사항) 테이블 정의 및 데이터·MySQL 버전


    이 글에서 사용한 표의 정의와 데이터는 이렇다.
    사용자 테이블과 문장 테이블에서 사용자는 여러 편의 문장을 가지고 있다(1대 다수)

    users


    +------------+--------------+------+-----+---------+----------------+
    | Field      | Type         | Null | Key | Default | Extra          |
    +------------+--------------+------+-----+---------+----------------+
    | id         | int unsigned | NO   | PRI | NULL    | auto_increment |
    | name       | varchar(255) | NO   |     | NULL    |                |
    | email      | varchar(255) | NO   |     | NULL    |                |
    | created_at | datetime     | YES  |     | NULL    |                |
    | updated_at | datetime     | YES  |     | NULL    |                |
    +------------+--------------+------+-----+---------+----------------+
    
    +----+--------------+-------------------+---------------------+------------+
    | id | name         | email             | created_at          | updated_at |
    +----+--------------+-------------------+---------------------+------------+
    |  1 | ユーザ1       | user1@example.com | 2020-08-01 00:00:00 | NULL       |
    |  2 | ユーザ2       | user2@example.com | 2020-09-01 00:00:00 | NULL       |
    |  3 | ユーザ3       | user3@example.com | 2020-10-01 00:00:00 | NULL       |
    +----+--------------+-------------------+---------------------+------------+
    

    articles


    +------------+--------------+------+-----+---------+----------------+
    | Field      | Type         | Null | Key | Default | Extra          |
    +------------+--------------+------+-----+---------+----------------+
    | id         | int unsigned | NO   | PRI | NULL    | auto_increment |
    | user_id    | int unsigned | NO   |     | NULL    |                |
    | title      | varchar(255) | NO   |     | NULL    |                |
    | content    | text         | YES  |     | NULL    |                |
    | image      | varchar(255) | YES  |     | NULL    |                |
    | created_at | datetime     | YES  |     | NULL    |                |
    | updated_at | datetime     | YES  |     | NULL    |                |
    +------------+--------------+------+-----+---------+----------------+
    
    +----+---------+-------------+------------+-------------+---------------------+------------+
    | id | user_id | title       | content    | image       | created_at          | updated_at |
    +----+---------+--------------+------------+------------+---------------------+------------+
    |  1 |       1 | タイトル1     | 本文1       | NULL        | 2020-08-01 00:00:00 | NULL       |
    |  2 |       2 | タイトル2−1   | NULL       | picture.jpg | 2020-09-01 00:00:00 | NULL       |
    |  3 |       2 | タイトル2−2   | 本文2−2     | NULL        | 2020-10-01 00:00:00 | NULL       |
    +----+---------+-------------+------------+-------------+---------------------+------------+
    

    MySQL 버전


    버전 8.0.20이 사용됩니다.
    mysql> select version();
    
    +-----------+
    | version() |
    +-----------+
    | 8.0.20    |
    +-----------+
    

    역라 SQL


    ● SQL 문의 구문


    데이터베이스 목록 표시


    show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | test_database      |
    +--------------------+
    

    테이블 목록 표시


    show tables;
    +-------------------------+
    | Tables_in_test_database |
    +-------------------------+
    | articles                |
    | users                   |
    +-------------------------+
    

    테이블 목록 및 테이블 유형 표시


    테이블에는 BASE TABLE, 뷰에는 VIEW가 표시됩니다.
    show full tables;
    +-------------------------+------------+
    | Tables_in_test_database | Table_type |
    +-------------------------+------------+
    | articles                | BASE TABLE |
    | users                   | BASE TABLE |
    +-------------------------+------------+
    

    테이블 레이아웃 확인


    다음은 테이블 설명에 사용된 테이블 정의에 대한 설명을 확인하는 명령입니다.프레임에서 테이블을 만들 때 자동으로 설정되지만 실제 테이블이 어떻게 사용되는지 확인할 때 사용됩니다.
    DESC users;
    +------------+--------------+------+-----+---------+----------------+
    | Field      | Type         | Null | Key | Default | Extra          |
    +------------+--------------+------+-----+---------+----------------+
    | id         | int unsigned | NO   | PRI | NULL    | auto_increment |
    | name       | varchar(255) | NO   |     | NULL    |                |
    | email      | varchar(255) | NO   |     | NULL    |                |
    | created_at | datetime     | YES  |     | NULL    |                |
    | updated_at | datetime     | YES  |     | NULL    |                |
    +------------+--------------+------+-----+---------+----------------+
    

    ● DML(Data Operational Language) WHERE 문장


    id 추출 "1" 사용자


    객체가 INT와 같은 수치 유형으로 나열된 경우
    SELECT * FROM users WHERE id = 1;
    
    +----+--------------+-------------------+---------------------+------------+
    | id | name         | email             | created_at          | updated_at |
    +----+--------------+-------------------+---------------------+------------+
    |  1 | ユーザ1       | user1@example.com | 2020-08-01 00:00:00 | NULL       |
    +----+--------------+-------------------+---------------------+------------+
    

    사용자 2라는 이름을 가진 사용자 추출


    객체가 VARCHAR와 같은 문자 유형으로 나열되면 따옴표로 묶습니다.
    참고로 NULL 데이터는 추출되지 않습니다.NULL을 얻으려면 뒤에 설명된 ISNULL을 참조하십시오.
    SELECT * FROM users WHERE name = 'ユーザ2';
    
    +----+--------------+-------------------+---------------------+------------+
    | id | name         | email             | created_at          | updated_at |
    +----+--------------+-------------------+---------------------+------------+
    |  2 | ユーザ2       | user2@example.com | 2020-09-01 00:00:00 | NULL       |
    +----+--------------+-------------------+---------------------+------------+
    

    id 추출 1 이외의 사용자


    부정은 잘못된 것이다하지만 <>도 칠 수 있어요. 개인적으로는추천하다
    예를 들어 설명하지는 않았지만 같은 문자형을 부정하는 경우 단어 인코딩이 필요하다.
    SELECT * FROM users WHERE id != 1;
    
    +----+--------------+-------------------+---------------------+------------+
    | id | name         | email             | created_at          | updated_at |
    +----+--------------+-------------------+---------------------+------------+
    |  2 | ユーザ2       | user2@example.com | 2020-09-01 00:00:00 | NULL       |
    |  3 | ユーザ3       | user3@example.com | 2020-10-01 00:00:00 | NULL       |
    +----+--------------+-------------------+---------------------+------------+
    

    id가 1, 2인 (수치 목록에 포함된) [IN]


    수치 목록의 데이터를 얻을 수 있습니다.a 또는 b로 바꿀 수도 있습니다.
    SELECT * FROM articles WHERE id IN (1, 2);
    
    +----+---------+--------------------+-----------+-------------+---------------------+------------+
    | id | user_id | title              | content   | image       | created_at          | updated_at |
    +----+---------+--------------------+-----------+-------------+---------------------+------------+
    |  1 |       1 | タイトル1            | 本文1      | NULL        | 2020-08-01 00:00:00 | NULL       |
    |  2 |       2 | タイトル2−1          | NULL      | picture.jpg | 2020-09-01 00:00:00 | NULL       |
    +----+---------+--------------------+-----------+-------------+---------------------+------------+
    

    ID가 1,2인 경우(값 목록에 포함되지 않음) [NOT IN]


    수치 목록이 없는 데이터를 얻을 수 있습니다.NOT(a ANDb)로 대체할 수 있습니다.NULL이 객체에 없습니다.
    SELECT * FROM articles WHERE id NOT IN (1, 2);
    
    +----+---------+--------------------+-----------------+-------+---------------------+------------+
    | id | user_id | title              | content         | image | created_at          | updated_at |
    +----+---------+--------------------+-----------------+-------+---------------------+------------+
    |  3 |       2 | タイトル2−2          | 本文2−2          | NULL  | 2020-10-01 00:00:00 | NULL       |
    +----+---------+--------------------+-----------------+-------+---------------------+------------+
    

    등록된 이미지가 없는 기사 추출【IS NULL】


    NULL은비교할 수 없습니다.NULL은 NULL입니다.
    SELECT * FROM articles WHERE image IS NULL;
    
    +----+---------+-------------+------------+-------------+---------------------+------------+
    | id | user_id | title       | content    | image       | created_at          | updated_at |
    +----+---------+--------------+------------+------------+---------------------+------------+
    |  1 |       1 | タイトル1     | 本文1       | NULL        | 2020-08-01 00:00:00 | NULL       |
    |  3 |       2 | タイトル2−2   | 本文2−2     | NULL        | 2020-10-01 00:00:00 | NULL       |
    +----+---------+-------------+------------+-------------+---------------------+------------+
    

    등록된 이미지를 추출한 글 [IS NOT NULL]


    SELECT * FROM articles WHERE image IS NOT NULL;
    
    +----+---------+-------------+------------+-------------+---------------------+------------+
    | id | user_id | title       | content    | image       | created_at          | updated_at |
    +----+---------+--------------+------------+------------+---------------------+------------+
    |  2 |       2 | タイトル2−1   | NULL       | picture.jpg | 2020-09-01 00:00:00 | NULL       |
    +----+---------+-------------+------------+-------------+---------------------+------------+
    

    기사가 있는 사용자 추출[EXISTS]


    못하는 사람이 많은 EXISTS.
    EXISTS 내의 하위 쿼리 결과를 정말로 추출한 사용자(1줄에도 기사가 있음)하위 쿼리의 WHERE는 키모입니다.
    참고로 하위 조회 중의 별표는 의미가 없다.'1'이든'zen'이든 결과는 변하지 않는다.( EXISTS 또는 NOT EXISTS를 사용한 하위 쿼리 )
    SELECT * FROM users WHERE EXISTS(
            SELECT * FROM articles WHERE users.id = articles.user_id
        );
    
    +----+--------------+-------------------+---------------------+------------+
    | id | name         | email             | created_at          | updated_at |
    +----+--------------+-------------------+---------------------+------------+
    |  1 | ユーザ1       | user1@example.com | 2020-08-01 00:00:00 | NULL       |
    |  2 | ユーザ2       | user2@example.com | 2020-09-01 00:00:00 | NULL       |
    +----+--------------+-------------------+---------------------+------------+
    

    메시지가 없는 사용자 추출[NOT EXISTS]


    하위 검색의 데이터를 가짜로 추출한 사용자.
    SELECT * FROM users WHERE NOT EXISTS(
            SELECT * FROM articles WHERE users.id = articles.user_id
        );
    
    +----+--------------+-------------------+---------------------+------------+
    | id | name         | email             | created_at          | updated_at |
    +----+--------------+-------------------+---------------------+------------+
    |  3 | ユーザ3       | user3@example.com | 2020-10-01 00:00:00 | NULL       |
    +----+--------------+-------------------+---------------------+------------+
    

    ● DML(Data Operational Language) SELECT 문


    문장수의 합계[COUNT]


    건수만 세려면 GRUPBY가 필요 없어요.
    SELECT COUNT(*) FROM articles;
    
    +----------+
    | COUNT(*) |
    +----------+
    |        3 |
    +----------+
    

    사용자당 총 기사 수 [COUNT ~ GRUPBY]


    합계 키를 누른 열의 값을 합계하려면 GRUPBY가 필요합니다.
    SELECT user_id, COUNT(*) FROM articles GROUP BY user_id;
    
    +---------+----------+
    | user_id | COUNT(*) |
    +---------+----------+
    |       1 |        1 |
    |       2 |        2 |
    +---------+----------+
    

    제작 일자 순서 [ROW NUMBER]


    이것은 순위가 편리한 창 함수입니다.단지 이 SQL일 뿐이라면 고마움을 느끼지 않을 것이다.근데 이걸 기억하면 어떤 데이터든 얻을 수 있을 것 같아서요.
    RANK()와 달리 같은 순서에서 순위가 유일하냐, ROWNUMBER의 상황은 반드시 유일하며 RANK의 상황이 아닐 것이다(예를 들어 1, 1, 3, 4, 5 등)
    SELECT id, title, created_at, ROW_NUMBER() OVER (ORDER BY created_at) AS row_num
    FROM articles;
    
    +----+-----------------------+---------------------+---------+
    | id | title                 | created_at          | row_num |
    +----+-----------------------+---------------------+---------+
    |  1 | タイトル1                | 2020-08-01 00:00:00 |       1 |
    |  2 | タイトル2−1              | 2020-09-01 00:00:00 |       2 |
    |  3 | タイトル2−2              | 2020-10-01 00:00:00 |       3 |
    +----+-----------------------+---------------------+---------+
    

    제작 일자 순서대로 가장 오래된 글 가져오기 [ROW NUMBER]


    단지 아까의 SQL을 하위 검색어로 삼았을 뿐, 이전의 응용이다.순위를 매길 수 있다면 추출 조건으로 삼을 수도 있다.1∼3위, 최악의 3위 등 순위 뒤 몇 가지만 따고 싶은 상황에서 활약했다.
    SELECT a.id, a.title, a.created_at, a.row_num FROM (
        SELECT articles.* 
        , ROW_NUMBER() OVER (ORDER BY created_at) AS row_num
        FROM articles
    ) a
    WHERE a.row_num = 1;
    
    +----+-----------------------+---------------------+---------+
    | id | title                 | created_at          | row_num |
    +----+-----------------------+---------------------+---------+
    |  1 | タイトル1                | 2020-08-01 00:00:00 |       1 |
    +----+-----------------------+---------------------+---------+
    

    ● DML(Data Operations Language) 문자열 편집


    문자열(또는 열)의 조합 [CONCAT]


    임의의 문자열일 경우 큰 따옴표로 묶습니다.
    SELECT CONCAT('タイトルは「', title, '」です') AS title FROM articles;
    
    +-----------------------+
    | title                 |
    +-----------------------+
    | タイトルは「タイトル1」です    |
    | タイトルは「タイトル2−1」です  |
    | タイトルは「タイトル2−2」です  |
    +-----------------------+
    

    왼쪽에서 텍스트 캡처 [LEFT]


    지정한 문자 수를 왼쪽에서 잘라냅니다. (바이트가 아닌 것을 주의하십시오.)
    SELECT title, LEFT(title, 2) AS title_mdf FROM articles;
    
    +-----------------------+-----------+
    | title                 | title_mdf |
    +-----------------------+-----------+
    | タイトル1                | タイ      |
    | タイトル2−1              | タイ      |
    | タイトル2−2              | タイ      |
    +-----------------------+-----------+
    

    오른쪽에서 문자를 캡처합니다 [RIGHT]


    지정한 문자 수를 오른쪽에서 잘라냅니다. (바이트가 아닌 것을 주의하십시오.)
    SELECT title, RIGHT(title, 2) AS title_mdf FROM articles;
    
    +-----------------------+-----------+
    | title                 | title_mdf |
    +-----------------------+-----------+
    | タイトル1                | ル1       |
    | タイトル2−1              | −1       |
    | タイトル2−2              | −2       |
    +-----------------------+-----------+
    

    지정된 위치에서 지정된 문자 수를 잘라냅니다[SUBSTR]


    SUBSTR은 SUBSTRING의 사역(별명. 기능이 같다)이다.몇 문자의 위치를 지정합니다.
  • 지정된 위치에서 마지막까지
  • SELECT title, SUBSTR(title, 2) AS title_mdf FROM articles;
    
    +-----------------------+--------------------+
    | title                 | title_mdf          |
    +-----------------------+--------------------+
    | タイトル1               | イトル1              |
    | タイトル2−1             | イトル2−1            |
    | タイトル2−2             | イトル2−2            |
    +-----------------------+--------------------+
    
  • 지정된 위치에서 지정된 문자수: SUBSTR(title, 2, 4)
    위치에 음수를 지정하면 "밑에서 몇 번째 문자"
  • 가 됩니다.
    SELECT title, SUBSTR(title, 2, 4) AS title_mdf FROM articles;
    
    +-----------------------+--------------+
    | title                 | title_mdf    |
    +-----------------------+--------------+
    | タイトル1               | イトル1        |
    | タイトル2−1             | イトル2        |
    | タイトル2−2             | イトル2        |
    +-----------------------+--------------+
    

    문자열 →날짜,날짜 → 문자열,교체


    ... 하지 않다

    ● DML(Data Operational Language) JOIN 문


    ... 하지 않다

    ● DML(Data Operations Language) ORDER By절


    ... 하지 않다

    총결산


    지금까지 MySQL의 역라 SQL이었습니다!생각나면 추가할게요.
    모르는 점이나 이런 상황이 있으면 어떻게 할지 댓글이나 트윗()
    DB를 준비하기 위해서 여기 기사를 참고하게 해주세요!감사합니다.
    docker-compose를 통해 MySQL 환경 단순화
    https://qiita.com/A-Kira/items/f401aea261693c395966

    좋은 웹페이지 즐겨찾기