SQL基本文法
※基本的にMySQLにて確認しています。
コメントアウト
文頭に「--」(ハイフン2個)を付ける
--コメント
範囲コメントアウトは /* */
/* ここからコメント ここまでコメント*/
Select(読み出し)
--Selectする select * from テーブル名; --※SQLは文末にセミコロンが必要。 --セミコロンがあるまでは何回改行しても一文。 --カラムを選択してSelectする select カラム名1, カラム名2 from テーブル名; --where(絞り込み) select * from テーブル名 where カラム名 = '値' and カラム名 = '値'; --あいまい検索 select * from テーブル名 where カラム名 like '_値%'; --%はワイルドカード。0文字以上の任意の文字。 --_は1文字の任意の文字。 --order by (並び替え) select * from テーブル名 order by カラム名 asc; -- asc : 昇順 (ascending) -- desc : 降順 (descending) --上位n件のみ表示 --①limit (SQL標準記法) select * from テーブル名 order by カラム名 asc limit 5; --②top (DBによって使えたり使えなかったり。MSSQLはこれ使ってる) select top 5 * from テーブル名 order by カラム名 asc; --③副問い合わせしてrownumで絞る(Oracleではこれ使ってる) select * from (select * from テーブル名 order by カラム名 asc) where rownum >= 5; --distinct (重複削除) select distinct カラム名 from テーブル名;
集計
-- 合計(sum) select sum(カラム名) from テーブル名; --他の集計関数も使い方は同じ --計上(count)、平均(avg)、最大(max)、最小(min) --単純指定だと、結果は1行のみ返される。 --Group by select sum(値のカラム名) from テーブル名 group by 名称のカラム名; --グループ化した名称ごとに集計した値が返される。 --(テストの集計などで、「教科」「点数」のカラムがあるイメージ) --※Group byは、必ず集計関数と合わせて使う --Having(Gruop byした結果の絞り込み) --Whereの代わりにHavingを使う。使い方はWhereとほぼ同じ。
Join(結合)
--2つ以上のテーブルを結合して表示する。 select * from テーブル1 join テーブル2 on テーブル1.id = テーブル2.id; --テーブル1.idが外部キー、テーブル2.idがテーブル2の主キー --joinだと、外部キーがNullだった行は表示されない。 --Null行も表示するには、「left join」を使う。文法は同じ。 --結合後のテーブルで、同じカラム名の行がある場合はドットで使い分けする。 --また、Asで命名しておけばその名前で表示される。 --例) select テーブル1.name as '氏名'、テーブル2.name as '所属' --(後で書く) 外結合、内結合、自然結合などの使い分けを書きたい。
Insert(作成)、Update(更新)、Delete(削除)
--Insert insert into テーブル名 (カラム1, カラム2) values ('値1', '値2'); 例) insert into user_table (id, name, age) values ('1', 'ポチ', '5');
id | name | age |
---|---|---|
1 | ポチ | 5 |
--Update update テーブル名 set 上書きするカラム名 = '値' where 検索するカラム名 = '値' ; 例) update user_table set name = 'タマ', age = '3' where id = '1';
id | name | age |
---|---|---|
1 | タマ | 3 |
--Delete delete from テーブル名 where 検索するカラム名 = '値' ; 例) delete from user_table where id = '1';
※updateとdeleteでは、必ずwhere句で行を指定すること(id指定など) 指定がない場合は全行更新or削除される。
COMMIT, ROLLBACK
トランザクションを反映するにはCommit、取り消すにはRollbackする。
commit;
rollback;
特定の作業まで戻りたい場合は、セーブポイントを設ける。
--処理1 SAVEPOINT save1; --処理2 ROLLBACK TO save1;
save1のポイントまで戻る。処理1は適用(コミット前)、処理2は取り消しとなる。
MySQLではデフォルトでAutoCommitが有効。UpdateやInsertは即時コミットされる。
--AutoCommit状態の確認(1: 有効、0: 無効) select @@autocommit; --AutoCommit の有効化 set autocommit = 1; --AutoCommitの無効化 set autocommit = 0;
クエリ内で変数を定義する
--定義 DECLARE @table_name = 'hogehoge' --確認 PRINT @table_name --参照 Select * from @table_name --コマンドごと埋め込んで実行することも可能 DECLARE @command = 'select * from hogehoge' EXECUTE @command
データベースの操作
CREATE DATABASE test_db; --データベースの作成 SHOW DATABASE; --データベースの確認 USE test_db; --データベースの選択 DROP DATABASE test_db; --データベースの削除
テーブルの操作
--テーブルの作成(例:自動生成ID、名前、年齢) ※MySQLにて確認 CREATE TABLE test_table( id INT AUTO_INCREMENT, name TEXT, age INT, PRIMARY KEY (id) )DEFAULT CHARSET = utf8; --テーブル一覧の確認 SHOW TABLES; --テーブルのカラム定義の確認 SHOW COLUMNS FROM test_table; SHOW FULL COLUMNS FROM test_table; --Create Table文の確認 SHOW CREATE TABLE test_table; --テーブルのリネーム ALTER TABLE test_table RENAME TO test_table_renamed; --テーブルの削除 DROP TABLE test_table; --データの投入 INSERT INTO test_table (name, age) VALUES ('太郎', 12); --カラムの追加 ALTER TABLE items ADD COLUMN level INT; ※型指定が必要なので注意 --カラムを削除する ALTER TABLE items DROP COLUMN level; --追加したカラムに値を追加(Update) UPDATE test_table SET level = 20 WHERE id = 1; UPDATE test_table SET level = 18 WHERE id = 2; --カラムのデータ型を確認する DESCRIBE test_table; --カラム名を変更する(例:levelをlevelsに変更する) ALTER TABLE test_table CHANGE COLUMN level levels INT;
日付を扱う
現在日付の取得
SYSDATE() もしくは NOW() で取得可能。
システムの日時なので、タイムゾーンはシステムに依存する。
SELECT SYSDATE(); >2021-10-20 09:20:35 SELECT NOW(); >2021-10-20 09:20:35
※SYSDATEとNOWの違い
・SYSDATE⇒コマンドが実行された瞬間の時刻を返す。
・NOW⇒クエリが実行された時間を返す。
短時間のクエリではほぼ同一の時間が返るが、処理に時間がかかるクエリを投げると差が出る。
特に、単一のクエリの中で複数回現在時刻を呼び出す場合は、NOWの方が負荷を下げられ、また常に同じ値が得られるため使い勝手がいい。
フォーマットを調整する。
・日時の書く要素を取り出す
DATE( NOW() ); --日付を取り出す >2021-10-20 TIME( NOW() ); --時刻を取り出す >09:20:25 YEAR( NOW() ); --年を取り出す >2021 MONTH( NOW() ); --月を取り出す >10 DAY( NOW()); --日を取り出す >20 HOUR( NOW() ); --時間(hour)を取り出す >9 MINUTE( NOW() ); --分を取り出す >20 SECOND( NOW() ); --秒を取り出す >35 --※頭の0は外れる。(MySQLの場合)
DATE_FORMATを使う。
例えば、SYSDATEをYYYYMMDDの形式で取得する場合
SELECT DATE_FORMAT(SYSDATE(), '%Y%d%m'); >20211020