Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Polecenie wstawiania MySQL a składnia zapytań T-SQL z przykładami

Deweloperzy to studenci przez całe życie. Zdobywanie nowej wiedzy tak szybko, jak to możliwe, jest zawsze naszym zadaniem. Jeśli pochodzisz z obozu T-SQL, jaki jest szybszy sposób na naukę MySQL? Często chcesz porównać składnie. Ostatnio dowiedziałeś się o tworzeniu tabeli w MySQL. Nasz dzisiejszy post poprowadzi Cię o krok dalej. Wstawimy rekordy za pomocą MySQL INSERT.

Jak łatwo może być? Obie platformy bazodanowe używają SQL, ale wiemy, że oba te produkty bazodanowe mają kilka dodatków do standardowej składni SQL. MySQL INSERT nie jest wyjątkiem.

Tak więc, jeśli jesteś zmęczony porównywaniem referencji dla MySQL i SQL Server, dzisiaj jest twój szczęśliwy dzień. Stworzyłem składnię i dokonałem dla ciebie porównania. Ponadto będziemy mieli przykłady do sprawdzenia. Na koniec będziemy mieć kolejną darmową ściągawkę.

Teraz, zanim się zagłębimy, możesz również otrzymać DARMOWĄ ściągawkę w formacie PDF na temat tego artykułu, wypełniając poniższy formularz.

[sendpulse-form id=”12097″]

Gotowy? Świetnie!

MySQL INSERT INTO Query Składnia (konstruktory wartości tabeli)

Ale zanim zagłębimy się w szczegóły, wyjaśnijmy kilka rzeczy:

  • Wersja MySQL, której tutaj używam, to 8.0.23, z silnikiem przechowywania InnoDB.
  • Wersja SQL Server to 2019.

Najpierw spróbujmy wstawić jeden rekord do tabeli. Podstawowa składnia jest podobna do składni SQL Server. Jednak dzieje się tak, jeśli nie dołączysz nazwy bazy danych i schematu oraz nie umieścisz nazw kolumn za pomocą zaznaczeń.

CREATE TABLE testdatabase.people
(`ID` int NOT NULL PRIMARY KEY,
 `Lastname` varchar(50) NOT NULL,
 `FirstName` varchar(50) NOT NULL,
 `MiddleName` varchar(50) NULL DEFAULT '',
 `Rank` varchar(20) NOT NULL,
 `Ship` varchar(50) NOT NULL,
 `ShipRegistry` varchar(20) NOT NULL,
 `ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP());
  
INSERT INTO people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Podanie rzeczywistej lokalizacji stołu będzie nieco inne. Jak wskazałem w tym poście, baza danych jest synonimem schematu w MySQL. Sprawdź zmodyfikowaną próbkę poniżej:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Czy zauważyłeś brak powyższej nazwy schematu?

Tymczasem powyższa klauzula VALUES tworzy konstruktor wartości tabeli. Podobnie SQL Server również ma tę funkcję.

Wstaw wiele wierszy do tabel w MySQL

Spróbujmy wstawić wiele wierszy.

INSERT INTO testdatabase.people
(ID, LastName, FirstName, MiddleName, Rank, Ship, ShipRegistry)
VALUES (4,'Janeway','Kathryn','', Captain','USS Voyager', 'NCC-74656'), 
       (5, 'Sisko','Benjamin','','Captain','USS Defiant','NX-74205');

Powyższy kod wstawi dwa rekordy przy użyciu dwóch konstruktorów wartości tabeli. Możesz również użyć wyrażeń zamiast wartości literałowych. Poniższy przykład używa podzapytania dla każdej kolumny:

CREATE TABLE testdatabase.people2 LIKE people;

INSERT INTO testdatabase.people2
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (4,'Janeway','Kathryn','','Captain','USS Voyager', 'NCC-74656'), 
       (5, (SELECT Lastname FROM people WHERE ID=5), 
           (SELECT Firstname FROM people WHERE ID=5), 
           (SELECT MiddleName FROM people WHERE ID=5),
           (SELECT `Rank` FROM people WHERE ID=5),
           (SELECT Ship FROM people WHERE ID=5),
           (SELECT ShipRegistry FROM people WHERE ID=5));

Podzapytania wyglądają na zbędne w powyższym zapytaniu. Ale to wygeneruje błąd:

INSERT INTO testdatabase.people2
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (4,'Janeway','Kathryn','','Captain','USS Voyager', 'NCC-74656'), 
       (SELECT `ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, 
        `Ship`, `ShipRegistry` FROM people);    -- ERROR!

