学習のアウトプット(SQL文の基礎)
【SQL】
RDBを動かすための言語。
ターミナルで操作・シークエルプロで操作のいずれも可能。
簡単な操作はGUIで行えるが、複雑な操作はコマンドで行う。
SQLの命令は、DDL・DML・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文を実行する仕組みのこと。
SELECT *
FROM users
WHERE id NOT IN (
SELECT user_id
FROM shifts
WHERE date = "2015-07-01"
)
→7月1日に出勤した以外のスタッフを表示するSQL文。