Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SQL文の読み書き / Reading and Writing SQL

SQL文の読み書き / Reading and Writing SQL

SELECT文を読み書きする時の思考を文字にした物です。
後半の説明は口頭のみなので資料だけでは、なんじゃこりゃとなります。

シリーズ「下手な絵1枚で描く概要」のつもりが、
絵が無いので「基本の一歩」に改めました。

Avatar for n_sugi

n_sugi

July 23, 2019
Tweet

More Decks by n_sugi

Other Decks in Programming

Transcript

  1. 本日の単語 SQL句(clause)(절) SELECT 求める結果表の列定義 FROM 取得元のテーブル① JOIN 取得元テーブル② ON 取得条件②

    WHERE 取得条件① GROUP BY 指定列が同じ行を1行にまとめる ORDER BY 結果表の行の順番定義 HAVING GROUP後の値を条件にできる UNION ALL 別のSELECT結果行を下に追加する SELECTの設問 Q1.テーブル①に1,000件格納されている、テー ブル②も1,000件格納されている時、2つを条件 無しでJOINした結果は何件? Q2.GROUP BYにSELECT句の全列を指定し た結果は、GROUP BY句を書かないとの同じで ある。〇 or ×?
  2. SELECT org.company_id -- 企業ID ,org.organization_id -- 組織ID ,org.organization_name -- 組織名

    ,user.user_cd -- 社員コード ,user.user_name -- 社員名 FROM m_organization org -- 組織テーブル JOIN m_company_user user -- 社員テーブル ON user.company_id = org.company_id AND user.organization_id = org.organization_id AND user.user_name LIKE '%す%' AND user.del_flg = '0' WHERE org.company_id = 2 AND user.del_flg = '0' ORDER BY org.organization_id, user.user_cd このSELECT文を、 どう読み解きますか? <PK> company_id organization_id <PK> company_id user_id 組織:社員  1:N
  3. SELECT -- 部署の情報 org.company_id -- 企業ID ,org.organization_id -- 組織ID ,org.organization_name

    -- 組織名 -- 社員の情報 ,user.user_cd -- 社員コード ,user.user_name -- 社員名 FROM m_organization org -- 組織テーブル JOIN m_company_user user-- 社員テーブル ON user.company_id = org.company_id -- 結合条件(PK) AND user.organization_id = org.organization_id -- 結合条件(PK) AND user.user_name LIKE '%す%' -- 社員 検索条件 AND user.del_flg = '0' -- 有効性フィルター WHERE org.company_id = 2 -- 組織 検索条件 AND user.del_flg = '0' -- 有効性フィルター ORDER BY org.organization_id, user.user_cd 読み解き例 1.このSQLの目的は。 部署と社員の関係の取得 だろう 2.順序と1行の単位は。 Group Byも集計関数も無いの で、社員単位だろう。 組織順 3.登場する全テーブル (FROM ,JOIN)を確認。 SELECTに登場するテーブルの みなのでOK。 もし他テーブルが登場したら理 由を探す。 4.結合条件(ON)にPKが揃って いるか確認 ※PKを知らずにSQL の読み書きはできな い、必ずテーブル定義 を確認! 5.検索条件を確認。リテラル、パ ラメータ、結合構造
  4. SELECT 1 AS union_index ,IFNULL(org.organization_name, '無所属') ,COUNT(user.user_id) AS user_count FROM

    m_company_user user-- 社員テーブル LEFT JOIN m_organization org -- 組織テーブル ON org.company_id = user.company_id AND org.organization_id = user.organization1_id AND org.del_flg = '0' WHERE user.company_id = 2 AND user.del_flg = '0' GROUP BY union_index, organization_name HAVING COUNT(user.user_id) >= 4 -- この条件の効果は? -- UNION ALL -- 右上へ続く... -- ...左下からの続き SELECT 2 AS union_index ,'削除済の社員' , COUNT(v.user_name) FROM (SELECT DISTINCT u.user_name -- DISTINCTを使う理由は? FROM m_company_user u WHERE u.company_id = 2 AND u.del_flg = '1' ) v -- ORDER BY union_index ,user_count DESC 読んでみよう
  5. もっと知りたい時の検索ワード 標準文法 「SQL標準」「ANSI ISO SQL」 データベースの種類 「Database 製品一覧」「MySQL vs PostgreSQL

    2019」 基本から複雑で便利なクエリまで 「SQL 句」「SQL 集計関数」「SQL ウィンドウ関数」 「MySQL group_concat find_in_set」    答え Q1. 1,000,000件 Q2.× DISTINCT効果がある 絵も図も無くてごめんなさい