Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Operacje CRUD programu SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyszukiwanie pełnotekstowe nie działa, jeśli dołączono słowo zatrzymania, mimo że lista słów zatrzymania jest pusta

  2. Jak korzystać z szablonów w SQL Server Management Studio (SSMS) — samouczek SQL Server / TSQL część 16

  3. Limit na GDZIE kol. W (...) stan

  4. SQL Server, wprowadzający w błąd XLOCK i optymalizacje

  5. Użyj FILE_IDEX(), aby zwrócić identyfikator pliku bazy danych w SQL Server