Konstruktor wartości tabeli oczekuje literału lub wyrażenia dla każdego pola na liście kolumn. Co więcej, podzapytania w poprzednim przykładzie zwracają pojedynczy wiersz z jedną wartością, i to jest prawidłowe. Jednak powyższa instrukcja SELECT wywoła błąd, ponieważ zwraca wiele wierszy i kolumn.

Inną opcją jest określenie słowa kluczowego ROW, jak w poniższym przykładzie:

INSERT INTO testdatabase.people
(ID, LastName, FirstName, MiddleName, Rank, Ship, ShipRegistry)
VALUES ROW(4,'Janeway','Kathryn','', Captain','USS Voyager', 'NCC-74656'), 
       ROW(5, 'Sisko','Benjamin','','Captain','USS Defiant','NX-74205');

Ale słowo kluczowe ROW w instrukcji INSERT nie jest obsługiwane w SQL Server.

MySQL INSERT INTO z SELECT z innej tabeli

Możesz dodać rekordy do tabeli za pomocą instrukcji SELECT:

INSERT INTO people2
(ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry)
SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry FROM people;

Jak widać, tak samo jest z T-SQL bez nazwy bazy danych, nazwy schematu i znaku backticka. Nawiasem mówiąc, ranga to zastrzeżone słowo.

Dlatego znaki backticka zawierające słowo Ranga są koniecznością.

Możesz to wyrazić bez listy kolumn. Po prostu określ nazwy kolumn w tej samej kolejności, co układ kolumn tabeli docelowej.

TRUNCATE TABLE testdatabase.people2;

INSERT INTO testdatabase.people2
SELECT ID, Lastname, FirstName, MiddleName, `Rank`, Ship, ShipRegistry, ModifiedDate 
FROM people;

SELECT * FROM testdatabase.people2

Zobacz poniższy wynik z dbForge Studio dla MySQL:

Brzmi dobrze? Rozwińmy więcej na temat obsługi wartości kolumn.

WSTAW i wartości kolumn tabeli

Ta sekcja zagłębi się w wartości kolumn podczas korzystania z MySQL INSERT. Jest ich cztery:

  • Wartości Unicode.
  • Wartości domyślne.
  • Korzystanie z autoinkrementacji.
  • Wartości ze zmiennych zdefiniowanych przez użytkownika.

Wstaw ciąg Unicode

W T-SQL jesteś zaznajomiony z poprzedzaniem wartości ciągu za pomocą N . Używając tego, SQL Server zakłada, że ​​wartość jest wartością Unicode. W MySQL tego nie potrzebujesz.

Sprawdź poniższy przykład:

CREATE TABLE IF NOT EXISTS UnicodeNames
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 FullName varchar(50) NOT NULL);

INSERT INTO UnicodeNames
(FullName)
VALUES ('김지수'),('김제니'),('박채영'),('ลลิษา มโนบาล');

SELECT * FROM UnicodeNames

Należy zwrócić uwagę na kilka punktów:

  1. Używanie NVARCHAR do tworzenia tabeli w MySQL 8 zostanie automatycznie zmienione na VARCHAR.
  2. Nie ma potrzeby poprzedzania wartości Unicode za pomocą N , jak N’김지수’.
  3. Musisz trochę edytować powyższy kod, aby działał pomyślnie w SQL Server.

Sprawdź wynik poniżej:

Oto odpowiednik kodu w T-SQL:

CREATE TABLE UnicodeNames
(ID int NOT NULL IDENTITY PRIMARY KEY,
 FullName nvarchar(50) NOT NULL);

INSERT INTO UnicodeNames
(FullName)
VALUES (N'김지수'),(N'김제니'),(N'박채영'),(N'ลลิษา มโนบาล');

SELECT * FROM UnicodeNames

Spróbuj usunąć „N” z jednej z powyższych wartości Unicode. Kod będzie działał poprawnie, ale sprawdź poniższe dane wyjściowe w SQL Server Management Studio:

