HTTPの歴史と概要をまとめてみた

HTTPは、Webでクライアントとサーバが通信するときに使用される
アプリケーション層のプロトコル


Webの普及によってより多くの機能がHTTPに求められるようになってきた。

 

現在ではHTTP/1.1が主流
HTTP/2やHTTP/3も実装が進んでいる。

 

【 HTTP/0.9 】

HTTP/0.9はサーバからデータを取得する機能しかなく、非常に簡素なプロトコルでした。
現在ではほとんど使われていない。

 

【 HTTP/1.0 】

HTTP/0.9に多少の機能が追加され、HTTP/1.0からRFCで正式に定義されるようになりました。
HTTP/1.0からは、HTTP/0.9と区別するためプロトコルにバージョンを含めるようになりました。

まだ機能が不足していたのと、そのあとに発表されたHTTP/1.1が主流となって
現在ではほとんど利用されていない。

 

【 HTTP/1.1 】

HTTP/1.0発表からしばらく経って、HTTP/1.1が発表されました。
その後2回の改定を経て今に至ります。
HTTPの現在の主流のプロトコルで、通常HTTPといえばHTTP/1.1を指すことが多いです。

 

【 HTTP/2 】

HTTP/2はHTTP/1.1と後方互換性を維持したまま、高速な通信ができるプロトコルになっている。
クライアントが対応していればHTTP/2による通信をして、
クライアントが対応していなければHTTP/1.1の通信をするので共存ができます。

ヘッダの圧縮や、パイプラインと呼ばれる通信の多重化技術を使って、
HTTP/1.1よりも高速な通信を実現しています。

 

【 HTTP/3 】

HTTP/3はHTTP/2からさらに高速化を実現するために実装されるプロトコルです。
従来のHTTPはトランスポート層プロトコルとしてTCPを使用していましたが、
HTTP/3では新たにQUICを使用しています。

QUICを使用することでTCPでは限界のあった通信速度改善が見込まれ、
HTTP/2よりも高速な通信が期待できます。

集合演算

UNION レコードの足し算

-- 二つのselectの結果が合わせて出力される
select id, price from soft
union 
select id, price from soft2;

-- ※注意点
--  列の数を揃えること
-- 列のデータ型を揃えること
-- order byは全体で一つだけ

-- where と order byを使う
select id, price from soft
where price > 200
union 
select id, price from soft2
where id <> '4'
order by price;


-- ALL で重複行を残す
-- union の後にallをつけると各テーブルのデータが重複しても取得する
select id, price from soft
union all
select id, price from soft2;

INTERSECT テーブルの共通部分

-- 各テーブルの一致したデータのみ出力
select id, price from soft
intersect 
select id, price from soft2
order by price;

EXCEPT レコードの引き算

-- 前者のテーブルから後者でも一致するレコード以外取得する。(前者レコード - 後者レコード = 結果)
select id, price from soft
except 
select id, price from soft2
order by price;

-- 注意点
-- 引き算のためどちらのテーブルを先に書くかで結果が変わるので注意

JOIN 結合

テーブルの列を連結する

-- INNERJOIN 内部結合
select s.name, s.price, c.name 
from soft as s 
inner join category as c 
on s.category = c.category_id;

-- where を使う
select s.name, s.price, c.name 
from soft as s 
inner join category as c 
on s.category = c.category_id
where s.id = '2';


-- OUTER JOIN 外部結合
-- outer join の前にleft  またはrightをつける
select s.name, s.price, c.name 
from soft as s 
left outer join category as c 
on s.category = c.category_id;


-- 注意点

-- INNER JOIN(内部結合) と OUTER JOIN(外部結合)の違い
-- 内部結合では2つのテーブルに存在しているデータを取得する
-- 外部結合では片方のテーブルのデータを全て取得する
-- 例えば外部結合ではデータがNULLでも取得する

-- LEFT と RIGHT の違い (OUTER JOIN)
-- LEFT か RIGHT のテーブル指定でどちらのテーブルをマスタにするか決める。
-- 機能的な差はないのでどちらでも良い

クロス結合

-- データ数  ✖️ データ数 が結果として取得する
-- 2つのテーブルのレコード全ての組み合わせを作る
select s.name, s.price, c.name 
from soft as s 
cross join category as c ;

SQL 使いやすい関数とCASE式

文字列連結

# || で文字列連結
select name, category, name || category as name_category from soft;

日付系

# 現在の日付を取得
select current_date;

# 現在の時間
select current_time;

# 現在の日時
select current_timestamp;

# extract
# 日付要素の切り出し 戻り値数値なので注意
select current_timestamp as now, 
extract(year from current_timestamp) as year,
extract(month from current_timestamp) as month,
extract(day from current_timestamp) as day,
extract(hour from current_timestamp) as hour,
extract(minute from current_timestamp) as minute,
extract(second from current_timestamp) as second;

