İleri seviye SQL konusuna geçmeden önce veri tabanı konularına bakmanızı öneririm. Aşağıdaki linkten veya yukardaki veri tabanı konularından bakmanız ve öğrenmeniz gerekmektedir. İleri seviye SQL komutları aşağıdadır.
FOREIGN KEY KISITI
CREATE TABLE child_table
(
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
…
CONSTRAINT fk_name
FOREIGN KEY (child_col1)
REFERENCES parent_table (parent_col1)
ON DELETE CASCADE
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
);
UNION (BİRLEŞİM)

SELECT Txn_Date FROM Store_Information
UNION
SELECT Txn_Date FROM Internet_Sales;
INTERSECT (KESİŞİM)

SELECT Txn_Date FROM Store_Information
INTERSECT
SELECT Txn_Date FROM Internet_Sales;
MINUS (FARK)

SELECT Txn_Date FROM Store_Information
MINUS
SELECT Txn_Date FROM Internet_Sales;
SQL LIMIT

SELECT Store_Name, Sales, Txn_Date
FROM Store_Information
ORDER BY Sales DESC
LIMIT 2;

SQL InlIne vIew
CREATE TABLE User_Higher_Than_200
SELECT User_ID, SUM(Score) FROM User_Score
GROUP BY User_ID
HAVING SUM(Score) > 200;
SQL Subquery
SELECT “column_name1”
FROM “table_name1”
WHERE “column_name2” [Comparison Operator]
(SELECT “column_name3”
FROM “table_name2”
WHERE “condition”);
Subquery Örnek

SELECT SUM (Sales) FROM Store_Information
WHERE Store_Name IN
(SELECT Store_Name FROM Geography
WHERE Region_Name = ‘West’);
SQL Exists

SELECT SUM(Sales) FROM Store_Information
WHERE EXISTS
(SELECT * FROM Geography
WHERE Region_Name = ‘West’);
SQL Case
SELECT CASE (“column_name“)
WHEN “value1” THEN “result1”
WHEN “value2” THEN “result2”
…
[ELSE “resultN“]
END
FROM “table_name“;
SQL Case - Örnek

SELECT Store_Name, CASE Store_Name
WHEN ‘Los Angeles’ THEN Sales * 2
WHEN ‘San Diego’ THEN Sales * 1.5
ELSE Sales
END
“New Sales”,
Txn_Date
FROM Store_Information;
SQL Searched Case - Örnek

