SQL(1)SQLの基礎


SQLとは?


SQLは構造化クエリー言語であり、構造化クエリー言語と呼ばれ、リレーショナルデータベース管理システム(RDBMS)のデータを管理するために設計された特殊な目的のプログラミング言語である.リレーショナル・データベース管理システムでのデータの取得と管理、データベース・モードの作成と変更、データベース・オブジェクト・アクセスの調整のために設計されています.

短文を構成するSQL言語要素といくつかを表示します.
出典:ウィキペディア

DB(DATABASE)とは?


データベースは、複数の人が共有し、使用できるように組織、統合、管理されたデータのセットです.これは、作成されたリストによって複数のアプリケーションシステムの統合情報を格納し、実行できる共通データのセットです.
出典:ウィキペディア

上記のDBでは、特定のテーブル(借用契約書)を確認してインポートすると、「SELECT*FROM借用履歴」がSQLになります.

クエリの基本構造

  • SELECT~:クエリーするカラム名
  • を選択
  • FROM~:クエリーするテーブル名(入力先とテーブル名)
  • を指定します.
  • WHERE~:クエリーに必要な条件を設定
  • GROUP BY~:特定列ごとのパケット出力
  • ORDER BY~:SELECTの後の列でソートが必要な部分をソート(デフォルトでは昇順)
  • .
  • LIMIT数字:
  • 表示する行数を決定


    <テーブル名:借書履歴>



    画像を見ると、図書館で管理されているDBであることがわかります.
  • ID:借入先ID
  • 名称:借入人名称
  • 図書ID:貸し出し図書ID
  • 借書日:借書日
  • 返却日:図書返却日
  • 5列:列(column)と横線を行:低(row)と呼びます.

    [ID列(column)]

    [最初の行(行)]
    テーブルを使用して基本構造を検証しましょう.
    import os
    db_path = os.getenv('HOME')+'/mydb.db'
    conn = sqlite3.connect(db_path)
    c = conn.cursor()
    
    for row in c.execute('SELECT * FROM 도서대출내역'):
    	print(row)
        
    >>>
    ('101', '문강태', 'aaa', '2020-06-01', '2020-06-05')
    ('101', '문강태', 'ccc', '2020-06-20', '2020-06-25')
    ('102', '고문영', 'bbb', '2020-06-01', None)
    ('102', '고문영', 'ddd', '2020-06-08', None)
    ('103', '문상태', 'ccc', '2020-06-01', '2020-06-05')
    ('104', '강기둥', None, None, None)

    すべてのクエリー


    SELECT*FROM図書貸し出し履歴;
    for row in c.execute('SELECT * FROM 도서대출내역'):
    	print(row)
        
    >>>
    ('101', '문강태', 'aaa', '2020-06-01', '2020-06-05')
    ('101', '문강태', 'ccc', '2020-06-20', '2020-06-25')
    ('102', '고문영', 'bbb', '2020-06-01', None)
    ('102', '고문영', 'ddd', '2020-06-08', None)
    ('103', '문상태', 'ccc', '2020-06-01', '2020-06-05')
    ('104', '강기둥', None, None, None)
    SELECTとFROMの間に特定の列を挿入して出力します.上のクエリに示すように、星(*)を入力すると、テーブル全体にコマンドが入力されます.

    特定の列の指定


    SELECT ID FROM図書貸し出し履歴:
    for row in c.execute('SELECT ID FROM 도서대출내역'):
    	print(row)
        
    >>>
    ('101',)
    ('101',)
    ('102',)
    ('102',)
    ('103',)
    ('104',)
    SELECTとFROMの間に「ID」を挿入すると、コマンドは「テーブル全体にID列のみ入力」となります.

    入力条件


    SELECT*FROM図書貸し出し履歴
    WHERE名=「文康泰」;
    for row in c.execute('SELECT * FROM 도서대출내역 WHERE 이름 = "문강태";'):
    	print(row)
        
    >>>
    ('101', '문강태', 'aaa', '2020-06-01', '2020-06-05')
    ('101', '문강태', 'ccc', '2020-06-20', '2020-06-25')
    SELECTとFROMの間に*があり、列全体をインポートし、WHEREセクションを追加することを示します.WHEREセクションの後に、特定の条件を入力できます.「名前=「文康泰」と書いてあり、文康泰という名前の人を連れてきます.

    GROUP BYによる重複除外


    SELECT名称FROM図書貸し出し履歴
    GROUP BY名称;
    for row in c.execute('SELECT 이름 FROM 도서대출내역 GROUP BY 이름;'):
    	print(row)
        
    ('강기둥',)
    ('고문영',)
    ('문강태',)
    ('문상태',)
    GROUP BYは、データを名前でグループ化する役割です.GROUP BYは、通常、集約関数とともに使用される.

    DISTINCTによる重複除外


    SELECT DISTINCT名称FROM図書貸し出し履歴;
    for row in c.execute('SELECT DISTINCT 이름 FROM 도서대출내역;'):
    	print(row)
        
    >>>
    ('문강태',)
    ('고문영',)
    ('문상태',)
    ('강기둥',)

    ORDER BYでソート


    SELECT*FROM図書貸し出し履歴
    ORDER BY ID ;
    for row in c.execute('SELECT * FROM 도서대출내역 ORDER BY ID ;'):
    	print(row)
        
    >>>
    ('101', '문강태', 'aaa', '2020-06-01', '2020-06-05')
    ('101', '문강태', 'ccc', '2020-06-20', '2020-06-25')
    ('102', '고문영', 'bbb', '2020-06-01', None)
    ('102', '고문영', 'ddd', '2020-06-08', None)
    ('103', '문상태', 'ccc', '2020-06-01', '2020-06-05')
    ('104', '강기둥', None, None, None)
    ORDER BYの後に特定のカラム名が書かれている場合は、カラムに対する値として表示されます.上のクエリ文では、SELECTとFROMの間にアスタリスク(*)があり、「列全体をインポートしますが、IDでソートしてください」という意味です.
    通常、ORDER BYの後は省略する(ASC).昇順はデフォルト設定です.逆にDESCを降順で書く
    SELECT*FROM図書貸し出し履歴
    ORDER BY ID DESC ;
    for row in c.execute('SELECT * FROM 도서대출내역 ORDER BY ID DESC ;'):
    	print(row)
        
    >>>
    ('104', '강기둥', None, None, None)
    ('103', '문상태', 'ccc', '2020-06-01', '2020-06-05')
    ('102', '고문영', 'bbb', '2020-06-01', None)
    ('102', '고문영', 'ddd', '2020-06-08', None)
    ('101', '문강태', 'aaa', '2020-06-01', '2020-06-05')
    ('101', '문강태', 'ccc', '2020-06-20', '2020-06-25')
    ID降順で並べ替えます.

    特定行クエリー


    SELECT*FROM借書歴史LIMIT 5;
    for row in c.execute('SELECT * FROM 도서대출내역 LIMIT 5 ;'):
    	print(row)
        
    >>>
    ('101', '문강태', 'aaa', '2020-06-01', '2020-06-05')
    ('101', '문강태', 'ccc', '2020-06-20', '2020-06-25')
    ('102', '고문영', 'bbb', '2020-06-01', None)
    ('102', '고문영', 'ddd', '2020-06-08', None)
    ('103', '문상태', 'ccc', '2020-06-01', '2020-06-05')
    LIMIT構文の後に数字を入力すると、その数字に等しい行(行)のみが出力されます.LIMIT構文は、主に、テーブルを最初にクエリーするときに、これらのテーブルの構造を決定し、例としてどの値が存在するかを決定するために使用されます.
    SELECT名称、貸出日、返却日
    FROM図書貸し出し履歴
    ORDER BY借入日DESC
    LIMIT 1;
    for row in c.execute('SELECT 이름, 대출일, 반납일 FROM 도서대출내역 ORDER BY 대출일 DESC LIMIT 1;'):
        print(row)
       
    >>> ('문강태', '2020-06-20', '2020-06-25')

    DISTINTとGROUP BY



    基準に従って重複しない統計を行う場合は、統計関数とDISTINCTとGROUP BYを同時に使用する必要があります.

    Q&A


    Q.「借書履歴」表に、出力|名称|借書回数|の照会を記入してください.別名「COUNT(*)AS貸付数量」というGROUP BY名構文を使用する必要があります.
    A.SELECT名称、COUNT(*)AS貸付数量FROM借書履歴GROUP BY名称