COALESCE (コアレス)

左から順に引数を見て、最初にNULLでない値を返す。

select coalesce (null, 1) as col_1, coalesce (null, 'abc', null) as col_2, coalesce (null, null, '12345678') as col_3;

LIKE (あいまい検索)

# 前方一致
select * from soft where name like '%a';


# 中間一致
select * from soft where name like '%a%';


# 後方一致
select * from soft where name like 'a%';

BETWEEN (範囲検索)

select * from soft where price between 200 and 1000;

# 以下と同じ
select * from soft where price >= 200 and price <= 1000;

IN (ORの省略形)

select * from soft where price in (200, 400, 800);

# 以下と同じ
select * from soft where price = 200 or  where price = 400,  where price = 800;

# NOTにする
select * from soft where price not in (200, 400, 800);

CASE式

条件分岐をする

# 構文

CASE 
WHEN <評価式> THEN <式> 
WHEN <評価式> THEN <式>
WHEN <評価式> THEN <式> 
WHEN <評価式> THEN <式> 
ELSE <式>
END

使う

select * , 
case 
when category = 'Editor'
then 'Eから始まる' || category || 'ですよ'
when category = 'IDE'
then 'Iから始まる' || category || 'ですよ'
else null
end as if_category
from soft;

※endを忘れないように。

SQL ビューとサブクエリ

ビューとは仮装のテーブル よく使うSELECT文を保存できる。 そして、仮想的なテーブルを作る。

ビューを作る

# as の後にselect文を記載する
create view soft_max (category, price_max)
as select category, MAX(price) from soft group by category; 

作成したビューを取得する

# fromのテーブルの名前の位置にビューの名前を指定する。
select * from soft_max;

# ビューに条件式を使う。
select * from soft_max where category = 'IDE';

ビューを一覧表示する

select table_name from INFORMATION_SCHEMA.views WHERE table_schema = ANY (current_schemas(false));

ビューを削除する

drop view soft_max;

※ビューはテーブルの最新データを取得する。逆にビューを更新するとテーブルのデータも更新される。 ビュー定義にはorderbyは使用できない。

サブクエリ

# fromにselect文をいれる
select  category, max_price
from (select category, MAX(price) as max_price from soft group by category) as soft_max; 


# 階層が深いサブクエリ
select  category, max_price
from (select * from (select category, MAX(price) as max_price from soft group by category) 
as soft_max where max_price > 1000) as soft_max_filter; 

スカラサブクエリ

戻り値が単一になる

# where句によく使う
# (select ~)をスカラサブクエリという
select id, name, price from soft 
where price > (select avg(price) from soft);

# 定数としても使える
select id, name , price , (select min(price) from soft) as min_price from soft;

※複数行を返さないようにする

相関サブクエリ

スカラサブクエリでは一行しか返せないが、複数行返すことができる

# 各categoryごとの平均を超えるpriceをもつ行を返す
select id, name, price, category from soft as s1 
where price > (select avg(price) from soft 
as s2 where s1.category = s2.category group by category);

SQL CRUDとトランザクション

INSERT データを挿入する

# 1行のINSERT
insert into soft (id, name, price, category) values ('8', 'chrome', 800, null);

# カラムの指定なしでも可能
insert into soft  values ('9', 'phpstorm', 1000, 'IDE');

# 複数行のINSERT 
#  values につなげて記述
insert into soft  values ('10', 'webstorm', 1100, 'IDE'), ('11', 'memo', 1200, 'Editor');

# DEFAULTの値を明示的にする
insert into soft  values ('10', 'webstorm', 1100, DEFAULT);

他のテーブルからデータをコピーする

# 事前にテーブルを作成する必要あり
# soft_secondというテーブルを作成したと仮定 
# select の結果が挿入される
insert into soft_second (second_id, second_name, second_price, second_category)
select id, name, price, category from soft;

DELETE データを削除する

# テーブルを残したまま、全ての行を削除するDELETE文
DELETE FROM soft;

# 該当の行だけ削除するDELETE
# idが11だけ削除する
delete from soft where id = '11';

UPDATE データを更新する

# 全て更新
# 全てのデータのpriceが1000に更新
update soft set price = 1000;

# 該当のみ更新
# priceが500以上のデータのpriceを2倍にする。
update soft set price = price * 2 where price > 500;

#複数の更新
# カンマで区切る
update soft set price = price * 2, category = 'Editor'  where price > 500;

トランザクション

# COMMMITする (確定)
BEGIN TRANSACTION;

UPDATE soft set price = 1000;

COMMIT;


# ROLLBACKする (取り消し)
BEGIN TRANSACTION:

UPDATE soft set price = 1000;

ROLLBACK;

SQL 集約関数とGROUPBY

INSERTサンプル

BEGIN TRANSACTION;

