Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Câu lệnh SQL SELECT INTO

SQL SELECT INTO câu lệnh là một phần mở rộng Sybase có thể được sử dụng để chèn kết quả của một truy vấn vào một bảng (hoặc một biến, tùy thuộc vào DBMS).

Trong các DBMS, chẳng hạn như SQL Server và PostgreSQL, SELECT INTO câu lệnh tạo một bảng mới và chèn các hàng kết quả từ truy vấn vào đó.

Trong MariaDB, nó sẽ chèn tập hợp kết quả vào một biến. Trong Oracle, nó chỉ định các giá trị đã chọn cho các biến hoặc tập hợp.

MySQL và SQLite không hỗ trợ SELECT INTO tuyên bố nào cả.

Các ví dụ trong bài viết này chèn các tập hợp kết quả vào một bảng. Trong MariaDB và Oracle, bảng đích có thể được thay thế bằng một tên biến (hoặc tên bộ sưu tập nếu bạn đang sử dụng Oracle).

Ví dụ cơ bản

Dưới đây là một ví dụ cơ bản để chứng minh việc chọn và chèn dữ liệu vào một bảng mới.

SELECT * INTO Pets2
FROM Pets;

Ví dụ này tạo một bảng có tên Pets2 với cùng một định nghĩa của bảng được gọi là Pets và chèn tất cả dữ liệu từ Pets thành Pets2 .

Chúng tôi có thể xác minh điều này bằng cách chọn nội dung của cả hai bảng.

SELECT * FROM Pets;
SELECT * FROM Pets2;

Kết quả:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)
+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)

Khi bảng đã tồn tại

Nếu chúng tôi cố gắng chạy SELECT INTO một lần nữa, chúng tôi gặp lỗi, do bảng đã tồn tại.

SELECT * INTO Pets2
FROM Pets;

Kết quả:

Msg 2714, Level 16, State 6, Line 1
There is already an object named 'Pets2' in the database.

Nếu bạn muốn chèn dữ liệu vào một bảng đã tồn tại, hãy sử dụng INSERT INTO... SELECT tuyên bố. Điều này sẽ nối dữ liệu vào bất kỳ dữ liệu hiện có nào. Nghĩa là, nó sẽ thêm các hàng mới vào bảng, trong khi vẫn giữ mọi hàng hiện có

Lọc kết quả

SELECT câu lệnh có thể thực hiện SELECT thông thường nội dung câu lệnh, chẳng hạn như lọc kết quả bằng WHERE mệnh đề.

SELECT * INTO Pets3
FROM Pets
WHERE DOB < '2020-06-01';

Trong ví dụ này, tôi lọc dữ liệu để chỉ những vật nuôi có ngày sinh (DOB) từ trước ngày 1 tháng 6 năm 2020.

Chọn từ nhiều bảng

Bạn có thể chọn dữ liệu từ nhiều bảng, sau đó đặt định nghĩa của bảng đích dựa trên tập kết quả.

SELECT
    p.PetId,
    p.PetName,
    p.DOB,
    pt.PetTypeId,
    pt.PetType,    
    o.OwnerId,
    o.FirstName,
    o.LastName,
    o.Phone,
    o.Email
INTO PetsTypesOwners
FROM Pets p 
INNER JOIN PetTypes pt 
ON p.PetTypeId = pt.PetTypeId 
INNER JOIN Owners o 
ON p.OwnerId = o.OwnerId;

Ở đây, chúng tôi truy vấn ba bảng và chèn kết quả vào một bảng có tên PetsTypesOwners .

Lưu ý rằng tôi đã liệt kê ra từng cột ở đây vì tôi không muốn bao gồm tất cả các cột.

Cụ thể, tôi không muốn nhân đôi các cột khóa ngoại / khóa chính. Trong trường hợp của tôi, các khóa ngoại có cùng tên với các đối tác khóa chính của chúng trong bảng mẹ và tôi sẽ nhận được lỗi do tên cột trùng lặp được tạo trong bảng đích.

