SQL (Structured Query Language) は、リレーショナル データベースの管理と操作に使用される構造化クエリ言語です。データベース管理システムで最も広く使用されている言語の 1 つです。
-- データのクエリ
SELECT * FROM テーブル名 WHERE 条件;
-- データの挿入
INSERT INTO テーブル名 (列 1、列 2) VALUES (値 1、値 2);
--データの更新
UPDATE テーブル名 SET カラム 1 = 値 1 WHERE 条件。
-- データの削除
DELETE FROM テーブル名 WHERE 条件。
-- テーブルの作成
CREATE TABLE テーブル名 (
列名 1 データ型、
カラム名2のデータ型
);
INT: 整数型。VARCHAR(n):可変長文字列、最大n文字。DATE:日付型。FLOAT:浮動小数点型。BOOLEAN: ブール値 (true または false)。MySQL は、クエリ言語として SQL を使用する人気のオープンソース リレーショナル データベース管理システム (RDBMS) であり、小規模から中規模、大規模のアプリケーションに適しています。
mysql -u root -p
CREATE DATABASE example_db;
USE example_db;
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT);
INSERT INTO users (name, age) VALUES ('Alice', 30);
SELECT * FROM users;
SQLite は、管理用に別のサーバーを必要としない組み込みデータベースであり、軽量のアプリケーションに適しています。
sqlite3 example.db
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);
INSERT INTO users (name, age) VALUES ('Alice', 30);
SELECT * FROM users;
PostgreSQL (Postgres とも呼ばれます) は、強力なオープンソースのオブジェクト リレーショナル データベース システム (ORDBMS) です。 30年以上にわたる活発な開発に基づいており、信頼性、機能堅牢性、パフォーマンスに定評があり、「世界で最も先進的なオープンソースデータベース」として知られています。
PostgreSQL はクライアント サーバー アーキテクチャを採用し、各接続に独立したハンドラーを割り当てるため、単一の接続のクラッシュがデータベース サーバー全体の安定性に影響を与えません。
Postgres のパワーは主に、その豊富なエコシステムの拡張によってもたらされます。
| アドバンテージ | 欠点がある |
|---|---|
| 高いデータ整合性とセキュリティ | 大量のデータを高頻度で書き込むと、VACUUM メカニズムによりパフォーマンスが変動する可能性があります。 |
| 複雑なデータ分析とビジネスロジックをサポート | 一般に、MySQL と比較してメモリ消費量が多くなります。 |
| オープンソース コミュニティは非常に活発で、ベンダー ロックインはありません。 | 設定するパラメーターが多数あるため、初心者がパフォーマンスを構成して最適化するには長い学習曲線が必要です。 |
T-SQL の正式名は Transact-SQL で、Microsoft と Sybase によって開発された SQL 標準の拡張バージョンです。これは、Microsoft SQL Server および Azure SQL 関連サービスの中核となる通信言語です。標準 SQL と比較して、T-SQL にはプログラミング機能が追加されており、データのクエリだけでなく、複雑な論理操作も処理できます。
| 機能の種類 | 標準 SQL (ANSI) | T-SQL (Microsoft) |
|---|---|---|
| 文字列の連結 | 二重の垂直バーを使用する || | プラス記号 + を使用します |
| 返される列の数を制限する | FETCH FIRST を使用する | TOPキーワードを使用する |
| データ型変換 | CAST | CAST と CONVERT (フォーマットをサポート) |
| プログラムロジック | 基本的なお問い合わせがメインです | 完全な手続き型プログラミング言語機能 |
次のコードは、T-SQL で変数、論理判断、データ クエリを組み合わせる方法を示しています。
-- 変数の宣言と設定
@Threshold INT = 100 を宣言します。
@CurrentStock INT を宣言します。
-- 特定の製品の在庫を取得する
SELECT @CurrentStock = 在庫数量
製品から
WHERE 製品ID = 5;
-- 論理的な判断
IF @CurrentStock <; @しきい値
始める
PRINT '警告: 在庫が事前に設定されたしきい値を下回っています。 ';
-- 補充ロジックを実行します...
終了
それ以外の場合
始める
SELECT * FROM Products WHERE ProductID = 5;
終わり
T-SQL は次の分野で広く使用されています。
T-SQL は標準 SQL を拡張して、完全なプログラム機能を提供します。変数、ロジック制御、エラー処理を通じて、開発者はデータベース レベルで複雑なビジネス ロジックを作成できます。
T-SQL では、すべてのカスタム変数は @ 記号で始まる必要があります。宣言には DECLARE を使用し、代入には SET または SELECT を使用します。
-- 変数を宣言する
@EmployeeCount INT を宣言します。
DECLARE @DepartmentName NVARCHAR(50);
-- 割り当て
SET @DepartmentName = 'IT 部門';
-- クエリ結果から値を割り当てる
SELECT @従業員数 = COUNT(*)
従業員から
WHERE 部門 = @部門名;
-- 結果を出力する
印刷 @EmployeeCount;
IF...ELSE ステートメントを使用すると、条件に基づいてさまざまなコード ブロックを実行できます。ブロックに複数のステートメントが含まれる場合、それらのステートメントを BEGIN...END で囲む必要があります。
@StockLevel INT を宣言します。
SET @StockLevel = 10;
IF @StockLevel <; 5
始める
印刷 '在庫が非常に少なくなっています。すぐに再入荷してください。 ';
終了
ELSE IF @StockLevel <; 20
始める
PRINT '在庫が残りわずかとなっておりますので、再入荷をお勧めいたします。 ';
終了
それ以外の場合
始める
プリント '在庫あり。 ';
終わり
T-SQL によって提供される TRY...CATCH メカニズムは、最新のプログラミング言語 (C# や Java など) に似ており、実行中に例外をキャプチャしてプログラムの異常な中断を防ぐことができます。
試してみましょう
-- 実行しようとするコード
INSERT INTO Sales (OrderID、ProductID、数量)
値 (1001, 'P01', -5); -- これにより制約エラーがトリガーされると仮定します。
終了トライ
捕獲を開始する
-- エラー発生時の対応
選択
ERROR_NUMBER() AS エラー番号、
ERROR_MESSAGE() AS エラーメッセージ、
ERROR_SEVERITY() AS 重大度;
--ロールバックトランザクション
IF @@TRANCOUNT > 0
トランザクションのロールバック。
エンドキャッチ
nameフィールドの値は一意です。nameフィールドの長さは、長すぎてパフォーマンスに影響を与えることを避けるために適度な長さにします。プロファイル タイプ データ テーブルなど:
CREATE TABLE config_types (
name VARCHAR(50) PRIMARY KEY,
description TEXT
);
INSERT INTO config_types (name, description) VALUES ('general', 'General settings');
SELECT * FROM config_types WHERE name = 'general';
このテーブルには、すべての「動物」の共通属性が格納されます。
| フィールド名 | データ型 | 説明する |
|---|---|---|
| id | INT | 動物の一意の識別子 |
| species | VARCHAR(50) | 動物の種類 |
| age | INT | 動物の年齢 |
このテーブルは動物テーブルの ID を継承し、「猫」の一意の属性を格納します。
| フィールド名 | データ型 | 説明する |
|---|---|---|
| id | INT | 動物テーブルのIDに対応します |
| breed | VARCHAR(50) | 猫の品種 |
| favorite_food | VARCHAR(50) | 猫の好きな食べ物 |
CREATE TABLE animal (
id INT PRIMARY KEY AUTO_INCREMENT,
species VARCHAR(50) NOT NULL,
age INT NOT NULL
);
CREATE TABLE cat (
id INT PRIMARY KEY,
breed VARCHAR(50),
favorite_food VARCHAR(50),
FOREIGN KEY (id) REFERENCES animal(id)
);
INSERT INTO animal (species, age) VALUES ('Cat', 3);
INSERT INTO cat (id, breed, favorite_food) VALUES (1, 'Siamese', 'Fish');
| 動物ID | タイプ | 年 |
|---|---|---|
| 1 | Cat | 3 |
| 動物ID | バラエティ | 食べ物が大好き |
|---|---|---|
| 1 | Siamese | Fish |
この例では、animalテーブルにはすべての動物の共通属性が保存され、catテーブルには猫の固有の属性が保存されます。catテーブルの中でid参考ですanimal表形式id、これが継承関係であることを示します。
SELECT * FROM animal;
このクエリは、動物テーブルから継承された共通属性を含む、すべての猫に関する完全な情報を返します。
SELECT animal.id, animal.species, animal.age, cat.breed, cat.favorite_food
FROM animal
JOIN cat ON animal.id = cat.id;
SELECT * FROM animal WHERE id = 1;
SELECT animal.id, animal.species, animal.age, cat.breed, cat.favorite_food
FROM animal
JOIN cat ON animal.id = cat.id
WHERE cat.breed = 'Siamese';
これらのクエリの例では、JOIN意思animalテーブルとcatテーブルを結合して、猫に関する完全な情報を取得します。このアプローチにより、クエリ結果には継承されたプロパティと一意のプロパティの両方が含まれるようになります。
FOREIGN KEY (外部キー) は、2 つのデータ テーブル間の関連付けを確立し、データの参照整合性を保証するために使用されます。たとえば、あるデータ テーブルのフィールド値は、別のデータ テーブルの主キーまたは一意の値を参照する必要があります。
CREATE TABLE サブテーブル (
フィールド名データ型、
FOREIGN KEY (外部キー フィールド) REFERENCES 親データ テーブル (主キー フィールド)
);
注文と顧客などの 1 対多の関係を確立します。
-- Create parent data table (customers)
CREATE TABLE の顧客 (
customer_id INT PRIMARY KEY,
名前 VARCHAR(50)
);
-- サブテーブル (注文) を作成し、外部キーを設定します。
CREATE TABLE 注文 (
order_id INT PRIMARY KEY,
customer_id INT、
order_date DATE、
外部キー (customer_id) REFERENCES 顧客 (customer_id)
);
PRIMARY KEYまたはUNIQUE。ON DELETE行動。通り抜けることができるON DELETEそしてON UPDATE外部キーの動作を指定します。
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
CASCADE: サブデータテーブル内の関連データを同期的に削除または更新します。SET NULL: サブデータ テーブルの外部キー フィールドを次のように設定します。NULL。RESTRICT: 削除または更新を禁止します。デフォルトの動作です。NO ACTION:そしてRESTRICT同様に、制約チェックを延期します。MySQL では、次を使用できます。COMMENTフィールドにメモを追加します。
CREATE TABLE ユーザー (
id INT PRIMARY KEY COMMENT 'ユーザー固有の識別コード',
name VARCHAR(50) COMMENT 'ユーザー名',
age INT COMMENT 'ユーザーの年齢'
);
CREATE TABLE ユーザー (
id INT 主キー、
名前 VARCHAR(50)、
ageINT
) COMMENT = 'ユーザー情報テーブル';
フィールドのコメントは、次の構文を使用してクエリできます。
SHOW FULL COLUMNS FROM users;
ALTER TABLE users MODIFY COLUMN name VARCHAR(50) COMMENT '変更されたコメント';
COMMENT, しかし、SQLite はそれをサポートしていません。COMMENT ON命令。列のコメント users.name は 'ユーザー名';
SQLクエリにおいて、フィールド名がデータベースシステムの予約語(キーワード)と競合する場合、構文エラーが発生します。この問題に対処するには、予防と解決の両面から総合的に検討する必要があります。
これは最も推奨されるアプローチであり、問題の原因を取り除くことを目的としています。
intervalに変更しますtime_interval、意思rankに変更しますuser_rank。予約語の使用が避けられない場合 (たとえば、既存のデータベース構造を操作する場合)、フィールド名を適切な引用符で囲んで、これが SQL コマンドではなく識別子であることを SQL エンジンに明確に通知する必要があります。
| データベースシステム | 引用符 | 例 |
|---|---|---|
| MySQL / MariaDB | バッククォート (`) |
SELECT `interval`, `time` FROM table; |
| PostgreSQL / Oracle | 二重引用符 (") |
SELECT "interval", "time" FROM table; |
| SQL Server | 角括弧 ([]) |
SELECT [interval], [time] FROM table; |
Python などのプログラミング言語では、SQL ステートメントを動的に生成する必要がある場合、生成されたステートメントが安全で正しいことを確認するために引用符を自動的に実行する関数を実装する必要があります。
\b) フィールド名を正確に一致させ、文字列値や長い名前を誤って置き換えるのを防ぎます。ORM (SQLAlchemy や Django ORM など) を使用する場合、フレームワークは異なるデータベース間の予約語と引用符の違いを自動的に処理し、基礎となる SQL 出力を抽象化します。これにより、開発作業が大幅に簡素化され、コードの安定性が向上します。
2 つの DATETIME フィールド間の時間差を秒単位で計算します。
SELECT * FROM table_name
WHERE TIMESTAMPDIFF(SECOND, datetime_column1, datetime_column2) < 5;
順序の影響を避けるために、時間差が絶対値であることを確認してください。
SELECT * FROM table_name
WHERE ABS(TIMESTAMPDIFF(SECOND, datetime_column1, datetime_column2)) < 5;
同じ日かどうかだけを比較したい場合は、DATEDIFF を使用できます。
SELECT * FROM table_name
WHERE DATEDIFF(datetime_column1, datetime_column2) = 0;
MySQL など、タイムスタンプ操作をサポートするデータベースに適用されます。
SELECT * FROM table_name
WHERE ABS(UNIX_TIMESTAMP(datetime_column1) - UNIX_TIMESTAMP(datetime_column2)) < 5;
あなたが提供した値1763251200000標準の **ミリ秒タイムスタンプ** (ミリ秒単位の Unix エポック時間)。
MySQL 組み込み関数 (FROM_UNIXTIME) デフォルトの処理は **第 2 レベルのタイムスタンプ ** です。したがって、使用する前にミリ秒のタイムスタンプを秒に変換する必要があります。
ミリ秒の値を $1000$ で割って、MySQL 関数に必要な第 2 レベルのタイムスタンプを取得します。
1763251200000 / 1000 = 1763251200
使用FROM_UNIXTIME()第 2 レベルのタイムスタンプを標準の MySQL に変換する関数DATETIME形式:
SELECT FROM_UNIXTIME(1763251200000 / 1000);
MySQL のバージョンがミリ秒をサポートしており、結果でミリ秒の精度を維持したい場合は、2 番目のパラメータを使用できます。
SELECT FROM_UNIXTIME(1763251200000 / 1000, '%Y-%m-%d %H:%i:%s.%f');
で:
%Y-%m-%d %H:%i:%s標準の日付と時刻の形式です。%fマイクロ秒をキャプチャするため、残りのミリ秒を小数として渡す必要があります。ミリ秒値を整数に保存することが目的の場合 (例:INTまたはBIGINT) フィールドを第 2 レベルのタイムスタンプとして使用する場合は、単純な除算演算のみが必要です。
SELECT 1763251200000 / 1000;
または、データがテーブル フィールドに保存されている場合 (たとえば、フィールドの名前はtimestamp_ms):
SELECT timestamp_ms / 1000 AS unix_timestamp_s FROM your_table;
この値を何かに挿入すると、DATETIMEまたはTIMESTAMPタイプフィールドに入力する必要がありますVALUES部分的に変換を実行します。
INSERT INTO your_table (datetime_column)
VALUES (FROM_UNIXTIME(1763251200000 / 1000));
FROM_UNIXTIME()この関数は、UTC タイムスタンプを MySQL サーバーに構成されたタイムゾーンに変換します。タイムスタンプが UTC に基づいており、結果も UTC にしたい場合は、サーバーまたは接続のタイムゾーンが正しく設定されていることを確認するか、次のコマンドを使用する必要があります。CONVERT_TZ関数は明示的なタイムゾーン処理を実行します。
MySQL では、使用しますFORMAT()浮動小数点数をフォーマットします。
SELECT FORMAT(123.4567, 2); -- 結果: '123.46'
ROUND()固定の小数点以下の桁数に四捨五入するために使用されます。
SELECT ROUND(123.4567, 2); -- 結果: 123.46
FLOAT を DECIMAL に変換して、小数点以下の桁数を固定します。
SELECT CAST(123.4567 AS DECIMAL(10,2)); -- 結果: 123.46
SELECT CONVERT(123.4567, DECIMAL(10,2)); -- 結果: 123.46
SELECT id, FORMAT(price, 2) AS formatted_price FROM products;
データテーブル作成時に小数点以下の桁数を直接設定できます。
CREATE TABLE 製品 (
id INT 主キー、
価格 DECIMAL(10,2) -- 小数点以下 2 桁
);
フィールドの最大値を取得します。
SELECT MAX(price) AS max_price FROM products;
フィールドの最小値を取得します。
SELECT MIN(price) AS min_price FROM products;
フィールドの平均を計算します。
SELECT AVG(price) AS avg_price FROM products;
SELECT
MAX(price) AS max_price,
MIN(price) AS min_price,
AVG(price) AS avg_price
FROM products;
SELECT category,
MAX(price) AS max_price,
MIN(price) AS min_price,
AVG(price) AS avg_price
FROM products
GROUP BY category;
別のクエリ結果の最大値を見つけます。
SELECT MAX(price) FROM (SELECT price FROM products WHERE category = 'electronics') AS subquery;
ソート後の最大値を取得します。
SELECT price FROM products WHERE category = 'electronics' ORDER BY price DESC LIMIT 1;
WITH filtered_products AS (
SELECT price FROM products WHERE category = 'electronics'
)
SELECT MAX(price) FROM filtered_products;
幾何平均の計算式:
GM = (x1 * x2 * ... * xn)^(1/n)
SQL では、対数演算を使用して幾何平均を計算できます。
SELECT EXP(AVG(LOG(price))) AS geometric_mean FROM products WHERE price > 0;
使用POWER()n 乗根を計算します。
SELECT POWER(EXP(SUM(LOG(price))), 1 / COUNT(price)) AS geometric_mean
FROM products WHERE price > 0;
LOG()エラーの原因となります。SELECT EXP(AVG(LOG(price))) AS geometric_mean FROM products WHERE price > 0;
MySQL/MariaDB では、次を使用できます。STDDEV()標準偏差を計算します。
SELECT STDDEV(salary) AS salary_stddev FROM employees;
SQL では、標準偏差を計算する 2 つの方法が提供されています。
STDDEV_POP()- 母集団の標準偏差を計算します (母集団標準偏差)STDDEV_SAMP()- サンプルの標準偏差を計算します (サンプル標準偏差)SELECT
STDDEV_POP(salary) AS population_stddev,
STDDEV_SAMP(salary) AS sample_stddev
FROM employees;
SQLのバージョンが対応していない場合STDDEV()、次の式を使用できます。
SELECT SQRT(
SUM(POW(salary - (SELECT AVG(salary) FROM employees), 2)) / COUNT(salary)
) AS salary_stddev
FROM employees;
STDDEV()標準偏差は直接計算できます。STDDEV_POP()親の標準偏差を計算し、STDDEV_SAMP()サンプルの標準偏差を計算します。SQLWHERE句はテーブルから抽出するために使用されます指定した条件を満たすレコードを抽出する(列/行)。これは、データ操作言語 (DML) の最も基本的かつ重要な部分の 1 つであり、必要なデータを正確にフィルターするために使用されます。
WHEREこの句は、データベースがテーブルを読み取るときに行 (Row) ごとに評価されます。ある行のデータが満たした場合のみWHERE行は、次の条件が満たされる場合にのみ結果セットに含まれます。SELECT, UPDATE, DELETESQLコマンドと一緒に使用します。WHERE通常は条項が続きますFROM句の後:
SELECT column_name(s)
FROM table_name
WHERE condition;
または、情報を変更または削除するために使用される場合:
UPDATE table_name
SET column1 = value1
WHERE condition;
WHERE演算子は条件を確立するために句で使用されます。最も一般的なものは次のとおりです。
| オペレーターの種類 | オペレーター | 説明する |
|---|---|---|
| 比較演算子 | = |
等しい |
| 比較演算子 | >, <, >=, <= |
より大きい、より小さい、以上、以下 |
| 比較演算子 | <>または!= |
等しくない |
| 論理演算子 | AND |
複数の条件を同時に満たす |
| 論理演算子 | OR |
いずれかの条件を満たしている |
| 論理演算子 | NOT |
条件が満たされていません |
| 特殊な演算子 | BETWEEN |
一定の範囲内(境界を含む) |
| 特殊な演算子 | LIKE |
あいまい一致文字列パターン (一致%または_) |
| 特殊な演算子 | IN |
値はリスト内の任意の項目です |
| 特殊な演算子 | IS NULL / IS NOT NULL |
フィールド値が NULL かどうか |
というファイルがあるとします。Employeesテーブルを含むEmployeeID, LastName(姓)、Salary(給料)とDepartment(部門)。
部門「営業」を持つすべての従業員を検索します。
SELECT EmployeeID, LastName
FROM Employees
WHERE Department = 'Sales';
給与が 50,000 以上で、部門が「HR」ではない従業員を検索します。
SELECT *
FROM Employees
WHERE Salary >= 50000 AND Department != 'HR';
給与が 60,000 ~ 80,000 (両端を含む) の従業員を検索します。
SELECT *
FROM Employees
WHERE Salary BETWEEN 60000 AND 80000;
「マーケティング」または「財務」部門の従業員を検索します。
SELECT *
FROM Employees
WHERE Department IN ('Marketing', 'Finance');
これは次の使用と同等です。WHERE Department = 'Marketing' OR Department = 'Finance'。
SQLGROUP BY条項は以下に使用されますSELECTステートメントでは、同じ値 (または複数のフィールドの値の組み合わせ) を持つ行が集計列にグループ化されます。 SQLでよく使われますサマリー機能各グループの集計値を計算するために一緒に使用されます。
GROUP BY中心的な機能は、テーブル内の同じ値を持つ複数の単一行を単一のグループ (グループ) にマージすることです。COUNT()、SUM()、AVG()、MAX()またはMIN()集計関数と組み合わせると、テーブル全体ではなくグループごとに集計統計を計算できます。GROUP BY句が含まれている必要がありますWHERE条項、ただしその後HAVINGそしてORDER BY句の前。
SELECT 列名、集計関数(集計対象の列)
FROM テーブル名
WHEREcondition_on_rows -- (オプション) グループ化する前に単一の行をフィルタリングします。
GROUP BY column_name(s) -- グループ化に使用する列を指定します。
HAVINGcondition_on_groups -- (オプション) グループ化後のフィルターグループ
ORDER BY 列名;
重要なルール:に登場するものすべてSELECTリストにはありますが、いいえ集計関数で囲まれた列は、しなければならないに含まれるGROUP BY条項で。
というファイルがあるとします。Productsテーブルを含むCategory(製品カテゴリー)とPrice(価格)。
SELECT Category, AVG(Price) AS AveragePrice, COUNT(ProductID) AS TotalProducts
FROM Products
GROUP BY Category;
GROUP BY Category: ディレクティブデータベースはすべて同じになりますCategory値の行グループ化。AVG(Price):各グループ(各カテゴリー)の全商品価格の平均を計算します。COUNT(ProductID):各グループ(各カテゴリ)の製品の合計数量を計算します。複数のフィールドに基づいてグループ化できます。指定されたすべてのフィールドが同じ値を持つ場合にのみ、行がグループ化されます。
SELECT Category, Supplier, SUM(SalesAmount) AS TotalSales
FROM SalesRecords
GROUP BY Category, Supplier
ORDER BY Category, Supplier;
これにより、各行が一意のカテゴリとサプライヤーの組み合わせの合計売上高を表す結果が生成されます。
| 関数 | 関数 |
|---|---|
COUNT() |
グループ内の行数を数えます。 |
SUM() |
グループ内の数値フィールドの合計を計算します。 |
AVG() |
グループ内の数値フィールドの平均を計算します。 |
MAX() |
グループ内のフィールドの最大値を見つけます。 |
MIN() |
グループ内のフィールドの最小値を見つけます。 |
SQLでは、HAVING句はグループ (Group) の結果をフィルタリングするために使用され、通常は次のオプションとともに使用されます。GROUP BY句は一緒に使用されます。
それでもWHERE句は単一列 (Rows) の行をフィルタリングするために使用されますが、グループベースの集計値が必要な場合に便利です (例:COUNT(), SUM(), AVG()集計関数の結果を待ってグループをフィルタリングする場合は、次を使用する必要があります。HAVING句。
| 特徴 | WHERE句 | HAVING 句 |
|---|---|---|
| 実行タイミング | データをグループ化する前に元の行をフィルター処理します (GROUP BY)。 | データをグループ化 (GROUP BY) した後、要約されたグループをフィルターします。 |
| 利用可能な条件 | 集計関数 (COUNT、SUM、AVG など) を直接使用することはできません。 | フィルター条件を設定するには、集計関数を使用する必要があります。 |
| アプリケーションオブジェクト | 単一列の値。 | グループの結果。 |
SELECT 列名、集計関数(列名)
FROM テーブル名
WHEREcondition_on_rows -- (オプション) 単一行をフィルタリングします。
GROUP BY 列名
HAVINGcondition_on_groups -- (必須) フィルター グループ
ORDER BY 列名;
というファイルがあるとします。Ordersテーブルを含むCustomerID(顧客ID)とTotalAmount(ご注文の合計金額)。私たちはすべてを知りたいのです平均注文金額が500件を超える顧客の。
SELECT CustomerID, AVG(TotalAmount) AS AverageOrder
FROM Orders
GROUP BY CustomerID
HAVING AVG(TotalAmount) > 500;
GROUP BY CustomerID: すべての注文を顧客 ID ごとにグループ化します。AVG(TotalAmount): 顧客ごとの平均注文金額を計算します。HAVING AVG(TotalAmount) > 500:フィルター条件です。これは SQL に平均注文金額のみを表示するように指示します (つまり、AVG(TotalAmount)結果) 500** を超えるグループ (顧客) の場合。合計注文数が **3** で、平均注文金額が 1000** 未満であるすべての顧客を検索するとします。
SELECT CustomerID, COUNT(OrderID) AS TotalOrders, AVG(TotalAmount) AS AverageOrder
FROM Orders
GROUP BY CustomerID
HAVING COUNT(OrderID) >= 3 AND AVG(TotalAmount) < 1000;
HAVING COUNT(OrderID) >= 3: 注文の合計が 3 件未満の顧客グループをフィルターで除外します。AND AVG(TotalAmount) < 1000: 平均注文金額が 1,000 以上の顧客グループも除外します。存在するSELECTクエリ内で (定義されている場合)expr1 AS field1、入ってますか?expr2で使用されるfield1?
SQL の実行順序により、別名を同じに置くことができないことが決まります。SELECT内部的に再度引用:
製品から価格 * 1.1 AS new_price、new_price + 10 AS Final_price を選択します。 - エラー
Unknown column 'new_price' in 'field list'
サブクエリで最初に計算できますnew_price、外側のクエリで参照されます。
SELECT new_price, new_price + 10 AS final_price
FROM (SELECT price * 1.1 AS new_price FROM products) AS subquery;
SQL が共通テーブル式 (CTE) をサポートしている場合に使用可能WITH単純化すると次のようになります。
WITH cte AS (
SELECT price * 1.1 AS new_price FROM products
)
SELECT new_price, new_price + 10 AS final_price FROM cte;
単純な操作であれば、直接計算を繰り返すこともできます (ただし、可読性が低いためお勧めしません)。
SELECT price * 1.1 AS new_price, price * 1.1 + 10 AS final_price FROM products;
SELECTクエリ内でエイリアスを参照します。WITH)を解決します。JOIN は、複数のデータ テーブルの関連データをマージし、特定のフィールド (通常は外部キー) に基づいて関係を確立するために使用されます。
2 つのデータ テーブルの条件を満たすデータのみが返されます。
SELECT orders.order_id, customers.name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
左側のテーブルのすべてのデータを返します。右の表に該当するデータがない場合は表示されます。NULL。
SELECT customers.name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
右のテーブル内のすべてのデータを返します。左の表に該当するデータがない場合は表示されます。NULL。
SELECT customers.name, orders.order_id
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;
左右のテーブルのすべてのデータを返し、一致するものがない場合はそれを表示します。NULL。
MySQL は FULL JOIN をサポートしていませんが、利用可能ですLEFT JOINそしてRIGHT JOIN組み合わせシミュレーション。
SELECT customers.name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id
UNION
SELECT customers.name, orders.order_id
FROM customers
RIGHT JOIN orders ON customers.customer_id = orders.customer_id;
2 つのテーブルの可能なすべての組み合わせ (デカルト積) を返します。
SELECT customers.name, products.product_name
FROM customers
CROSS JOIN products;
従業員の上下関係など、同じテーブル内の関連付けに使用されます。
SELECT A.name AS employee, B.name AS manager
FROM employees A
JOIN employees B ON A.manager_id = B.employee_id;
-- abc.sql SOURCE other_file.sql; SOURCE another_file.sql;
-- abc.sql \i other_file.sql \i another_file.sql
#!/bin/bash mysql -u user -p database_name < abc.sql mysql -u user -p database_name < other_file.sql
cat abc.sql other_file.sql another_file.sql > combined.sql mysql -u user -p database_name < combined.sql
SET @param1 = 'value1'; SOURCE other_file.sql;2. `other_file.sql` 内の変数を参照します。
SELECT * FROM table WHERE column = @param1;
\set param1 'value1' \i other_file.sql2. `other_file.sql` で変数を使用します。
SELECT * FROM table WHERE column = :'param1';
sed "s/{param1}/value1/g" abc.sql | mysql -u user -p database_name
2. SQL ファイル内でプレースホルダー `{param1}` を使用し、コマンド ライン ツールに置き換えます。psql -d database_name -v param1=value1 -f abc.sql2. SQL ファイル内の変数を表すには、`:'param1'` を使用します。
ストアド プロシージャ (ストアド ルーチンまたはストアド プロシージャ) は、事前にコンパイルされてデータベースに保存される一連の SQL ステートメントであり、呼び出しを通じて実行できるため、効率が向上し、コードの重複が削減されます。
DELIMITER //
CREATE PROCEDURE GetAllProducts()
BEGIN
SELECT * FROM products;
END //
DELIMITER ;
CALL GetAllProducts();
特定のカテゴリの製品を検索します。
DELIMITER //
CREATE PROCEDURE GetProductsByCategory(IN category_name VARCHAR(50))
BEGIN
SELECT * FROM products WHERE category = category_name;
END //
DELIMITER ;
電話:
CALL GetProductsByCategory('electronics');
カテゴリ内のアイテムの総数を計算します。
DELIMITER //
CREATE PROCEDURE GetProductCountByCategory(IN category_name VARCHAR(50), OUT total_count INT)
BEGIN
SELECT COUNT(*) INTO total_count FROM products WHERE category = category_name;
END //
DELIMITER ;
電話:
CALL GetProductCountByCategory('electronics', @count);
SELECT @count;
DELIMITER //
CREATE PROCEDURE CalculateTotalRevenue()
BEGIN
DECLARE total DECIMAL(10,2);
SELECT SUM(price) INTO total FROM sales;
SELECT total AS total_revenue;
END //
DELIMITER ;
電話:
CALL CalculateTotalRevenue();
DELIMITER //
CREATE PROCEDURE CheckStock(IN product_id INT, OUT stock_status VARCHAR(20))
BEGIN
DECLARE stock INT;
SELECT quantity INTO stock FROM inventory WHERE id = product_id;
IF stock > 10 THEN
SET stock_status = 'In Stock';
ELSEIF stock > 0 THEN
SET stock_status = 'Low Stock';
ELSE
SET stock_status = 'Out of Stock';
END IF;
END //
DELIMITER ;
電話:
CALL CheckStock(1, @status);
SELECT @status;
DELIMITER //
CREATE PROCEDURE CountDown(IN start_num INT)
BEGIN
DECLARE i INT;
SET i = start_num;
loop_label: LOOP
IF i <= 0 THEN
LEAVE loop_label;
END IF;
SELECT i;
SET i = i - 1;
END LOOP;
END //
DELIMITER ;
電話:
CALL CountDown(5);
DROP PROCEDURE IF EXISTS GetAllProducts;
DELIMITERSQL 構文の競合を回避します。MySQL および MariaDB では、ストアド プロシージャのパラメータを直接デフォルト値に設定できません (SQL Server や PostgreSQL とは異なります)。ただし、使用することは可能ですIFプリセット値をシミュレートする条件文。
クエリを実行したいとします。usersテーブル、パラメータの場合user_id指定しない場合、デフォルトのクエリ ID は 1 です。
区切り文字 //
CREATE PROCEDURE GetUserById(IN user_id INT)
始める
user_id が NULL の場合
SET user_id = 1; --デフォルト値
終了 IF;
SELECT * FROM ユーザー WHERE id = user_id;
終了 //
区切り文字;
CALL GetUserById(NULL); -- ID = 1 をクエリします
CALL GetUserById(5); -- クエリ ID = 5
COALESCE()パラメータが NULL の場合、指定されたデフォルト値を返します。
DELIMITER //
CREATE PROCEDURE GetUserById(IN user_id INT)
BEGIN
SELECT * FROM users WHERE id = COALESCE(user_id, 1);
END //
DELIMITER ;
CALL GetUserById(NULL); -- デフォルトは 1 です
CALL GetUserById(10); -- クエリ ID = 10
パラメーターをオプションにしたい場合は、複数のストアド プロシージャを作成できます。例えば:
DELIMITER //
CREATE PROCEDURE GetAllUsers()
BEGIN
SELECT * FROM users;
END //
CREATE PROCEDURE GetUserById(IN user_id INT)
BEGIN
SELECT * FROM users WHERE id = user_id;
END //
DELIMITER ;
CALL GetAllUsers(); -- パラメーターなし、すべてをクエリします
CALL GetUserById(3); -- クエリ ID = 3
DEFAULT価値。IFまたはCOALESCE()アナログのデフォルト。MySQL/MariaDBのストアドプロシージャはサポートされていませんRETURNクエリ結果を返しますが、使用できますOUTパラメータは値を返します。
DELIMITER //
CREATE PROCEDURE GetUserCount(OUT user_count INT)
BEGIN
SELECT COUNT(*) INTO user_count FROM users;
END //
DELIMITER ;
CALL GetUserCount(@total);
SELECT @合計; -- ユーザー数を表示
クエリ結果を直接返したい場合は、SELECTそれでおしまい:
DELIMITER //
CREATE PROCEDURE GetUserById(IN user_id INT)
BEGIN
SELECT * FROM users WHERE id = user_id;
END //
DELIMITER ;
CALL GetUserById(5); -- ID 5 のユーザーをクエリします。
MySQL はサポートしていますが、RETURNですが、返すことができるのは 1 つの値のみで、通常はプロセスを制御するために使用されます。
区切り文字 //
プロシージャの作成 GetMaxSalary()
始める
DECLARE max_salary DECIMAL(10,2);
SELECT MAX(salary) INTO max_salary FROM 従業員;
max_salary を返します。 -- ただし、これは MySQL に値を直接返しません。
終了 //
区切り文字;
CALLRETURN 値を取得するには、OUT パラメータを使用することをお勧めします。DELIMITER //
CREATE PROCEDURE GetMaxSalary(OUT max_salary DECIMAL(10,2))
BEGIN
SELECT MAX(salary) INTO max_salary FROM employees;
END //
DELIMITER ;
CALL GetMaxSalary(@max);
SELECT @max; -- 最高給与を表示します
複数使用するOUTパラメーターはさまざまな計算結果を返します。
DELIMITER //
CREATE PROCEDURE GetUserStats(OUT total_users INT, OUT avg_age DECIMAL(5,2))
BEGIN
SELECT COUNT(*) INTO total_users FROM users;
SELECT AVG(age) INTO avg_age FROM users;
END //
DELIMITER ;
CALL GetUserStats(@total, @avg);
@合計、@平均を選択します。 -- ユーザーの総数と平均年齢を表示します
OUTパラメータ。SELECT。OUTパラメータ。RETURNクエリ結果を返すことは、プロセス制御にのみ適用されます。MySQL ストアド プロシージャには次の方法でアクセスできます。OUTパラメータは値を返します。これは CALL の外部で使用できます。SELECTこの値を取得します。
DELIMITER //
CREATE PROCEDURE GetTotalUsers(OUT total_users INT)
BEGIN
SELECT COUNT(*) INTO total_users FROM users;
END //
DELIMITER ;
CALL GetTotalUsers(@total);
SELECT @total AS UserCount; -- CALL の外で戻り値を使用する
ストアド プロシージャが使用する場合SELECT返された結果を変数に直接保存することはできませんが、変数を使用することはできます。INSERT INTO ... SELECT。
DELIMITER //
CREATE PROCEDURE GetMaxSalary()
BEGIN
SELECT MAX(salary) AS max_salary FROM employees;
END //
DELIMITER ;
一時テーブルを作成します temp_result (max_salary DECIMAL(10,2));
INSERT INTO temp_result EXECUTE GetMaxSalary();
temp_result から max_salary を選択します。 -- CALL 以外で使用される
ストアド プロシージャによって生成された結果に変数でアクセスする必要がある場合は、次のように使用できます。PREPAREそしてEXECUTE。
DELIMITER //
CREATE PROCEDURE GetUserById(IN user_id INT)
BEGIN
SELECT name FROM users WHERE id = user_id;
END //
DELIMITER ;
SET @sql = 'CALL GetUserById(5)';
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
OUTパラメータは、渡されたリーフレット内の単一の値を返します。@変数アクセス。INSERT INTO ... CALLステージング テーブルに保存します。PREPAREそしてEXECUTE。MySQL/MariaDBではストアドファンクション(関数)を返すことができませんSELECT結果セット。それ以外の場合はエラーが発生します。
ERROR 1415 (0A000): Not allowed to return a result set from a function
関数は結果セットを返すことができませんが、ストアド プロシージャは結果セットを返すことができます。
区切り文字 //
関数の作成 GetUsers()
返品表
始める
RETURN (ユーザーから * を選択); -- これは許可されていません
終了 //
区切り文字;
DELIMITER //
CREATE PROCEDURE GetUsers()
BEGIN
SELECT * FROM users;
END //
DELIMITER ;
CALL GetUsers();
単一の値 (カウントや最大値など) のみを返す必要がある場合は、次のように使用できます。RETURN。
DELIMITER //
CREATE FUNCTION GetUserCount()
RETURNS INT DETERMINISTIC
BEGIN
DECLARE total INT;
SELECT COUNT(*) INTO total FROM users;
RETURN total;
END //
DELIMITER ;
SELECT GetUserCount();
関数内で複数行の結果を返す必要がある場合は、関数で一時テーブルにデータを挿入し、それを外部からクエリすることができます。
DELIMITER //
CREATE FUNCTION PopulateTempUsers()
RETURNS INT DETERMINISTIC
BEGIN
CREATE TEMPORARY TABLE IF NOT EXISTS temp_users AS (SELECT * FROM users);
RETURN 1;
END //
DELIMITER ;
SELECT PopulateTempUsers();
SELECT * FROM temp_users;
RETURN。HeidiSQL は、MySQL、MariaDB、PostgreSQL、MS SQL Server をサポートする無料のオープンソース SQL クライアントです。データベースの管理、SQL クエリの実行、データのインポート/エクスポートなどを行うための GUI を提供します。
1. 公式 Web サイトにアクセスして HeidiSQL をダウンロードします。https://www.heidisql.com/download.php2. インストーラーを実行し、指示に従ってインストールを完了します
3. HeidiSQL を開いて新しい接続をセットアップします
1.HeidiSQLを起動する
2.「追加」をクリックして新しい接続を作成します
3. 設定:
- ホスト名/IP: 127.0.0.1 またはリモートサーバー IP
- ユーザー名: root または他のユーザー
- パスワード: 対応するパスワード
- ポート: 3306 (MySQL/MariaDB)
4. 「開く」をクリックしてデータベースに接続します。
HeidiSQL クエリ ウィンドウに SQL ステートメントを入力します。
SELECT * FROM users WHERE status = 'active';
「実行」ボタンをクリックして結果を表示します。
1.データベースを右クリック→「SQLのエクスポート」を選択します。
2. エクスポートするデータテーブルを選択します
3. エクスポート形式を設定します (.sql、.csv、.json)
4.「エクスポート」をクリックします。
1. HeidiSQL を開き、ターゲット データベースを選択します
2.「ツール」→「SQLファイルの実行」をクリックします。
3. .sql ファイルを選択して実行します。
1.「ツール」→「ユーザー権限の管理」と入力します。
2. 管理するユーザーを選択します
3. データベース権限を設定します (SELECT、INSERT、UPDATE、DELETE など)。
4.「保存」をクリックします。
1. HeidiSQL を起動します。
2. MySQL サーバーまたは MariaDB サーバーに接続します。
3. 左側のデータベースリストからターゲットデータベースを選択します。
1. 左側のデータベース名を右クリックし、「新規作成」→「プログラムの保存」を選択します。
2. HeidiSQL は新しい SQL 編集ウィンドウを開き、デフォルトのストアド プロシージャ テンプレートを提供します。
以下は、users テーブル内のすべてのデータを返す簡単な例です。
DELIMITER //
CREATE PROCEDURE GetAllUsers()
BEGIN
SELECT * FROM users;
END //
DELIMITER ;
1. [実行] ボタン (緑色の稲妻) をクリックします。
2. 実行が成功すると、左側の「プログラムの保存」列にプログラムが表示されます。
CALL GetAllUsers();
ユーザー ID に基づくクエリなど、データをフィルタリングするパラメータを渡します。
DELIMITER //
CREATE PROCEDURE GetUserById(IN user_id INT)
BEGIN
SELECT * FROM users WHERE id = user_id;
END //
DELIMITER ;
パラメータを指定してストアド プロシージャを呼び出します。
CALL GetUserById(1);
DROP PROCEDURE IF EXISTS GetAllUsers;
DELIMITER構文が正しいことを確認してください。CALLストアド プロシージャをテストします。今日のソフトウェア開発環境では、データベース アプリケーションは単純なデータ ストレージから、AI、エッジ コンピューティング、自動化された運用とメンテナンスを統合する包括的なソリューションへと進化しました。現在主流の開発モデルは次のとおりです。
大規模言語モデル (LLM) の人気に伴い、検索拡張生成 (RAG) が開発標準になりました。このタイプのソリューションは、非構造化データのベクトル化と取得に重点を置いています。
運用とメンテナンスを簡素化し、初期コストを削減するために、開発者は自動スケーリング機能を備えたデータベース サービスを選択する傾向があります。これは特に Web アプリケーションで人気があります。
TypeScript エコシステムでは、データベース定義をフロントエンド型と同期させることがシステムの安定性を確保する鍵となります。
グローバル アクセスに対応し、遅延を短縮するために、データをユーザーの近くに展開することがトレンドになっています。
| プランカテゴリー | テクノロジーを代表する | 主な利点 |
|---|---|---|
| AIファースト | pgvector, Milvus | セマンティック検索と知識ベースの構築をサポート |
| サーバーレス型 | Supabase, Vercel Postgres | 負担のない運用と保守、量に応じた料金請求 |
| 効率開発型 | Drizzle ORM, Prisma | 極めて高いタイプの安全性と開発スピード |
| 分散型アーキテクチャ | CockroachDB, TiDB | クロスリージョン展開、自動フォールト トレランス |
最新のデータベース アプリケーション開発では、フロントエンドはもはやデータを提示するだけでなく、バックエンド データベースとの型の同期、状態管理、サーバー側のレンダリング パフォーマンスも重視しています。現在の主流の選択肢は次のとおりです。
これは現在、最高の市場シェアと最も豊富なコミュニティ サポートを持つソリューションであり、特に複雑なデータベース管理システムに適しています。
シンプルな学習曲線と高度に統合されたツール チェーンで知られ、中規模および大企業のバックエンド管理システムに深く愛されています。
開発効率を向上させ、データ送信エラーを減らすために、最新のフロントエンドは次のツールに大きく依存しています。
企業内で使用されるデータベース管理インターフェイスの場合、開発者は多くの場合、より高速な統合ソリューションを選択します。
| スキーム名 | 該当するシナリオ | 主な利点 |
|---|---|---|
| Next.js + Tailwind | SaaS 製品、最新の Web アプリケーション | SEO に配慮した究極のパフォーマンス最適化 |
| Vue + Element Plus | 企業内部のバックエンドおよび管理システム | 豊富なコンポーネントと非常に迅速な開発 |
| TanStack Query | データ更新頻度が高いアプリケーション | 強力なキャッシュ管理と自動同期 |
| Retool | 緊急時の内部メンテナンスツール | ドラッグ&ドロップなのでCSSを書く必要がほとんどありません |
最新のデータベース Web 管理ツールを使用すると、チームはデスクトップ ソフトウェアをインストールすることなく、ブラウザーを介してデータに直接アクセスできます。機能的な位置付けに応じて、以下の 4 つのカテゴリに分類されます。
このタイプのツールは、複数のデータベース接続 (MySQL、PostgreSQL、SQL Server など) をサポートしており、多様な環境を管理する開発者に適しています。
オリジナルのメーカーまたはコミュニティによって特定のデータベース向けに徹底的に最適化された UI。
データベースを Excel に似た直感的なインターフェイスに変換し、技術者以外のユーザーや社内バックエンドの迅速な構築に適しています。
データがクラウド サービス プロバイダーでホストされている場合、通常はネイティブ Web コンソールが最高レベルの統合を実現します。
CloudBeaver は、DBeaver チームによって開発されたオープンソースの Web ベースのデータベース管理ソリューションです。 Java バックエンドと React フロントエンド アーキテクチャを使用して、ユーザーがブラウザを通じてさまざまなデータベースを安全に管理できるようにします。これは、リモート アクセスやチーム コラボレーションが必要なシナリオに非常に適しています。
CloudBeaver は、オープンソースの Community Edition (Community) と商用の Enterprise Edition (Enterprise) を提供します。主な違いは、高度な機能のサポートにあります。
| 特徴 | コミュニティ | エンタープライズ (エンタープライズ) |
|---|---|---|
| SQLデータベースのサポート | 最も主流の SQL をサポート | NoSQL (MongoDB、Redis) を含む |
| クラウドサービスの統合 | 基本的な配線 | AWS、GCP、Azure リソースの参照のネイティブ サポート |
| 認証 | アカウントのパスワード | SSO、SAML、LDAP、Kerberosをサポート |
| 高度なツール | 基本的なクエリ | AIアシスタント(SQL生成)、ビジュアルクエリビルダー |
CloudBeaver の最も推奨されるインストール方法は、必要な Java 環境とドライバーがすべてパッケージ化されている Docker を使用することです。主な展開パスは 3 つあります。
これは最も簡単な方法で、1 行の命令を実行するだけでサービスを開始できます。デフォルトでは、ポート 8978 で待機します。
docker run --name cloudbeaver -d -p 8978:8978 dbeaver/cloudbeaver:latest
実行後、ブラウザ入力を開くhttp://localhost:8978設定ウィザードに入ることができます。
データの永続性は Compose ファイルを通じて簡単に管理でき、コンテナーの再起動後に設定が失われないようにします。
version: '3'
services:
cloudbeaver:
image: dbeaver/cloudbeaver:latest
container_name: cloudbeaver
restart: unless-stopped
ports:
- "8978:8978"
volumes:
- ./cloudbeaver-data:/opt/cloudbeaver/workspace
上記の内容を名前を付けて保存しますdocker-compose.yml、実行しますdocker-compose up -d。
環境で Docker を使用できない場合は、コンパイルされたバイナリ ファイルをダウンロードして手動でインストールできます。
cloudbeaver-ce-latest-linux-x86_64.tar.gz)。tar -xvf cloudbeaver-ce-latest-linux-x86_64.tar.gz。./run-server.sh(Linux/macOS) またはrun-server.bat (Windows)。初めて Web インターフェイスに入ると、システムは次の設定を案内します。
email: [email protected]