giriiş
SQL olarak da bilinen Yapılandırılmış Sorgu Dili, tablolara veri ekleme konusunda büyük esneklik sağlar. Örneğin, VALUES anahtar sözcüğüyle tek tek veri satırlarını belirtebilir, SELECT sorgularıyla mevcut tablolardan tüm veri kümelerini kopyalayabilir ve sütunları, SQL'in bunlara otomatik olarak veri eklemesini sağlayacak şekilde tanımlayabilirsiniz.
Bu kılavuzda, bu yöntemlerin her biriyle tablolara veri eklemek için INSERT INTO SQL sözdiziminin nasıl kullanılacağını inceleyeceğiz.
Ön koşullar
Bu kılavuzu takip etmek için, SQL kullanan bir tür ilişkisel veritabanı yönetim sistemine (RDBMS) sahip bir bilgisayara ihtiyacınız olacak. Bu kılavuzdaki talimatlar ve örnekler aşağıdaki ortam kullanılarak doğrulanmıştır:
- Yönetici ayrıcalıklarına sahip, kök olmayan bir kullanıcıya ve UFW ile yapılandırılmış bir güvenlik duvarına sahip Ubuntu 20.04 çalıştıran bir sunucu.
- Sunucuda MySQL kurulu ve güvenlidir.
Ayrıca, veri ekleme alıştırması yapabileceğiniz bir veritabanı ve tabloya da ihtiyacınız olacak. Bunlara sahip değilseniz, bu kılavuzda örneklerde kullanılan veritabanı ve tablonun nasıl oluşturulacağı hakkında daha fazla bilgi için MySQL'e Bağlanma ve Örnek Veritabanı Oluşturma bölümünü okuyabilirsiniz.
MySQL'e bağlanma ve örnek bir veritabanı kurma
SQL veritabanı sisteminiz uzak bir sunucuda çalışıyorsa, yerel makinenizden sunucunuza SSH ile bağlanın:
ssh sammy@your_server_ip
Daha sonra MySQL sunucusu istemini açın ve Sami'yi MySQL kullanıcı adınızla değiştirin:
mysql -u sammy -p
insertDB adında bir veritabanı oluşturun:
CREATE DATABASE insertDB;Veritabanı başarıyla oluşturulduysa aşağıdaki çıktıyı alacaksınız:
Query OK, 1 row affected (0.01 sec)insertDB veritabanını seçmek için aşağıdaki USE ifadesini çalıştırın:
USE insertDB;
Output
Database changedinsertDB veritabanını seçtikten sonra, içinde bir tablo oluşturun. Örneğin, bir fabrikanız olduğunu ve çalışanlarınız hakkında bazı bilgileri depolamak için bir tablo oluşturmak istediğinizi varsayalım. Bu tablo aşağıdaki beş sütundan oluşacaktır:
isim: Her çalışanın adı, en fazla 30 karakter uzunluğunda varchar veri türü kullanılarak ifade edilirkonum: Bu sütun her çalışanın iş unvanını saklar ve bu unvan da yine en fazla 30 karakter olmak üzere varchar veri tipi kullanılarak ifade edilir.departman: Her çalışanın çalıştığı departman, varchar veri tipi kullanılarak ancak en fazla 20 karakter olacak şekilde ifade edilir.saatlik ücret: Her çalışanın saatlik ücretini kaydeden sütun, ondalık veri türünü kullanır ve bu sütundaki değerler en fazla dört basamak uzunluğundadır ve bu basamaklardan ikisi ondalık noktasının sağındadır. Bu nedenle, bu sütunda izin verilen değer aralığı -99,99 ile 99,99 arasındadır.başlangıç tarihi: Her çalışanın işe alındığı tarih, Tarih veri türü kullanılarak ifade edilir. Bu türdeki değerler YYYY-AA-GG biçimine uygun olmalıdır.
Aşağıdaki beş sütundan oluşan factoryEmployees adlı bir tablo oluşturun:
CREATE TABLE factoryEmployees (
name varchar(30),
position varchar(30),
department varchar(20),
hourlyWage decimal(4,2),
startDate date
);Artık rehberin geri kalanını takip etmeye ve SQL ile veri eklemeyi öğrenmeye hazırsınız.
Verileri manuel olarak girin
SQL'de veri eklemenin genel sözdizimi aşağıdaki gibidir:
INSERT INTO table_name
(column1, column2, . . . columnN)
VALUES
(value1, value2, . . . valueN);Bunu göstermek için, factoryEmployees tablosunu tek satır veriyle yüklemek üzere aşağıdaki INSERT INTO ifadesini çalıştırın:
INSERT INTO factoryEmployees
(name, position, department, hourlyWage, startDate)
VALUES
('Agnes', 'thingamajig foreman', 'management', 26.50, '2017-05-01');Output
Query OK, 1 row affected (0.00 sec)İfade, INSERT INTO anahtar sözcükleriyle başlar ve ardından verileri eklemek istediğiniz tablonun adı gelir. Tablo adının ardından, ifadenin verileri ekleyeceği sütunların parantez içinde bir listesi gelir. Sütun listesinin ardından ise VALUES anahtar sözcüğü gelir ve ardından parantez içinde ve virgülle ayrılmış bir değer kümesi gelir.
Sütunları listeleme sıranız önemli değil. Girdiğiniz değerlerin sırasının sütunların sırasıyla eşleşmesi gerektiğini unutmamak önemlidir. SQL her zaman listelenen ilk sütuna verilen ilk değeri, sonraki sütuna ikinci değeri vb. eklemeye çalışır. Örneğin, aşağıdaki INSERT ifadesi başka bir veri satırı ekler, ancak sütunları farklı bir sırayla listeler:
INSERT INTO factoryEmployees
(department, hourlyWage, startDate, name, position)
VALUES
('production', 15.59, '2018-04-28', 'Jim', 'widget tightener');Output
Query OK, 1 row affected (0.00 sec)Değerleri doğru şekilde hizalamazsanız, SQL verilerinizi yanlış sütunlara ekleyebilir. Ayrıca, değerlerden herhangi biri sütunun veri türüyle çakışırsa, bu örnekte olduğu gibi bir hata mesajı alırsınız:
INSERT INTO factoryEmployees
(name, hourlyWage, position, startDate, department)
VALUES
('Louise', 'doodad tester', 16.50, '2017-05-01', 'quality assurance');Output
ERROR 1366 (HY000): Incorrect decimal value: 'doodad tester' for column 'hourlyWage' at row 1
Belirttiğiniz her sütun için bir değer sağlamanız gerektiğini unutmayın; ancak yeni bir veri satırı eklerken tablodaki her sütunu belirtmeniz gerekmez. Sildiğiniz sütunların hiçbirinde bu durumda hataya neden olacak bir kısıtlama (örneğin NOT NULL) olmadığı sürece, MySQL belirtilmemiş sütunlara NULL ekleyecektir:
INSERT INTO factoryEmployees
(name, position, hourlyWage)
VALUES
('Harry', 'whatzit engineer', 26.50);Output
Query OK, 1 row affected (0.01 sec)Tablodaki her sütun için değerlerin bulunduğu bir satır ekleyecekseniz, sütun adlarını girmenize hiç gerek yok. Girdiğiniz değerlerin, tablo tanımında sütunların tanımlandığı sırayla tutarlı olması gerektiğini unutmayın.
Bu örnekte listelenen değerler, factoryEmployee tablosu için CREATE TABLE ifadesinde sütunların tanımlandığı sıraya göre hizalanmıştır:
INSERT INTO factoryEmployees
VALUES
('Marie', 'doodad welder', 'production', 27.88, '2018-03-29');
Output
Query OK, 1 row affected (0.00 sec)
Ayrıca her satırı virgülle ayırarak birden fazla kaydı aynı anda ekleyebilirsiniz, örneğin:
INSERT INTO factoryEmployees
VALUES
('Giles', 'gizmo inspector', 'quality assurance', 26.50, '2019-08-06'),
('Daphne', 'gizmo presser', 'production', 32.45, '2017-11-12'),
('Joan', 'whatzit analyst', 'quality assurance', 29.00, '2017-04-29');Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0SELECT ifadeleriyle veri kopyalama
Verileri satır satır belirtmek yerine, bir tablodan birden fazla veri satırını kopyalayıp SELECT sorgusuyla başka bir tabloya ekleyebilirsiniz.
Bu tür işlemlerin sözdizimi aşağıdaki gibidir:
INSERT INTO table_A (col_A1, col_A2, col_A3)
SELECT col_B1, col_B2, col_B3
FROM table_B;Bu örnek sözdizimi, sütun listesini VALUES anahtar sözcüğüyle takip etmek yerine, bir SELECT ifadesiyle devam eder. Bu örnek sözdizimindeki SELECT ifadesi yalnızca FROM ifadesini içerir, ancak geçerli herhangi bir sorgu işe yarayacaktır.
Bunu göstermek için, showroomEmployees adlı yeni bir tablo oluşturmak üzere aşağıdaki CREATE TABLE işlemini çalıştırın. Bu tablodaki sütunların adlarının ve veri türlerinin, önceki bölümde kullanılan factoryEmployees tablosundaki üç sütunla aynı olduğunu unutmayın:
CREATE TABLE showroomEmployees (
name varchar(30),
hourlyWage decimal(4,2),
startDate date
);Output
Query OK, 0 rows affected (0.02 sec)Artık bu yeni tabloyu, daha önce INSERT INTO ifadesine bir SELECT sorgusu ekleyerek oluşturulan factoryEmployees tablosundaki bazı verilerle yükleyebilirsiniz.
SELECT sorgusu hedef tablodaki sütunlarla aynı sırada aynı sayıda sütun döndürüyorsa ve bunların eşleşen veri türleri varsa, INSERT INTO ifadesinden sütun listesini çıkarabilirsiniz:
INSERT INTO showroomEmployees
SELECT
factoryEmployees.name,
factoryEmployees.hourlyWage,
factoryEmployees.startDate
FROM factoryEmployees
WHERE name = 'Agnes';Output
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0Bu işlemdeki SELECT ifadesi, sorgunun yalnızca ad sütununda Agnes değeri bulunan factoryEmployees tablosundaki satırları döndürmesine neden olan bir WHERE ifadesi içerir. Kaynak tabloda yalnızca bir satır olduğundan, yalnızca bu satır showroomEmployees tablosuna kopyalanır.
Bunu doğrulamak için, showroom employees tablosundaki her kaydı döndüren aşağıdaki sorguyu çalıştırın:
SELECT * FROM showroomEmployees;
Output
+-------+------------+------------+
| name | hourlyWage | startDate |
+-------+------------+------------+
| Agnes | 26.50 | 2017-05-01 |
+-------+------------+------------+
1 row in set (0.00 sec)Kaynak tablodan birden fazla satır döndüren herhangi bir sorguyla birden fazla veri satırı ekleyebilirsiniz. Örneğin, aşağıdaki ifadedeki sorgu, factoryEmployees veritabanında name sütunundaki değer J ile başlamayan tüm kayıtları döndürür:
INSERT INTO showroomEmployees
SELECT
factoryEmployees.name,
factoryEmployees.hourlyWage,
factoryEmployees.startDate
FROM factoryEmployees
WHERE name NOT LIKE 'J%';Output
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0Showroom employees tablosundaki tüm kayıtları döndürmek için şu sorguyu tekrar çalıştırın:
SELECT * FROM showroomEmployees;
+--------+------------+------------+
| name | hourlyWage | startDate |
+--------+------------+------------+
| Agnes | 26.50 | 2017-05-01 |
| Agnes | 26.50 | 2017-05-01 |
| Harry | 26.50 | NULL |
| Marie | 27.88 | 2018-03-29 |
| Giles | 26.50 | 2019-08-06 |
| Daphne | 32.45 | 2017-11-12 |
+--------+------------+------------+
6 rows in set (0.00 sec)
Ad sütununda Agnes ile ilgili iki özdeş satır olduğunu fark edin. SELECT kullanan bir INSERT INTO ifadesini her çalıştırdığınızda, SQL sorgu sonuçlarını yeni bir veri kümesi olarak işler. Tablonuza belirli kısıtlamalar getirmediğiniz veya daha hassas sorgular oluşturmadığınız sürece, bu tür veriler eklediğinizde veritabanınızın yinelenen kayıtlarla yüklenmesini engelleyecek hiçbir şey yoktur.
Bilgileri otomatik olarak ekle
Bir tablo oluştururken, RDBMS'nin bunları otomatik olarak verilerle doldurmasına neden olacak belirli nitelikleri sütunlara uygulayabilirsiniz.
Örnek olarak, interns adlı bir tablo tanımlamak için aşağıdaki ifadeyi çalıştırın. Bu, üç sütunlu interns adlı bir tablo oluşturur. Bu örnekteki ilk sütun olan internID, int türünde verileri tutar. Ancak, AUTO_INCREMENT özniteliğini de içerdiğini unutmayın. Bu öznitelik, SQL'in her yeni satır için varsayılan olarak 1'den başlayıp sonraki her kayıtta birer birer artan benzersiz bir sayısal değer oluşturmasına neden olur.
Benzer şekilde, ikinci sütun olan section, DEFAULT anahtar sözcüğünü içerir. INSERT INTO ifadesinin sütun listesinden section'ı kaldırırsanız, RDBMS otomatik olarak varsayılan değeri ekler - bu örnekte "production":
CREATE TABLE interns (
internID int AUTO_INCREMENT PRIMARY KEY,
department varchar(20) DEFAULT 'production',
name varchar(30)
);Bu özellikleri göstermek için, aşağıdaki INSERT INTO ifadesini çalıştırarak Stajyerler tablosunu bazı verilerle yükleyin. Bu işlem yalnızca Ad sütununun değerlerini belirtir:
INSERT INTO interns (name) VALUES ('Pierre'), ('Sheila'), ('Francois');
Output
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0Daha sonra tablodaki tüm kayıtları döndürmek için şu sorguyu çalıştırın:
SELECT * FROM interns;
Output
+----------+------------+----------+
| internID | department | name |
+----------+------------+----------+
| 1 | production | Pierre |
| 2 | production | Sheila |
| 3 | production | Francois |
+----------+------------+----------+
3 rows in set (0.00 sec)Bu çıktı, sütun tanımlarından dolayı, önceki INSERT INTO ifadesinin, belirtilmemiş olmasına rağmen hem iç hem de dış bölümlere değer eklediğini göstermektedir.
Bir bölüm sütununa varsayılan değerden farklı bir değer eklemek için, INSERT INTO ifadesinde o sütunu şu şekilde belirtmeniz gerekir:
INSERT INTO interns (name, department)
VALUES
('Jacques', 'management'),
('Max', 'quality assurance'),
('Edith', 'management'),
('Daniel', DEFAULT);Output
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0Bu örnekte verilen son değer satırının, dize değeri yerine DEFAULT anahtar sözcüğünü içerdiğine dikkat edin. Bu, veritabanının varsayılan değeri ('production') eklemesine neden olur:
SELECT * FROM interns;
Output
+----------+-------------------+----------+
| internID | department | name |
+----------+-------------------+----------+
| 1 | production | Pierre |
| 2 | production | Sheila |
| 3 | production | Francois |
| 4 | management | Jacques |
| 5 | quality assurance | Max |
| 6 | management | Edith |
| 7 | production | Daniel |
+----------+-------------------+----------+
7 rows in set (0.00 sec)Sonuç
Bu kılavuzu okuyarak, VALUES anahtar sözcüğüyle tek tek veri satırlarını belirtmek, SELECT sorgularıyla tüm veri kümelerini kopyalamak ve SQL'in otomatik olarak veri ekleyeceği sütunları tanımlamak dahil olmak üzere, bir tabloya veri eklemenin birkaç farklı yolunu öğrendiniz.
Burada listelenen komutlar, SQL kullanan tüm veritabanı yönetim sistemlerinde çalışır. Her SQL veritabanının dilin kendine özgü bir uygulamasını kullandığını unutmayın; bu nedenle, INSERT INTO ifadesinin nasıl işlendiği ve bunun için kullanılabilen seçenekler hakkında daha kapsamlı bir açıklama için veritabanı yönetim sisteminizin belgelerine başvurmalısınız.