Đây là ý tôi muốn nói.

SELECT *
INTO PetsTypesOwners2
FROM Pets p 
INNER JOIN PetTypes pt 
ON p.PetTypeId = pt.PetTypeId 
INNER JOIN Owners o 
ON p.OwnerId = o.OwnerId;

Kết quả:

Msg 2705, Level 16, State 3, Line 1
Column names in each table must be unique. Column name 'PetTypeId' in table 'PetsTypesOwners2' is specified more than once.

Nếu các khóa ngoại của bạn sử dụng các tên cột khác nhau cho các khóa chính, thì bạn có thể kết thúc với một bảng đích chứa các cột không cần thiết (một cho khóa chính, một cho khóa ngoại và mỗi cột chứa các giá trị giống nhau).

Nếu bạn thực sự muốn bao gồm các cột trùng lặp như vậy, nhưng chúng có cùng tên, bạn luôn có thể sử dụng bí danh để gán chúng với một tên khác trong bảng đích.

SELECT
    p.PetId, 
    p.OwnerId AS PetOwnerId, 
    p.PetTypeId AS PetPetTypeId,
    p.PetName,
    p.DOB,
    pt.PetTypeId,
    pt.PetType,    
    o.OwnerId,
    o.FirstName,
    o.LastName,
    o.Phone,
    o.Email
INTO PetsTypesOwners3
FROM Pets p 
INNER JOIN PetTypes pt 
ON p.PetTypeId = pt.PetTypeId 
INNER JOIN Owners o 
ON p.OwnerId = o.OwnerId;

Trong trường hợp này, tôi đã sử dụng bí danh cột để gán lại tên của hai cột thành PetOwnerIdPetPetTypeId .

CHỌN VÀO TỪ Chế độ xem

Bạn cũng có thể chọn dữ liệu từ một chế độ xem nếu cần.

SELECT * INTO PetTypeCount
FROM vPetTypeCount;

Thao tác này chọn dữ liệu từ vPetTypeCount xem và chèn nó vào một bảng mới có tên PetTypeCount .

Chúng tôi có thể xác minh điều này bằng SELECT tuyên bố.

SELECT * FROM vPetTypeCount;
SELECT * FROM PetTypeCount;

Kết quả:

+-----------+---------+
| PetType   | Count   |
|-----------+---------|
| Bird      | 1       |
| Cat       | 3       |
| Dog       | 4       |
+-----------+---------+
(3 rows affected)
+-----------+---------+
| PetType   | Count   |
|-----------+---------|
| Bird      | 1       |
| Cat       | 3       |
| Dog       | 4       |
+-----------+---------+
(3 rows affected)

Hỗ trợ DBMS

Như đã đề cập, SELECT INTO tuyên bố là một tiện ích mở rộng Sybase và nó không được hỗ trợ bởi tất cả các DBMS chính. Ví dụ:MySQL và SQLite không hỗ trợ nó.

Ngoài ra, trong số các DBMS có hỗ trợ nó, việc triển khai thực tế có phần khác nhau giữa các DBMS. Các ví dụ trên đã được thực hiện trong SQL Server. Trong MariaDB và Oracle, bạn có thể thay thế bảng đích bằng một tên biến (hoặc tên bộ sưu tập trong Oracle).

Nếu DBMS của bạn không hỗ trợ SELECT INTO , rất có thể nó hỗ trợ INSERT INTO... SELECT , vì vậy bạn nên thử thay thế.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để lọc các hàng không có NULL trong một cột

  2. Luồng tuần tự so với Luồng song song trong Java là gì?

  3. 0 đến 60:Chuyển sang các điểm kiểm tra gián tiếp

  4. Phá vỡ các bức tường! Cách gỡ bỏ dữ liệu của bạn

  5. Sử dụng ODBC với Dịch vụ Đăng nhập Một lần của Salesforce và Active Directory (ADFS) (SSO)