SELECT Store_Name, Txn_Date, CASE
WHEN Sales >= 1000 THEN ‘Good Day’
WHEN Sales >= 500 THEN ‘OK Day’
ELSE ‘Bad Day’
END
“Sales Status”
FROM Store_Information;
AUTO_INCREMENT (otomatik artan)
- Otomatik artan alanlar şöyle tanımlanır:
–CREATE TABLE TABLE_NAME
(PRIMARY_KEY_COLUMN INT NOT NULL AUTO_INCREMENT
…
PRIMARY KEY (PRIMARY_KEY_COLUMN));
- Örnek;
–CREATE TABLE USER_TABLE
(Userid int NOT NULL AUTO_INCREMENT,
Last_Name varchar(50),
First_Name varchar(50),
PRIMARY KEY (Userid));
- Veri girişi
–INSERT INTO USER_TABLE VALUES (‘Perry’, ‘Jonathan’);
SQL Fonksiyonları
SQL Function – Açıklama
AVG – Kolonun ortalamasını alır
COUNT – Kayıt sayısını verir
MAX – Kolonun maksimum değerini verir
MIN – Kolonun minimum değerini verir
SUM – Kolonun toplamını verir
ROUND – Kolon değerini yuvarlar
Tarih verileri ve sql
SELECT * FROM Orders WHERE OrderDate=’2008-11-11′
- Metinlerde olduğu gibi tırnak işareti içerisinde verilir. Sadece formatı tarih formatındadır.
Tarihlerle çalışırken metinlerle çalıştığımız gibi tek tırnakları kullanırız.
SELECT * FROM Orders WHERE OrderDate=’2008-11-11′
SQL Enjeksiyonu
SQL enjeksiyon, veri tabanınızı tahrip edebilecek bir kod enjeksiyon tekniğidir.
SQL enjeksiyonu en yaygın web hackleme tekniklerinden biridir.
SQL Injection, kötü amaçlı kodun SQL ifadelerine web sayfası girişi yoluyla yerleştirilmesidir.
Web Sayfalarında SQL
SQL enjeksiyonu genellikle bir kullanıcıdan kullanıcı adı / kullanıcı kimliği gibi bir giriş yapmasını istediğinizde ve bir ad / id yerine kullanıcı size bilmeden veri tabanında çalıştıracağınız bir SQL ifadesi verir .
Seçme dizesine bir değişken (txtUserId) ekleyerek bir SELECT ifadesi oluşturan aşağıdaki örneğe bakın. Değişken kullanıcı girdisinden alınır (getRequestString):
Örnek
txtUserId = getRequestString(“UserId”);
txtSQL = “SELECT * FROM Users WHERE UserId = ” + txtUserId;
Bu bölümün geri kalanında, SQL deyimlerinde kullanıcı girdisi kullanmanın olası tehlikeleri açıklanmaktadır.
1 = 1’e Dayalı SQL Enjeksiyonu Her Zaman Doğru
Yukarıdaki örneğe tekrar bakın. Kodun asıl amacı, belirli bir kullanıcı kimliği ile bir kullanıcıyı seçmek için bir SQL ifadesi oluşturmaktı.
Bir kullanıcının “yanlış” giriş yapmasını engelleyecek bir şey yoksa, kullanıcı şöyle bir “akıllı” giriş yapabilir:
Kullanıcı kimliği:
Sonra, SQL deyimi şöyle görünecek:
SELECT * FROM Users WHERE UserId = 105 OR 1=1;
Yukarıdaki SQL geçerlidir ve OR 1 = 1 her zaman DOĞRU olduğundan TÜM satırları “Kullanıcılar” tablosundan döndürür.
Yukarıdaki örnek tehlikeli görünüyor mu? Ya “Kullanıcılar” tablosu isimleri ve şifreleri içeriyorsa?
Yukarıdaki SQL deyimi bununla aynıdır:
SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;
Bir bilgisayar korsanı, bir veri tabanındaki tüm kullanıcı adlarına ve şifrelerine giriş alanına sadece 105 VEYA = 1 ekleyerek erişebilir.
“” = “” Tabanlı SQL Enjeksiyonu Her Zaman Doğru
İşte bir web sitesinde kullanıcı girişi örneği:
Kullanıcı adı:
Parola:
Örnek
uName = getRequestString(“username”);
uPass = getRequestString(“userpassword”);
sql = ‘SELECT * FROM Users WHERE Name =”‘ + uName + ‘” AND Pass =”‘ + uPass + ‘”‘
Sonuç
SELECT * FROM Users WHERE Name =”John Doe” AND Pass =”myPass”
Bir bilgisayar korsanı, kullanıcı adına veya şifre metin kutusuna “OR” “=” ekleyerek veritabanındaki kullanıcı adlarına ve şifrelere erişebilir:
Kullanıcı adı:
Parola:
Sunucudaki kod şöyle bir geçerli SQL ifadesi oluşturur:
Sonuç
SELECT * FROM Users WHERE Name =”” or “”=”” AND Pass =”” or “”=””
Yukarıdaki SQL geçerlidir ve OR “” = “” her zaman TRUE olduğundan tüm satırları “Kullanıcılar” tablosundan döndürür.
Toplu SQL İfadelerine Dayalı SQL Enjeksiyonu
Çoğu veritabanı toplu SQL deyimini destekler.
Bir grup SQL ifadesi, noktalı virgüllerle ayrılmış iki veya daha fazla SQL ifadesinden oluşan bir gruptur.
Aşağıdaki SQL ifadesi, “Kullanıcılar” tablosundaki tüm satırları döndürür, ardından “Tedarikçiler” tablosunu siler.
Örnek
SELECT * FROM Users; DROP TABLE Suppliers
Aşağıdaki örneğe bakın:
Örnek
txtUserId = getRequestString(“UserId”);
txtSQL = “SELECT * FROM Users WHERE UserId = ” + txtUserId;
Ve aşağıdaki giriş:
Kullanıcı kimliği:
Geçerli SQL deyimi şöyle görünür:
Sonuç
SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;
Koruma için SQL Parametrelerini Kullan
Bir web sitesini SQL enjeksiyonundan korumak için SQL parametrelerini kullanabilirsiniz.
SQL parametreleri, yürütme zamanında bir SQL sorgusuna kontrollü bir şekilde eklenen değerlerdir.
ASP.NET Razor Örneği
txtUserId = getRequestString(“UserId”);
txtSQL = “SELECT * FROM Users WHERE UserId = @0”;
db.Execute(txtSQL,txtUserId);
Parametrelerin SQL ifadesinde bir @ işaretleyici ile temsil edildiğini unutmayın.
SQL motoru, sütununun doğru olup olmadığından ve yürütülecek SQL’in bir parçası olarak tam anlamıyla ele alınmadığından emin olmak için her parametreyi kontrol eder.
Başka bir örnek
txtNam = getRequestString(“CustomerName”);
txtAdd = getRequestString(“Address”);
txtCit = getRequestString(“City”);
txtSQL = “INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)”;
db.Execute(txtSQL,txtNam,txtAdd,txtCit);
Örnekler
Aşağıdaki örnekler, bazı yaygın web dillerinde parametreli hale getirilmiş sorguların nasıl oluşturulduğunu gösterir.
ASP.NET’TE SEÇİM TABLOSU:
txtUserId = getRequestString(“UserId”);
sql = “SELECT * FROM Customers WHERE CustomerId = @0”;
command = new SqlCommand(sql);
command.Parameters.AddWithValue(“@0”,txtUserID);
command.ExecuteReader();
ASP.NET’teki BİLDİRİME INSERT:
txtNam = getRequestString(“CustomerName”);
txtAdd = getRequestString(“Address”);
txtCit = getRequestString(“City”);
txtSQL = “INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)”;
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue(“@0”,txtNam);
command.Parameters.AddWithValue(“@1”,txtAdd);
command.Parameters.AddWithValue(“@2”,txtCit);
command.ExecuteNonQuery();
PHP BİLDİRİMİNE INSERT:
$stmt = $dbh->prepare(“INSERT INTO Customers (CustomerName,Address,City)
VALUES (:nam, :add, :cit)”);
$stmt->bindParam(‘:nam’, $txtNam);
$stmt->bindParam(‘:add’, $txtAdd);
$stmt->bindParam(‘:cit’, $txtCit);
$stmt->execute();
İleri seviye SQL Dili konusundan Bir önceki veri tabanı konusuna geçmek için — Tıklayınız