Mnoho vývojářů a správců databází vytváří databáze pomocí nástrojů GUI, jako je SQL Server Management Studio (SSMS), Azure Data Studio atd.
Ale může být mnohem rychlejší vytvářet databáze pomocí SQL. To platí zejména v případě, že máte různá prostředí, ve kterých potřebujete znovu vytvořit stejnou databázi. Pro každé prostředí můžete spustit stejný skript a databáze bude pokaždé vytvořena během několika sekund.
V SQL Server to děláme pomocí T-SQL. T-SQL je zkratka pro Transact-SQL a je to rozšíření SQL Serveru k SQL.
Níže je uveden příklad použití T-SQL k vytvoření databáze v SQL Server.
Základní kód
CREATE DATABASE Music;
Toto je veškerý kód, který potřebujete k vytvoření databáze. V tomto případě vytvoří databázi s názvem Hudba .
To je však vše, co vytváří. Databáze neobsahuje žádné tabulky ani jiné objekty. Chcete-li to provést, musíte použít další příkazy k vytvoření těchto objektů podle potřeby.
Také výše uvedený CREATE DATABASE
používá nejzákladnější syntaxi, která neobsahuje žádné argumenty. Existuje mnoho možností, které lze zahrnout do tohoto prohlášení.
Můžete například zadat svůj vlastní název pro soubory a jejich skupiny souborů. Můžete také vytvořit snímek databáze nebo připojit databázové soubory a vytvořit databázi z oddělených souborů jiné databáze.
Úplnou syntaxi tohoto prohlášení naleznete v dokumentaci společnosti Microsoft.
Vytváření tabulek
Zde je příklad vytvoření tří tabulek pro výše uvedenou databázi.
USE Music;
CREATE TABLE Artists (
ArtistId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ArtistName nvarchar(255) NOT NULL,
ActiveFrom date
);
CREATE TABLE Genres (
GenreId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
Genre nvarchar(50) NOT NULL
);
CREATE TABLE Albums (
AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
AlbumName nvarchar(255) NOT NULL,
ReleaseDate date NOT NULL,
ArtistId int NOT NULL,
GenreId int NOT NULL
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId)
REFERENCES dbo.Artists (ArtistId)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
Prvním krokem je přepnutí do správné databáze (v tomto případě do databáze Music). K tomu používáme USE MUSIC
.
Jakmile používáte správnou databázi, můžete vytvářet tabulky a další objekty. V tomto případě jsem vytvořil tři tabulky. Pokaždé, když použiji CREATE TABLE
, následovaný názvem tabulky, kterou chci vytvořit. Poté následuje definice tabulky.
Definice obsahuje sloupce tabulky a jejich definice. Například ArtistId
je sloupec, používá int datový typ a nastavil jsem jej jako primární klíč pro tabulku. Být primárním klíčem znamená, že jedinečně identifikuje každý řádek v databázi.
Tento sloupec jsem také nastavil jako IDENTITY
sloupec, což znamená, že každý řádek použije automaticky vygenerovanou hodnotu, která se zvyšuje s každým řádkem. V tomto případě bude začínat na 1 a bude se zvyšovat o 1 (to proto, že jsem zadal IDENTITY(1,1)
.
Nakonec jsem tento sloupec také nastavil na NOT NULL
. To znamená, že musí obsahovat hodnotu. Nemůže být nulový. Toto je ve skutečnosti požadavek před nastavením sloupce jako primárního klíče, ale můžete také nastavit ostatní sloupce na NOT NULL
podle potřeby (což jsem provedl v tomto příkladu).
Vytvářejte vztahy
Ve výše uvedeném příkladu jsem vytvořil vztah mezi Albums
a Artists
tabulky.
Vztah je druh propojení mezi tabulkami se souvisejícími daty. Vztahy pomáhají prosazovat integritu dat, protože umožňují určit, že sloupec může obsahovat pouze hodnoty, které odpovídají hodnotám v konkrétním sloupci v jiné tabulce.
Zde je konkrétní část kódu z výše uvedeného příkladu, která vytváří vztah:
CREATE TABLE Albums (
AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
AlbumName nvarchar(255) NOT NULL,
ReleaseDate date NOT NULL,
ArtistId int NOT NULL,
GenreId int NOT NULL
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId)
REFERENCES dbo.Artists (ArtistId)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
Vztah jsem vytvořil ve stejnou dobu, kdy jsem vytvořil Albums
stůl. Byl jsem schopen to udělat, protože jsem již vytvořil Artists
tabulka (což je druhá tabulka ve vztahu).
Vztah jsem vytvořil vytvořením omezení cizího klíče (pomocí CONSTRAINT
argument) a zadáním FOREIGN KEY
spolu s detaily vztahu. REFERENCES
klíčové slovo určuje, na kterou tabulku a sloupec cizí klíč odkazuje.
Vztah jsem pojmenoval FK_Albums_Artists
.
ON DELETE
a ON UPDATE
díly jsou volitelné. Určují, co dělat v případě, že někdo odstraní nebo aktualizuje řádek ze sloupce nadřazeného/primárního klíče. Výchozí hodnota je NO ACTION
, což znamená, že Database Engine vyvolá chybu a akce aktualizace na řádku v nadřazené tabulce je vrácena zpět.
Můj článek o tom, jak vytvořit vztah v SQL, uvádí další možnosti, které zde můžete poskytnout, a také to, co každá možnost dělá.
Vytvořte vztahy později
Můžete také vytvořit vztah na existující tabulce.
Chcete-li to provést pomocí T-SQL, použijte ALTER TABLE
prohlášení.
Takže po spuštění předchozího kódu mohu spustit následující kód.
ALTER TABLE Albums
ADD CONSTRAINT FK_Albums_Genres FOREIGN KEY (GenreId)
REFERENCES dbo.Genres (GenreId)
ON DELETE NO ACTION
ON UPDATE NO ACTION
;
Tím se vytvoří další vztah, tentokrát mezi Albums
a Genres
tabulky.
Můžete vidět, že tento kód dělá v podstatě totéž, co předchozí vztah. Jediný rozdíl je v tom, že vztah je mezi Artists
a Genres
místo Albums
a Artists
.
V tomto případě jsem vztah nazval FK_Albums_Genres
.
Vložit data
Výše uvedený kód vytvořil databázi, která je vhodná pro data. Nyní můžeme přidat data.
V SQL Server můžete přidat data do databáze pomocí INSERT
prohlášení. Při použití tohoto příkazu musíte zadat název tabulky a také sloupce, do kterých chcete vložit data.
Poskytnutí sloupců je ve skutečnosti volitelné, pokud vkládáte data do všech sloupců, ale v zájmu srozumitelnosti uvádíme příklad, který obsahuje názvy sloupců.
INSERT INTO Artists (ArtistName, ActiveFrom)
VALUES
('Iron Maiden','1975-12-25'),
('AC/DC','1973-01-11'),
('Allan Holdsworth','1969-01-01'),
('Buddy Rich','1919-01-01'),
('Devin Townsend','1993-01-01'),
('Jim Reeves','1948-01-01'),
('Tom Jones','1963-01-01'),
('Maroon 5','1994-01-01'),
('The Script','2001-01-01'),
('Lit','1988-06-26'),
('Black Sabbath','1968-01-01'),
('Michael Learns to Rock','1988-03-15'),
('Carabao','1981-01-01'),
('Karnivool','1997-01-01'),
('Birds of Tokyo','2004-01-01'),
('Bodyjar','1990-01-01');
INSERT INTO Genres (Genre)
VALUES
('Rock'),
('Jazz'),
('Country'),
('Pop'),
('Blues'),
('Hip Hop'),
('Rap'),
('Punk');
INSERT INTO Albums (AlbumName, ReleaseDate, ArtistId, GenreId)
VALUES
('Powerslave', '1984-09-03', 1, 1),
('Powerage', '1978-05-05', 2, 1),
('Singing Down the Lane', '1956-01-01', 6, 3),
('Ziltoid the Omniscient', '2007-05-21', 5, 1),
('Casualties of Cool', '2014-05-14', 5, 1),
('Epicloud', '2012-09-18', 5, 1),
('Somewhere in Time', '1986-09-29', 1, 1),
('Piece of Mind', '1983-05-16', 1, 1),
('Killers', '1981-02-02', 1, 1),
('No Prayer for the Dying', '1990-10-01', 1, 1),
('No Sound Without Silence', '2014-09-12', 9, 4),
('Big Swing Face', '1967-06-01', 4, 2),
('Blue Night', '2000-11-01', 12, 4),
('Eternity', '2008-10-27', 12, 4),
('Scandinavia', '2012-06-11', 12, 4),
('Long Lost Suitcase', '2015-10-09', 7, 4),
('Praise and Blame', '2010-06-26', 7, 4),
('Along Came Jones', '1965-05-21', 7, 4),
('All Night Wrong', '2002-05-05', 3, 2),
('The Sixteen Men of Tain', '2000-03-20', 3, 2);
Jak vidíte, každý řádek má svůj vlastní řádek. Jednoduše přidáme jeden řádek na řádek s každým sloupcem odděleným čárkou a ohraničeným závorkami. Čárkou se také odděluje každý řádek (za závorkou).
Spuštění výše uvedeného kódu proti naší nově vytvořené databázi má za následek následující výstup:
(16 rows affected) (8 rows affected) (20 rows affected)
To nám říká, že data byla úspěšně vložena.
Zkontrolujte databázi
Můžeme provést rychlý test proti databázi, abychom ověřili, že byla vytvořena a naše data byla vložena.
Můžeme například spustit následující jednoduchý dotaz.
SELECT * FROM Artists;
Výsledek:
+------------+------------------------+--------------+ | ArtistId | ArtistName | ActiveFrom | |------------+------------------------+--------------| | 1 | Iron Maiden | 1975-12-25 | | 2 | AC/DC | 1973-01-11 | | 3 | Allan Holdsworth | 1969-01-01 | | 4 | Buddy Rich | 1919-01-01 | | 5 | Devin Townsend | 1993-01-01 | | 6 | Jim Reeves | 1948-01-01 | | 7 | Tom Jones | 1963-01-01 | | 8 | Maroon 5 | 1994-01-01 | | 9 | The Script | 2001-01-01 | | 10 | Lit | 1988-06-26 | | 11 | Black Sabbath | 1968-01-01 | | 12 | Michael Learns to Rock | 1988-03-15 | | 13 | Carabao | 1981-01-01 | | 14 | Karnivool | 1997-01-01 | | 15 | Birds of Tokyo | 2004-01-01 | | 16 | Bodyjar | 1990-01-01 | +------------+------------------------+--------------+
A spusťte další dotaz, který používá data ze všech tří tabulek.
SELECT
ArtistName,
AlbumName,
ReleaseDate
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
INNER JOIN Genres g
ON al.GenreId = g.GenreId
WHERE g.Genre = 'Rock';
Výsledek:
+----------------+-------------------------+---------------+ | ArtistName | AlbumName | ReleaseDate | |----------------+-------------------------+---------------| | Iron Maiden | Powerslave | 1984-09-03 | | AC/DC | Powerage | 1978-05-05 | | Devin Townsend | Ziltoid the Omniscient | 2007-05-21 | | Devin Townsend | Casualties of Cool | 2014-05-14 | | Devin Townsend | Epicloud | 2012-09-18 | | Iron Maiden | Somewhere in Time | 1986-09-29 | | Iron Maiden | Piece of Mind | 1983-05-16 | | Iron Maiden | Killers | 1981-02-02 | | Iron Maiden | No Prayer for the Dying | 1990-10-01 | +----------------+-------------------------+---------------+
Tento dotaz ukazuje důležitost vytváření vztahů mezi tabulkami se souvisejícími daty. Když spouštíme dotazy, jako je tento, opravdu potřebujeme, aby byla data mezi tabulkami konzistentní.
Databáze je nyní připravena k použití. Můžeme proti tomu spouštět dotazy. Můžeme vložit více dat. Můžeme přidat další tabulky, vztahy, pohledy, uložené procedury, uživatelsky definované funkce a mnoho dalšího.