INSERT INTO soft VALUES ('1', 'eclipse', '100');
INSERT INTO soft VALUES ('2', 'vscode', '200');
INSERT INTO soft VALUES ('3', 'visual studio', '300');
INSERT INTO soft VALUES ('4', 'Atom', '400');
INSERT INTO soft VALUES ('5', 'pycharm', '500');
INSERT INTO soft VALUES ('6', 'sublime text', '600');
INSERT INTO soft VALUES ('7', 'DBeaver', '700');
 
COMMIT;

SELECT

基本形

# 全て
select * from soft;

# 列を指定 ※idとpriceが列名
select id, price from soft;

ASで列に別名をつける

# idにsoft_idという名前を付けている
# 日本語を使用する場合は、""(ダブルクオーテーション)で囲む。
select id as soft_id, price as "値段" from soft;

# 定数の出力なども可能
select 'おまけ' as omake,  id as soft_id from soft;

値の重複を省く

# 出力結果で重複が省かれる
select distinct name from soft;

条件式

# idを1に絞って出力
select * from soft where id = '1';

# NULLはis null となる
select price from soft where price is null;

算術と比較演算子

# price を300以上に絞って出力
select * from soft where price > 300;

# price を2倍で出力
select id, price * 2 as price_x2 from soft;

# 否定は<>を使う
# 300以外を取得
select *  from soft where price <> 300;

論理演算子

# NOT演算子 
# priceが400以上ではないという条件
select *  from soft where not price  > 400;

# AND
select * from soft where price > 300 and id <> '7';

# OR 
select * from soft where price > 300 or id = '1';

テーブルを集約

# COUNT 行数を数える
select count(*) from soft;
# NULLを除外するには、列を指定
select count(price) from soft;


# SUM 合計を取得
# priceの合計を取得する
select sum(price) from soft;


# AVG 平均値を取得
SELECT AVG (price) from soft;

# MAX 最大値を取得
# MIN 最小値を取得
SELECT MAX(price) , MIN (price) from soft;

# 重複値を省きつつ、集約する
select max(distinct price ) from soft;

説明用にカラムを追加

# 値は適当です。
alter table soft add column category char(10);

BEGIN TRANSACTION;

update soft set category = 'IDE' where id = '1';
update soft set category = 'Editor' where id = '2';
update soft set category = 'IDE' where id = '3';
update soft set category = 'Editor' where id = '4';
update soft set category = 'IDE' where id = '5';
update soft set category = 'Editor' where id = '6';
update soft set category = 'IDE' where id = '7';

COMMIT;

グループに分ける

# GROUP BY 
# 値が等しい行をグループ分けすることができる。
# この例では、categoryのIDEとEditorをグループ分けして、priceの最大値を取得している。
select category, MAX(price) from soft group by category;

# whereで条件式を使う場合は、条件で一致した値に対してGROUP BYが実行される。
select category, MIN(price) from soft where price >= 200 group by category;

HAVING

GROUP BYでグループ化した結果に条件を指定することができる。

# group byの後に記述する。
# categoryでgroup by したpriceに最大値が600で絞る
select category, MAX(price) from soft group by category having MAX(price) > 600;

並べ替え

order by

# asc 昇順 
#何も付けないと昇順
select * from soft order by price;

# desc 降順
select * from soft order by price desc;


#集約関数も使用可能
select category, MAX(price) from soft group by category order by MAX(price) desc;

SQL スキーマとかテーブルとか

PostgresをDockerで動かす

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
docker exec -it some-postgres bin/bash
psql -U postgres

データベース一覧

SELECT* FROM pg_database;

現在のデータベースを確認

select current_database();

データベース変更

\c test;

データベース削除

drop database test;

バージョン確認

select version();

スキーマ一覧

select schema_name from information_schema.schemata;

現在のスキーマを選択

select current_schema();

作成

 create schema test;

スキーマを変更

SET search_path = test;

スキーマ削除

drop schema test;

テーブル操作

テーブル一覧

select  relname as TABLE_NAME  from  pg_stat_user_tables;
# または
SELECT * FROM pg_catalog.pg_tables;

テーブル作成

create table soft();
# カラム指定
create table soft(id char(4) NOT NULL, name char(30) NOT NULL, price INTEGER , PRIMARY KEY (id));

テーブル列を追加する ※softはサンプルのテーブル名

alter table soft add column created_at date;

テーブルの列を削除する

alter table soft drop column created_at;

テーブル削除

drop table soft;

カラム一覧取得

SELECT * FROM information_schema.columns where table_name='soft' order by ordinal_position;

命名ルール データベースやテーブル、列といった名前に使える文字は、半角文字のアルファベット 数字、アンダーバーに限られる。 また、名前の最初は半角のアルファベットで始める。

コメントの書き方

# 一行のみ
-- これはコメント

# 複数行
/*
これはコメント
これはコメント
*/