てみブログ

てみブログ

個人的な覚書用です

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