W programowaniu baz danych istnieją cztery podstawowe operacje:tworzenie , przeczytaj , aktualizacja i usuń – CRUD operacje. Stanowią pierwszy krok w programowaniu baz danych.
Termin CRUD pojawił się po raz pierwszy w książce Jamesa Martina „Managing the Database Environment”. Od tego czasu termin ten stał się popularny. W tym artykule zamierzamy zbadać operację CRUD pod kątem SQL Server, ponieważ składnia operacji może różnić się od innych relacyjnych baz danych i NoSQL.
Przygotowania
Główną ideą relacyjnych baz danych jest przechowywanie danych w tabelach. Dane w tabeli można czytać, wstawiać, usuwać. W ten sposób operacje CRUD manipulują danymi tabeli.
C | C REATE | Wstaw wiersz/wiersze do tabeli |
R | R EAD | Odczytaj (wybierz) wiersz/wiersze z tabeli |
U | U PDATE | Edytuj wiersz/wiersze w tabeli |
D | D ELETE | Usuń wiersz/wiersze z tabeli |
Aby zilustrować operacje CRUD, potrzebujemy tabeli danych. Stwórzmy jeden. Będzie zawierał tylko trzy kolumny. Pierwsza kolumna będzie zawierała nazwy krajów, druga kontynent tych krajów, a ostatnia kolumna będzie zawierała populację tych krajów. Możemy utworzyć tę tabelę za pomocą instrukcji T-SQL i zatytułować ją jako TblCountry .
CREATE TABLE [dbo].[TblCountry]
(
[CountryName] VARCHAR(50),
[ContinentNames] VARCHAR(50) NULL,
[CountryPopulation] BIGINT NULL
)
Przyjrzyjmy się teraz operacjom CRUD wykonywanym na TblCountry tabela.
C – UTWÓRZ
Aby dodać nowe wiersze do tabeli, użyj INSERT INTO Komenda. W tym poleceniu musimy określić nazwę tabeli docelowej i wymienimy nazwy kolumn w nawiasach. Struktura instrukcji powinna kończyć się na WARTOŚCI:
INSERT INTO TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES ('Germany','Europe',8279000 )
Aby dodać wiele wierszy do tabeli, możemy użyć następującego typu instrukcji INSERT:
INSERT INTO TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES
('Germany','Europe',8279000 ),
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)
Zwróć uwagę, że INTO słowo kluczowe jest opcjonalne i nie trzeba go używać w instrukcjach wstawiania.
INSERT TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES
('Germany','Europe',8279000 ),
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)
Możesz także użyć następującego formatu, aby wstawić wiele wierszy do tabeli:
INSERT INTO TblCountry
SELECT 'Germany','Europe',8279000
UNION ALL
SELECT 'Japan','Asia',126800000
UNION ALL
SELECT 'Moroco','Africa',35740000
Teraz skopiujemy dane bezpośrednio z tabeli źródłowej do tabeli docelowej. Ta metoda jest znana jako INSERT INTO … SELECT oświadczenie.
INSERT INTO … SELECT wymaga dopasowania typów danych tabeli źródłowej i docelowej. W poniższej instrukcji INSERT INTO … SELECT wstawimy dane SourceCountryTbl tabeli do TblCountry tabela.
Na początku wstawiamy syntetyczne dane do SourceCountryTbl tabela dla tej demonstracji.
DROP TABLE IF EXISTS [SourceCountryTbl]
CREATE TABLE [dbo].[SourceCountryTbl]
(
[SourceCountryName] VARCHAR(50),
[SourceContinentNames] VARCHAR(50) NULL,
[SourceCountryPopulation] BIGINT NULL
)
INSERT INTO [SourceCountryTbl]
VALUES
('Ukraine','Europe',44009214 ) ,
('UK','Europe',66573504) ,
('France','Europe',65233271)
Teraz wykonamy instrukcję INSERT INTO … SELECT.
INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl
Powyższa instrukcja insert dodała wszystkie SourceCountryTbl dane do TblCountry stół. Możemy również dodać GDZIE klauzula do filtrowania instrukcji select.
INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl WHERE TargetCountryName='UK'
SQL Server pozwala na wykorzystanie zmiennych tabelowych (obiektów, które pomagają przechowywać tymczasowe dane tabelaryczne w zakresie lokalnym) z poleceniami INSERT INTO … SELECT. W poniższej demonstracji użyjemy zmiennej table jako tabeli źródłowej:
DECLARE @SourceVarTable AS TABLE
([TargetCountryName] VARCHAR(50),
[TargetContinentNames] VARCHAR(50) NULL,
[TargetCountryPopulation] BIGINT NULL
)
INSERT INTO @SourceVarTable
VALUES
('Ukraine','Europe',44009214 ) ,
('UK','Europe',66573504) ,
('France','Europe',65233271)
INSERT INTO TblCountry
SELECT * FROM @SourceVarTable
Wskazówka :Microsoft ogłosił funkcję w SQL Server 2016, którą jest wstawianie równoległe . Ta funkcja pozwala nam wykonywać operacje INSERT w równoległych wątkach.
Jeśli dodasz TABLOCK wskazówka na końcu instrukcji insert, SQL Server może wybrać równoległość z planem wykonania przetwarzania zgodnie z maksymalnym stopniem równoległości serwera lub progiem kosztów dla parametrów równoległości.
Przetwarzanie wstawiania równoległego również skróci czas wykonywania instrukcji wstawiania. Jednak TABLOCK wskazówka uzyska blokadę wstawionej tabeli podczas operacji wstawiania. Więcej informacji o wstawianiu równoległym można znaleźć w Real World Parallel INSERT…SELECT.
Innym przydatnym stwierdzeniem jest SELECT INTO. Ta metoda pozwala nam skopiować dane z jednej tabeli do nowo utworzonej tabeli. W poniższym oświadczeniu NewCountryTable nie istniał przed wykonaniem zapytania. Zapytanie tworzy tabelę i wstawia wszystkie dane z TblCountry tabela.
SELECT * INTO NewCountryTable
FROM TblCountry
Jednocześnie możemy stworzyć nową tabelę dla poszczególnych kolumn tabeli źródłowej.
W niektórych przypadkach musimy zwrócić i użyć wstawionych wartości z instrukcji INSERT. Od SQL Server 2005, instrukcja INSERT pozwala nam pobierać dane wartości z instrukcji INSERT.
Teraz usuniemy i utworzymy naszą tabelę testową i dodamy nową kolumnę tożsamości. Dodamy również domyślne ograniczenie do tej kolumny. Tym samym, jeśli nie wstawimy żadnej wyraźnej wartości do tej kolumny, automatycznie utworzy ona nową wartość.
W poniższym przykładzie zadeklarujemy tabelę z jedną kolumną i wstawimy wynik SeqID wartość kolumny do tej tabeli za pomocą kolumny OUTPUT:
DROP TABLE IF EXISTS TblCountry
CREATE TABLE [dbo].[TblCountry]
(
[CountryName] VARCHAR(50),
[ContinentNames] VARCHAR(50) NULL,
[CountryPopulation] BIGINT NULL ,
SeqID uniqueidentifier default(newid())
)
DECLARE @OutputID AS TABLE(LogID uniqueidentifier)
INSERT TblCountry
(CountryName,ContinentNames,CountryPopulation)
OUTPUT INSERTED.SeqId INTO @OutputID
VALUES
('Germany','Europe',8279000 )
SELECT * FROM @OutPutId
R – Przeczytaj
Czytaj operacja pobiera dane z tabeli i zwraca zestaw wyników z rekordami tabeli. W przypadku, gdy chcemy pobrać dane z więcej niż jednej tabeli, możemy użyć operatora JOIN i stworzyć logiczną relację między tabelami.
Instrukcja SELECT odgrywa jedną główną rolę w odczycie operacja. Opiera się na trzech elementach:
- Kolumna – definiujemy kolumny, z których chcemy pobrać dane
- Tabela – my podaj tabelę, z której chcemy pobrać dane
- Filtr – my może filtrować dane, które chcemy odczytać. Ta część jest opcjonalna.
Najprostsza forma instrukcji select jest następująca:
SELECT column1, column2,...,columnN
FROM table_name
Teraz przejdziemy przez przykłady. Na początek potrzebujemy przykładowej tabeli do przeczytania. Stwórzmy to:
DROP TABLE IF EXISTS TblCountry
GO
CREATE TABLE [dbo].[TblCountry]
(
[CountryName] VARCHAR(50),
[ContinentNames] VARCHAR(50) NULL,
[CountryPopulation] BIGINT NULL
)
GO
INSERT INTO TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES
('Germany','Europe',8279000 ),
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)
Odczytywanie wszystkich kolumn w tabeli
Operator gwiazdki (*) jest używany w instrukcjach SELECT, ponieważ zwraca wszystkie kolumny w tabeli:
SELECT * FROM TblCountry
Wskazówka :Operator gwiazdki (*) może negatywnie wpłynąć na wydajność, ponieważ powoduje większy ruch w sieci i zużywa więcej zasobów. Dlatego jeśli nie musisz pobierać wszystkich danych ze wszystkich zwróconych kolumn, unikaj używania gwiazdki (*) w instrukcji SELECT.
Odczytywanie poszczególnych kolumn tabeli
Możemy też czytać poszczególne kolumny tabeli. Przyjrzyjmy się przykładowi, który zwróci tylko CountryName i Populacja kraju kolumny:
SELECT CountryName,CountryPopulation FROM TblCountry
Używanie aliasów w instrukcjach SELECT
W instrukcjach SELECT możemy nadać tabeli lub kolumnom tymczasowe nazwy. Te tymczasowe nazwy są aliasami. Przepiszmy poprzednie dwa zapytania za pomocą aliasów tabeli i kolumny.
W poniższym zapytaniu TblC alias określi nazwę tabeli:
SELECT TblC.* FROM TblCountry TblC
W poniższym przykładzie udostępnimy aliasy nazw kolumn. Zmienimy CountryName do CName i Populacja kraju – do CPop .
SELECT TblC.CountryName AS [CName], CountryPopulation AS [CPop] FROM TblCountry TblC
Cele aliasu to:
- Spraw, aby zapytanie było bardziej czytelne, jeśli nazwy tabel lub kolumn są złożone.
- Upewnij się, że używasz zapytania dla tabeli więcej niż jeden raz.
- Uprość pisanie zapytań, jeśli nazwa tabeli lub kolumny jest długa.
Filtrowanie instrukcji SELECT
Instrukcje SELECT pozwalają nam filtrować zbiory wyników przez klauzulę WHERE. Na przykład chcemy filtrować instrukcję SELECT według Nazwa Kraju i zwróć do zestawu wyników tylko dane dotyczące Niemiec. Następujące zapytanie wykona operację odczytu z filtrem:
SELECT TblC.* FROM TblCountry TblC
WHERE TblC.CountryName='Germany'
Sortowanie wyników instrukcji SELECT
Klauzula ORDER BY pomaga nam posortować zestaw wyników instrukcji SELECT według określonej kolumny lub kolumn. Możemy wykonać sortowanie rosnąco lub malejąco za pomocą klauzuli ORDER BY.
Posortujemy TblCountry tabela według liczby ludności krajów w porządku rosnącym:
SELECT TblC.* FROM TblCountry TblC
ORDER BY TblC.CountryPopulation ASC
Wskazówka :Możesz użyć indeksu kolumny w klauzuli ORDER BY, a numery indeksu kolumn zaczynają się od 1.
Możemy również napisać poprzednie zapytanie. Liczba trzy (3) wskazuje Populacja kraju kolumna:
SELECT TblC.* FROM TblCountry TblC
ORDER BY 3 ASC
U – aktualizacja
Instrukcja UPDATE modyfikuje istniejące dane w tabeli. To oświadczenie musi zawierać klauzulę SET, abyśmy mogli zdefiniować kolumnę docelową do modyfikacji danych.
Następujące zapytanie zmieni wszystkie wiersze CountryPopulation wartość kolumny na 1.
UPDATE TblCountry SET CountryPopulation=1
GO
SELECT TblC.* FROM TblCountry TblC
W instrukcjach UPDATE możemy użyć klauzuli WHERE, aby zmodyfikować konkretny wiersz lub wiersze w tabeli.
Zmieńmy Japonię wiersz CountryPopulation do 245000:
UPDATE TblCountry SET CountryPopulation=245000
WHERE CountryName = 'Japan'
GO
SELECT TblC.* FROM TblCountry TblC
Instrukcja UPDATE jest połączeniem instrukcji usuwania i wstawiania. Tak więc możemy zwrócić wstawione i usunięte wartości za pomocą klauzuli OUTPUT.
Zróbmy przykład:
UPDATE TblCountry SET CountryPopulation=22
OUTPUT inserted.CountryPopulation AS [Insertedvalue],
deleted.CountryPopulation AS [Deletedvalue]
WHERE CountryName = 'Germany'
Jak widać, zmodyfikowaliśmy CountryPopulation wartość od 1 do 22. Następnie możemy znaleźć wstawione i usunięte wartości. Dodatkowo możemy wstawić te wartości do zmiennej tabeli (specjalny typ zmiennej, który może być użyty jako tabela).
Wstawimy wstawione i usunięte wartości do zmiennej tabeli:
DECLARE @LogTable TABLE(InsertValLog INT , DelValLog INT)
UPDATE TblCountry SET CountryPopulation=45
OUTPUT inserted.CountryPopulation ,
deleted.CountryPopulation INTO @LogTable
WHERE CountryName = 'Germany'
SELECT * FROM @LogTable
@@ROWCOUNT to zmienna systemowa, która zwraca liczbę wierszy, których dotyczyła ostatnia instrukcja. Dlatego możemy użyć tej zmiennej do ujawnienia niektórych zmodyfikowanych wierszy w instrukcji aktualizacji.
W poniższym przykładzie zapytanie aktualizujące zmieni 3 wiersze, a zmienna systemowa @@ROWCOUNT zwróci 3.
UPDATE TblCountry SET CountryPopulation=1
SELECT @@ROWCOUNT AS [AffectedRowNumber]
D – Usuń
Instrukcja Delete usuwa istniejące wiersze/wiersze z tabeli.
Najpierw zobaczmy, jak używać klauzuli WHERE w instrukcjach DELETE. W większości przypadków chcemy filtrować usunięte wiersze.
Poniższy przykład ilustruje, jak usunąć konkretny wiersz:
SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry WHERE CountryName='Japan'
SELECT TblC.* FROM TblCountry TblC
Chociaż za pomocą instrukcji DELETE możemy usunąć wszystkie rekordy z tabeli. Jednak instrukcja DELETE jest bardzo prosta i nie używamy warunku WHERE.
SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry
SELECT TblC.* FROM TblCountry TblC
Mimo to, w pewnych okolicznościach projektów baz danych, instrukcja DELETE nie usuwa wiersza/wierszy, jeśli narusza klucze obce lub inne ograniczenia.
Na przykład w AdventureWorks bazy danych, nie możemy usuwać wierszy ProductCategory tabeli, ponieważ ProductCategoryID jest określony jako klucz obcy w tej tabeli.
Spróbujmy usunąć wiersz z ProductCategory tabela – bez wątpienia napotkamy następujący błąd:
DELETE FROM [Production].[ProductCategory]
WHERE ProductCategoryID=1
Wniosek
W ten sposób zbadaliśmy operacje CRUD w SQL. Instrukcje INSERT, SELECT, UPDATE i DELETE są podstawowymi funkcjami bazy danych SQL i musisz je opanować, jeśli chcesz nauczyć się programowania baz danych SQL. Teoria CRUD może być dobrym punktem wyjścia, a dużo praktyki pomoże ci zostać ekspertem.