本文へスキップ
Typle
ログイン状態を確認中

プログラミング · SQL Server · T-SQL · SQL

SQL Server T-SQL構文のタイピング練習

SQL Server(2022 以降)の T-SQL 構文45個を、初級・中級・上級の3つのリストで打って覚えます。GO によるバッチの区切り、OFFSET FETCH でのページング、CREATE TABLE と IDENTITY などを練習できます。

3リスト・45語

無料・ログインなしで練習できます。押すとこのパックをフォローし、すぐに練習が始まります。

収録している言葉

SQL Server T-SQL構文(初級)

打つ言葉意味・補足
SELECT @@VERSION;T-SQL / SQL Server:対象環境(SQL Server 2022以降で広く使える主要構文。表・列・権限を準備。Azure各サービスとは一部差がある)
SELECT 1;; / GO / コメント:文・バッチの区切り(GOはSSMS・sqlcmd等のクライアント区切り。SQL文としてドライバーへ送らない)
GO; / GO / コメント:文・バッチの区切り(GOはSSMS・sqlcmd等のクライアント区切り。SQL文としてドライバーへ送らない)
/* コメント */ SELECT 2;; / GO / コメント:文・バッチの区切り(GOはSSMS・sqlcmd等のクライアント区切り。SQL文としてドライバーへ送らない)
DECLARE @age int = 20; SET @age = 21; SELECT @age;DECLARE / SET:変数宣言と代入(補足: @変数の有効範囲はバッチ等)
SELECT N'こんにちは' AS [表示名];N'...' / [識別子]:Unicode文字列・名前の引用(nvarchar向けUnicodeリテラル。識別子と文字列を区別)
SELECT Id, Name FROM dbo.Users WHERE Age >= 20;SELECT / WHERE:行取得
SELECT TOP (10) * FROM dbo.Users ORDER BY Id;TOP:先頭件数(ORDER BYがなければ順番は保証されない)
SELECT * FROM dbo.Users WHERE Email IS NULL;IS NULL / IS NOT NULL:NULL判定(補足: = NULLは使わない。通常比較にNULLがあるとunknown)
SELECT * FROM dbo.Users WHERE Name LIKE N'Po%';LIKE:パターン一致(%は任意長。大文字小文字の扱いは照合順序等に依存)
SELECT DISTINCT Age FROM dbo.Users;DISTINCT:重複排除
DELETE FROM dbo.Orders OUTPUT DELETED.Id WHERE Id = 1;DELETE / OUTPUT:行削除(WHEREなしは全行削除)
TRUNCATE TABLE dbo.Orders;TRUNCATE TABLE:表を空にする(IDENTITYをリセット。外部キー等の制約。全データ削除)
ALTER TABLE dbo.Users ADD Nickname nvarchar(100) NULL;ALTER TABLE:列追加(スキーマ変更のロック等に注意)
SELECT CAST('123' AS int), TRY_CONVERT(int, 'abc');CAST / CONVERT / TRY_CONVERT:型変換(TRY_CONVERTは通常変換失敗でNULL。禁止された変換等はエラー)

SQL Server T-SQL構文(中級)

打つ言葉意味・補足
SELECT * FROM dbo.Users ORDER BY Id OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;ORDER BY / OFFSET FETCH:ページング(一意に並ぶ順序を指定。LIMITは使わない)
SELECT * FROM dbo.Users WHERE Active = 1 AND Age BETWEEN 20 AND 29 AND Id IN (1, 2, 3);AND / OR / IN / BETWEEN:条件の組合せ(BETWEENは両端を含む)
SELECT u.Name, o.Amount FROM dbo.Users u LEFT JOIN dbo.Orders o ON o.UserId = u.Id;INNER JOIN / LEFT JOIN:表を結合(右側をWHEREで絞ると実質内部結合になる場合)
SELECT * FROM dbo.Users u WHERE EXISTS ( SELECT 1 FROM dbo.Orders o WHERE o.UserId = u.Id );EXISTS / NOT EXISTS:関連行の存在
SELECT Id, ROW_NUMBER() OVER ( ORDER BY CreatedAt, Id ) AS RowNo FROM dbo.Users;ROW_NUMBER / OVER:行番号(一意に順序を決める)
SELECT Id, UserId, Amount, SUM(Amount) OVER ( PARTITION BY UserId ) AS Total FROM dbo.Orders;PARTITION BY / SUM OVER:行を残して集計
SELECT Id, LAG(Amount) OVER ( PARTITION BY UserId ORDER BY Id ) AS Previous FROM dbo.Orders;LAG / LEAD:前後の行を参照
ALTER TABLE dbo.Users ADD CONSTRAINT CK_Users_Age CHECK (Age >= 0);CHECK / FOREIGN KEY / UNIQUE:データ制約(CHECKでNULLも拒否したい場合はNOT NULLを併用)
CREATE INDEX IX_Orders_UserId ON dbo.Orders(UserId) INCLUDE (Amount);CREATE INDEX:索引作成(読み取りと更新・容量コストを比較)
CREATE VIEW dbo.ActiveUsers AS SELECT Id, Name FROM dbo.Users WHERE Active = 1;CREATE VIEW:ビュー定義(CREATE VIEWはバッチ先頭等の制約。通常は結果を保存しない)
SELECT SYSUTCDATETIME(), SYSDATETIMEOFFSET(), NEWID();datetime2 / datetimeoffset / uniqueidentifier:日時・UUID(datetime2はタイムゾーンを保持しない)
SELECT CONCAT(Name, N'さん'), LEN(Name), SUBSTRING(Name, 1, 2) FROM dbo.Users;CONCAT / LEN / SUBSTRING:文字列処理(LENは末尾の空白を数えない)
SELECT DATEADD(day, 7, SYSUTCDATETIME()), DATEDIFF(day, '2026-01-01', '2026-01-03');DATEADD / DATEDIFF:日時の加減・境界数(DATEDIFFは単純な経過時間でなく単位境界数)
DECLARE @i int = 0; WHILE @i < 3 BEGIN IF @i = 1 PRINT N'one'; SET @i += 1; END;IF / WHILE / BEGIN END:手続き的制御
EXEC sys.sp_executesql N'SELECT * FROM dbo.Users WHERE Id=@id', N'@id int', @id = 1;sp_executesql:値をパラメーター化した動的SQL(未検証入力をSQL文字列へ連結しない)

