むじんブログ ”3歩進んで2歩下がる”

37歳未経験からのエンジニア転職を目指す営業部長

学習のアウトプット(SQL文の基礎)

SQL

RDBを動かすための言語。

ターミナルで操作・シークエルプロで操作のいずれも可能。

簡単な操作はGUIで行えるが、複雑な操作はコマンドで行う。

 

SQLの命令は、DDLDML・DCLの3つに大きく分かれる。

(以前のカリキュラムで少し学んだ内容)

 

--------------------------------------------------------------------------------

SQLの書き方】

SQL文をコマンド入力する際、大文字で記載するのが一般的。

(小文字でも動くが、他の文章との区別のために大文字で書く)

 

また、SQLは最後に;を入れて実行する。

もし忘れた場合はまだ文章が続くと見なされて→が出てくるので、;を入力して実行すればよい。

 

--------------------------------------------------------------------------------

DDL

Data Definition Languageの略。

データを定義するSQLで、DBの作成(CREATE)・更新(ALTER)・削除(DROP)などを行う。

 

・CREATE DATABASE データベース名;

→データベース作成

・SHOW DATABASES

→データベースの一覧表示

DROP DATABASE データベース名;

→作成されたデータベースの削除

 

-------------------------------------------------------------------------------- 

SQLによるテーブルの操作】

SQLでテーブル操作を行う場合、該当のテーブルがあるDBを指定する。

USE データベース名;

→用いるデータベースの指定

 

--------------------------------------------------------------------------------

【テーブルの作成】

CREATE TABLE テーブル名(カラム名1 カラム形式,カラム名2 カラム形式,・・・)

→テーブルを作成

Ruby on Railsでは、モデル作成後にrails db:migrateを実行した時に、SQLによるCREATE TABLEが裏で行われていた。

 

カラム形式は

Ralisでintegerとしていたもの(数字)→INT

Railsでstringとしていたもの(文字)→VARCHAR(最大文字数)

として入力する。

※VARCHARの最大文字数は255文字

 

例)

CREATE TABLE goods (id INT,name VARCHAR(255));

→SHOW TABLES;を実行すると、テーブルとして表示される。

さらにSHOW columns FROM goods;を実行するとカラムが表示される。

(FROM句は対象のテーブルを指定する時に用いる)

 

--------------------------------------------------------------------------------

【カラムの追加】

データベースを更新する際は、ALTER文を用いる。

ALTER TABLE goods ADD (price INT, zaiko INT);

→goodsテーブルにpriceとzaikoカラムがinteger型で追加される。

 

--------------------------------------------------------------------------------

【カラムの変更】

同様にALTER文を用いる。

ALTER TABLE goods CHANGE zaiko stock INT;

→カラムのzaikoがstockに変更される。

変更の際、カラム形式は同じであっても都度記載が必要である点に注意。

 

--------------------------------------------------------------------------------

【カラムの削除】

ALTER文のDROPを用いる。

ALTER TABLE goods DROP stock;

→goodsテーブルのstockカラムが削除される。

 

--------------------------------------------------------------------------------

DML

Data Manipulation Languageの略。

データの登録(INSERT)・更新(UPDATE)・削除(DELETE)・検索(SELECT)の操作を行う。

 

--------------------------------------------------------------------------------

【SELECT】

データの検索(取得)を行う命令。

 

SELECT カラム名 FROM テーブル名

→テーブルから特定のカラムを確認する。

SELECT * FROM テーブル名

→テーブルから全てのカラムを確認する。

(*のことをワイルドカードと呼び、文字の代わりに使うことができ、全てのパターンのような意味で用いられる)

 

--------------------------------------------------------------------------------

【INSERT】

データの登録を行う命令。

INTO句とセットで用いる。また、登録する値の前にはVALUEという句をつける。

 

INSERT INTO テーブル名 VALUE (値1,値2,値3・・・)

→テーブルの全カラムに値を登録する。

INSERT INTO テーブル名 (カラム1,カラム2) VALUE (値1,値2)

→テーブルのカラム1・2に値を登録する。

 

--------------------------------------------------------------------------------

【UPDATE】

データの内容を更新する命令。

UPDATE テーブル名 SET カラム名 = 値 WHERE id = id値

→指定のテーブル・id・カラムの値を更新する。

 

--------------------------------------------------------------------------------

【DELETE】

データの内容を削除する命令。