Jak wstawić wartość domyślną w MySQL

Domyślne wartości kolumny działają po wstawieniu rekordu bez określenia wartości. Użyliśmy tego w pierwszym przykładzie powyżej. Oto definicja kolumny ponownie:


`ModifiedDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP()

Kolumna Data modyfikacji domyślnie jest to bieżąca data i godzina na serwerze. Dlatego, kiedy to zrobiliśmy:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`)
VALUES (3,'Archer','Jonathan','','Captain','Enterprise','NX-01');

Wynik jest następujący:

Bardzo schludny i oszczędzający na naciśnięciach klawiszy. To samo zachowanie ma miejsce również w SQL Server.

Tymczasem, jeśli chcesz to sprecyzować, po prostu określ nazwę kolumny z wartością DEFAULT:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
VALUES (6, 'Pyke','Christopher','','Captain','USS Enterprise','NCC 1701', DEFAULT);

Działa również w SQL Server z niewielką modyfikacją.

Jest jeszcze jeden wygaszacz czasu i naciśnięć klawiszy. Ma wartość kolumny autoinkrementacji.

WSTAW do Kolumna AUTO_INCREMENT

Zamiast pobierać ostatnią wartość całkowitą w tabeli i dodawać 1, lepiej zdefiniować kolumnę autoinkrementacji. to jest dobre dla kluczy podstawowych. Zrobiliśmy to w przykładzie tabeli Unicode.

Oto fragment tego znowu:

CREATE TABLE IF NOT EXISTS UnicodeNames
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 FullName varchar(50) NOT NULL);

Tymczasem w SQL Server używamy słowa kluczowego IDENTITY zamiast AUTO_INCREMENT.

Rysunek 2 pokazuje wynik definiowania kolumny autoinkrementacji. Wartości całkowite zostały wygenerowane bez określania ich w instrukcji INSERT.

Używanie zmiennych zdefiniowanych przez użytkownika do ustawiania wartości kolumn

Innym częstym przypadkiem wstawiania rekordów w języku T-SQL jest stosowanie zmiennych zdefiniowanych przez użytkownika do ustawiania wartości kolumn. Jest pomocny przy tworzeniu skryptów ad-hoc i procedur składowanych.

Ale najpierw zdefiniowanie zmiennych w MySQL można wykonać za pomocą SET. W przeciwieństwie do SQL Server, używasz DECLARE. Spójrz na przykład:

SET @stringValue = 'string value';
SET @numericValue = 1287;
SET @booleanValue = TRUE;
SET @dateValue = CURRENT_DATE();

CREATE TABLE IF NOT EXISTS TableDataTypeValues
(ID int NOT NULL PRIMARY KEY AUTO_INCREMENT,
 stringValue varchar(50) NOT NULL,
 numericValue int NOT NULL,
 BooleanValue bit not NULL DEFAULT FALSE,
 dateValue date NULL);

INSERT INTO TableDataTypeValues
(stringValue, numericValue, BooleanValue, dateValue)
VALUES (@stringValue, @numericValue, @booleanValue, @dateValue);

Jak widać powyżej, zmienne działają jak wyrażenia wypełniające wartości kolumn w klauzuli VALUES.

Wstaw do tabeli tymczasowej w MySQL

Tutaj omówimy użycie MySQL INSERT w tabelach tymczasowych. Deweloperzy T-SQL znają „# ‘ symbol poprzedzający nazwę tabeli tymczasowej. W MySQL tymczasowe tabele są tworzone za pomocą CREATE TEMPORARY TABLE nazwa_tabeli . Nie ma „# „symbol. Dlatego wśród wierszy twojego skryptu tymczasowa nazwa tabeli może wyglądać tak samo jak zwykła nazwa tabeli:

CREATE TEMPORARY TABLE tmpkpopgroup (ID int NOT NULL PRIMARY KEY AUTO_INCREMENT, GroupName varchar(50) NOT NULL, ModifiedDate datetime DEFAULT CURRENT_TIMESTAMP()); INSERT INTO tmpkpopgroup (GroupName) VALUES ('BTS'),('SEVENTEEN'),('TWICE'),('MOMOLAND'),('GIRLS GENERATION'),('BLACKPINK'),('OH MY GIRL'),('RED VELVET'); SELECT * FROM tmpkpopgroup ORDER BY GroupName;