SQL Server T-SQL構文(上級)

打つ言葉意味・補足
CREATE TABLE dbo.Users ( Id int IDENTITY(1, 1) PRIMARY KEY, Name nvarchar(100) NOT NULL, Email nvarchar(255) UNIQUE, Age int NULL, Active bit NOT NULL DEFAULT 1, CreatedAt datetime2 NOT NULL DEFAULT SYSUTCDATETIME() ); CREATE TABLE dbo.Orders ( Id int IDENTITY(1, 1) PRIMARY KEY, UserId int REFERENCES dbo.Users(Id), Amount decimal(12, 2) NOT NULL );サンプル表:以下の例の基本表(検証用DB向け。同名表がある場合は失敗 SQL Serverの通常の単一列UNIQUEはNULLも通常1件まで。)
SELECT u.Id, recent.Amount FROM dbo.Users u OUTER APPLY ( SELECT TOP (1) Amount FROM dbo.Orders o WHERE o.UserId = u.Id ORDER BY o.Id DESC ) recent;OUTER APPLY:左行に依存する結果
SELECT COUNT(*) AS CountAll, SUM(Amount) AS Total, AVG(Amount) AS Average FROM dbo.Orders;COUNT / SUM / AVG:件数・合計・平均(COUNT(列)はNULLを除く)
SELECT UserId, SUM(Amount) AS Total FROM dbo.Orders GROUP BY UserId HAVING SUM(Amount) >= 1000;GROUP BY / HAVING:グループ集計
SELECT STRING_AGG(CAST(Name AS nvarchar(max)), N', ') WITHIN GROUP ( ORDER BY Id ) FROM dbo.Users;STRING_AGG:文字列集約(長い結果は入力型の最大長に注意)
;WITH Totals AS ( SELECT UserId, SUM(Amount) AS Total FROM dbo.Orders GROUP BY UserId ) SELECT * FROM Totals;WITH:クエリに名前(前文を;で終える。CTEの直後の1文で使用)
INSERT INTO dbo.Users (Name, Email) OUTPUT INSERTED.Id VALUES (N'Pomo', N'pomo@example.com');INSERT / OUTPUT:追加して結果を返す(INSERTEDは追加後。トリガー等でOUTPUTの制約あり)
UPDATE dbo.Users SET Age = 21 OUTPUT INSERTED.Id, DELETED.Age AS OldAge, INSERTED.Age AS NewAge WHERE Id = 1;UPDATE / OUTPUT:行更新(WHEREなしは全行更新)
UPDATE u SET Active = 1 FROM dbo.Users u JOIN ( SELECT DISTINCT UserId FROM dbo.Orders ) o ON o.UserId = u.Id;UPDATE ... FROM:結合して更新(各対象が複数行に一致する場合の不定性に注意)
DECLARE @n decimal(12, 2) = 123.45, @ok bit = 1, @name nvarchar(100) = N'Pomo'; SELECT @n, @ok, @name;int / decimal / bit / nvarchar:主な型(金額等には正確なdecimalを検討)
SELECT Name, COALESCE(Email, N'未登録'), CASE WHEN Age >= 20 THEN N'成人' ELSE N'その他' END FROM dbo.Users;CASE / COALESCE / NULLIF:条件値・NULL処理
DECLARE @j nvarchar(max) = N'{"name":"Pomo","tags":["sql"]}'; SELECT JSON_VALUE(@j, '$.name'), JSON_QUERY(@j, '$.tags'); SELECT * FROM OPENJSON(@j, '$.tags');JSON_VALUE / JSON_QUERY / OPENJSON:JSONを読む(OPENJSONはDB互換性レベル130以降)
CREATE OR ALTER PROCEDURE dbo.GetUser @Id int AS BEGIN SET NOCOUNT ON; SELECT * FROM dbo.Users WHERE Id = @Id; END;CREATE OR ALTER PROCEDURE:ストアドプロシージャ(専用バッチで実行。呼出はEXEC dbo.GetUser @Id=1)
SET XACT_ABORT ON; BEGIN TRY BEGIN TRANSACTION; UPDATE dbo.Users SET Active = 0 WHERE Id = 1; COMMIT TRANSACTION; END TRY BEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; THROW; END CATCH;TRY CATCH / XACT_ABORT / TRANSACTION:取引と失敗処理(実データ変更。例外の種類・入れ子取引等により詳細が異なる)
SET STATISTICS IO ON; SET STATISTICS TIME ON; SELECT * FROM dbo.Users WHERE Id = 1; SET STATISTICS IO OFF; SET STATISTICS TIME OFF;実行計画・統計:I/O・時間を確認(SELECTを実際に実行。SSMSの推定・実際プランも利用)

ほかの公式パックを見る