プログラミング · 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の推定・実際プランも利用) |