Innymi słowy, wstawianie rekordów do tabel tymczasowych wygląda tak samo, jak zwykłych tabel.

Oto wynik:

MySQL INSERT…ON DUPLICATE KEY UPDATE — nieobsługiwana składnia w T-SQL

Wreszcie, MySQL INSERT ma przypadki składni nieobsługiwane w T-SQL. Jednym z nich jest INSERT…ON DUPLICATE KEY UPDATE. Co może zrobić?

Gdy tabela ma unikalny klucz i zdarzy się, że wstawisz wartość, która spowoduje duplikat, INSERT nie powiedzie się. Jeśli jednak użyjesz INSERT…ON DUPLICATE KEY UPDATE, zamiast tego nastąpi aktualizacja istniejącego wiersza. Błąd nie wystąpi.

Załóżmy, że mamy te rekordy wśród ludzi tabela:

Zwróć uwagę na wartość rejestru statków zaznaczoną na czerwono i całą linię. Chodzi o to, że wstawimy ten sam rekord za pomocą ON DUPLICATE KEY UPDATE.

Teraz odpalmy poniższe stwierdzenie:

INSERT INTO testdatabase.people
(`ID`, `LastName`, `FirstName`, `MiddleName`, `Rank`, `Ship`, `ShipRegistry`, `ModifiedDate`)
VALUES (5, 'Sisko','Benjamin','','Captain','USS Defiant','NCC-75633', DEFAULT)
ON DUPLICATE KEY UPDATE ShipRegistry = 'NCC-75633';

SELECT * FROM testdatabase.people;

Czy wystąpił błąd? Sprawdźmy to!

Fajne, prawda?

Ten sam efekt ma miejsce, gdy to zrobisz:

UPDATE people 
SET ShipRegistry = 'NCC-75633'
WHERE ID = 5

Tymczasem możesz wyrazić intencję w T-SQL w następujący sposób:

IF EXISTS(SELECT id FROM people WHERE id = 5)
	UPDATE people 
	SET ShipRegistry = 'NCC-75633'
	WHERE ID = 5
ELSE
	INSERT INTO people
	(ID, LastName, FirstName, MiddleName, [Rank], Ship, ShipRegistry, ModifiedDate)
	VALUES (5, 'Sisko','Benjamin','','Captain','USS Defiant','NCC-75633', DEFAULT);

Będzie taki sam wynik.

Wniosek

Benjamin Franklin powiedział kiedyś:„Inwestycja w wiedzę zawsze przynosi najlepszy interes”. Mam nadzieję, że ten artykuł Ci się opłaci na czas.

Zróbmy podsumowanie:

  1. Podstawowa składnia INSERT MySQL jest prawie taka sama w T-SQL, z wyjątkiem braku nazwy schematu i użycia znaków wstecznych.
  2. Wstawianie rekordów w MySQL z innej tabeli jest prawie takie samo jak w T-SQL.
  3. Wartości kolumn są obsługiwane inaczej w MySQL INSERT. Najbardziej godne uwagi są wartości Unicode. Również składnia jest inna w przypadku użycia AUTO_INCREMENT.
  4. Wstawianie rekordów do tabeli tymczasowej w MySQL ma niewielką różnicę w T-SQL z „# ‘symbol.
  5. WSTAW… PRZY ZDOLNYM KLUCZU AKTUALIZACJA wygląda dobrze po skróceniu składni, aby uniknąć duplikatów błędów.

Mam nadzieję, że artykuł okazał się przydatny podczas nauki MySQL. Jeśli podoba Ci się ten post, udostępnij go na swoich ulubionych platformach społecznościowych!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak sprawdzić, czy kolumna jest pusta lub null w MySQL?

  2. Jak wyeksportować bazę danych mysql za pomocą wiersza polecenia?

  3. Najszybsza metoda wykonywania kopii zapasowej i przywracania MySQL

  4. MIN() vs LEAST() w MySQL:jaka jest różnica?

  5. Jak przyspieszyć zapytania SELECT .. LIKE w MySQL na wielu kolumnach?