DELETE FROM テーブル名 WHERE id = id値

→指定のテーブル・idを削除する。

 

--------------------------------------------------------------------------------

【Sequel Proを使ったSQL文】

Sequel Proのクエリの項目をターミナルのように使ってSQL文を記述することもできる。

メリットとして下記がある。

タイプミスの修正が容易

・記述したSQL文が流れていかないので分かりやすい

・文末にセミコロンをつける必要がない

 

--------------------------------------------------------------------------------

【WHERE句】

レコードの取得をする際に用いる句。

idや文字列を指定したり、比較演算子などを用いることもできる。

WHERE句だけではレコードの取得はできないので、SELECTなどど組み合わせる。

 

--------------------------------------------------------------------------------

【LIKE句】

WHERE句と組み合わせることで、文字を指定して検索することができる。

%○○とすると、曖昧語句検索を行うことができる。

(%都とすることで「東京都」のように「都」の含まれた文字を検索できる)

 

--------------------------------------------------------------------------------

【AND演算子

a AND bのように記述する。

Rubyの&&と同じく、複数の条件が正の時にtrueになるイメージ。

WHERE age <= 22 AND prefecture = "神奈川県"

のように用いる。

 

--------------------------------------------------------------------------------

【OR演算子

上記のANDをORに置き換えたもの。

どちらかの条件が満たされていれば対象となる。

 

--------------------------------------------------------------------------------

【NOT演算子

WHERE NOT ○○で、○○に当てはまらないレコードを全て取得する。

 

--------------------------------------------------------------------------------

【BETWEEN演算子

WHERE カラム名 ○○ BETWEEN △△

で、○○〜△△の間に当てはまるもの全てを取得する。

 

--------------------------------------------------------------------------------

【IN演算子

WHERE カラム名 IN (○○,△△)

で、○○と△△というリストをカラムに対して指定し、

そのリストに該当するレコードを取得する。

 

--------------------------------------------------------------------------------

【JOIN句】

テーブルとテーブルを結合させる語句。

aテーブルとbテーブルで共通のユーザーIDを持つレコードを結合させて、1つのレコードにして取得することができる。

 

SELECT * FROM JOIN shifts s users u ON user_id = u.id

→シフトテーブルのuser_idとユーザーテーブルのuser idで一致しているものを結合するという意味になる。

なお、テーブル名の後に別名をつけて、記述の視認性を向上させることが可能。

(sやuがこれに当たり、テーブル名の頭文字を取るのが一般的)

 

--------------------------------------------------------------------------------

【CONCAT句】

複数のカラムを結合し、新たなカラムのようにする句。

下記例では、last_nameとfirst_nameを結合して「名前」というカラムにしている。

CONCAT(文字列1, 文字列2,・・・)

※連結させる句の中にNULLがあると、結果もNULLになる。

 

--------------------------------------------------------------------------------

【GROUP BY句】

ある特定のデータごとに、平均値や総量などを集計する際に用いる句。

GROUP BY カラム名

カラム名をグループ化すると表現する。

下記の例ではuser_idごとにシフトに入った時間の総量を求めたいので、GROUP BY GROUP BY user_idとしている。

 

--------------------------------------------------------------------------------

【COUNT関数】

グループ化されたデータに対して用いることができる関数で、特定のカラムの行数を集計できる句。

SELECT COUNT カラム名とする。

※カラムの値がNULLだとエラーになる。

 

--------------------------------------------------------------------------------

【JOIN・CONCAT・GROUP BY・COUNTを用いた例】

SELECT
  CONCAT(last_name, first_name) "名前",
  COUNT(*) "コマ数"
FROM shifts s
JOIN users u ON s.user_id = u.id
WHERE date = "2015-07-01"
GROUP BY user_id

 

→ユーザーテーブルとシフトテーブルを結合。

名前(last_nameとfirst_nameを結合)とコマ数(user_idをグループ化したデータのうち、user_idの行数)を一覧で表示させる。

→7月1日に誰が何コマシフトに入ったかが分かる。

 

--------------------------------------------------------------------------------

【サブクエリ】

あるSQL文の結果をもとに、別のSQL文を実行する仕組みのこと。

SQL入れ子構造のようになっている。

 

SELECT *
FROM users
WHERE id NOT IN (
  SELECT user_id
  FROM shifts
  WHERE date = "2015-07-01"
)

→7月1日に出勤した以外のスタッフを表示するSQL文。