SQL Sorgulama Dili,Yerel SQL ve Dil Takımı
SQL Sorgulama Dili adı altında yeni bir makale dizisine başladık "SQL sorgulama dili" adlı makale dizimiz bittikten sonra  "Veritabanı Uygulamaları Geliştirmek" adlı makale dizimize TQuery bileşeni ile devam edeceğiz. Makale dizimizin bu bölümünde SQL sorgulama dilinin Borland firması tarafından geliştirilen türevi Yerel SQL sorgulama dilini anlatacağız. Ayrıca Yerel SQL'in dil takımı üzerinde de duracağız.Yerel SQL dil takımında tablo isimlerinin, saha isimlerinin ve referansların, tarih ve zaman biçimlemelerinin, boolean ifadelerin kendine ait yazım kurallarını anlatacağız.SQL Sorgulama dilini bilen kişilerin bile bu makale dizisini dikkatle takip etmesini tavsiye ederim.
Yerel SQL
Yerel SQL Nedir?
Yerel SQL dBASE, Paradox ve FoxPro tablolarına ulaşmak için kullanılan SQL-92 standartının bir alt türevidir. Yerel SQL ifadelerine uygulamalardan erişilirken, BDE bu ifadeleri BDE API fonksiyonlarına dönüştürür.
SQL ifadeleri iki katagoriye ayrılır: Veri İşletme Dili (DML) ve Veri Tanımlama Dili (DDL)
DML tablo verilerini taramak,eklemek,güncellemek, silmek için kullanılan SQL ifadeleri içerir. Örnek olarak SELECT bir DML ifadesidir.
DDL tabloları yaratmak, değiştirmek, ve silmek için kullanılan SQL ifadelerini içerir. Örnek olarak CREATE TABLE ve DROP INDEX DDL SQL ifadelerindendir.
Yerel SQL Dil Takımı
Bu makale dizisinde vereceğim örneklerin daha iyi anlaşılabilmesi için önce size SQL anlatım geleneklerini anlatmayı uygun gördüm.
vereceğim örneklerde tüm SQL örnekleri Courier New fontunda olacaktır. Ayrıca yerel SQL büyük küçük harf duyarlı olmasa da dil elemenlteri ile diğer elementleri kolayca ayırabilmeniz için tüm dil elementleri büyük harfle diğer elementler ise küçük harflae yazılmıştır.
Örneklerde kullanılma imkanı bulunan fakat kullanmak zorunda olmadığınız dil elementleri köşeli parantez ( [ ve ] ) arasına alınacaktır. Örneğin aşağıdaki örnekte DISTINCT anahtar kelimesi seçimliktir.
SELECT [DISTINCT] * 
Örneklerde birden çok seçenekten birini seçmek söz konusu ise seçenekler dikey çubuk karakteri ayrılacaktır. Örneğin aşağıdaki gibi bir SQL ifadesinde bir saha referansı için ASC yada DESC ifadelerinden sadece biri kullanılabilir. Aynı zamanda bu ASC veDESC ifadeleri seçimliktir.
ORDER BY saha_referansi [ASC | DESC]
Not: Kesinlikle tek dikey çubuk karakterini SQL dilinde kullanılan çift çubuk karakterleri ile karıştırmayın.( | | )
Yerel SQL kullanılırken bazı kurallara uyulması gerekir örneğin SQL ifadelerinden komutlarından yada fonksiyonlarıdan herhangi birini değişken, saha referansı,Parametre vb. olarak kullanamazsınız. Ayrıca tablo isimlerinin, saha isimlerinin ve referanslarıın, tarih ve zaman biçimlemelerinin, boolean ifadelerin kendine göre yazım kuralları vardır. Bu tanımlamalar aşağıda verilmiştir.
Tablo İsimleri:
ANSI-standard SQL'de, tablo isimleri Türkçe karakterler içermeyen tek bir kelimeden yada aralarında boşluk yerine "_" karakteri içeren birden çok kelimeden oluşabilir. Fakat Yerel SQL birden çok kelime içeren tablo isimlerine izin verir.
Yerel SQL tam dosya adı ve yol tanımlamalarına izin verir. Tablo tek yada çift tırnak arasında bir dosya yolu yada dosya adı tanımlaması ile gösterilir.Örneğin:
SELECT *
FROM 'parts.dbf'
SELECT *
FROM "c:örnekparts.dbf"
Yerel SQL BDE alias tablo referanslarını da destekler. Örneğin:
SELECT *
FROM ":pdox:table1"
Eğer dosya uzantısını ihmal etmek istiyorsanız, tablonun tipi BDE'de varsayılan tablo tipi olmalıdır. Yada SQL ifadenizde alias kullandığınız taktirde tablonun uzantısını yoksayabiliriz. 
Son olarak eğer tablonuzun adı SQL ifadelerinden biri ise bunu tek yada çift tırnak arasına alarak kullanabiliriz. Örneğin:
SELECT passid
FROM "password"
Saha adları ve referansları:
ANSI-standard SQL'de, kolon isimleri ve referansları Türkçe karakterler içermeyen tek bir kelimeden yada aralarında boşluk yerine "_" karakteri içeren birden çok kelimeden oluşabilir. Fakat Yerel SQL birden çok kelime içeren kolon isimlerine ve referanslarına izin verir.
Yerel SQL Paradox'un çok kelimeden oluşan saha isimlerini ve referanslarını destekler.
Eğer Paradox tablosunun bir sahası SQL ifadesiyle aynı adı taşıyorsa tek yada çift tırnakla çevrilerek kullanılır ve Önüne tablo adını yada tablo referansını alır.Tablo adı yada referansı saha adı yada referansından bir nokta ile ayrılır. Aşağıdaki örnekte saha adı iki kelimeden oluşmuştur: 
SELECT E."Emp Id"
FROM employee E
Bir sonraki örnek DATE SQL anahtar kelimesini içeren bir saha adını nı nasıl tanımlandığını gösterir:
SELECT datelog."date"
FROM datelog
Tarih Biçimleri:
Yerel SQL tarih tanımlarını Amerikan tarih biçimine göre ayarlar. Diğer tarih biçimlerini desteklemez. Amerikan tarih biçimi AA/GG/YY yada AA/GG/YYYY olarak iki çeşittir. Tarih kullanımımnda bir hataya mahal vermemek için tarih değerleri tek yada çift tırnak içine alınırlar. Eğer tarih değerini tırnak içine almazsak örneğin 17/7/2000 tarihini 17 bölü 7 bölü 2000 olarak algılayacaktır.Aşağıda tarih değerinin SQL ifadelerinde nasıl kullanılacağına dair bir örnek verilmiştir.
SELECT *
FROM orders
WHERE (saledate <= "1/23/1998") 
Tek haneli günlerin yada ayların başlarına sıfır eklemek seçimliktir.
Eğer yüzyıl yıl içinde tanımlanmamışsa BDE ayarlarından FOURDIGITYEAR parametresi yüzyılı kontrol eder. Eğer FALSE ise yıllar sadece iki hane ile tanımlanır. Eğer rakam 0 ile 49 arasında ise 21'ci yüzyılı 50 ile 99 arasında ise 20'ci yüzyılı tanımlar. Örneğin 5/5/1998 tarihi 5/5/98 olarak tanımlanır. 17/7/2000 tarihi ise 17/7/00 olarak tanımlanır. Eğer TRUE ise 17/7/00 tarihi Milattan sonra 0'cı yıl olarak anlaşılır.
Zaman Biçimleri:
Yerel SQL saat biçimlerinin ss:dd:nn AM/PM (ss saat, dd dakika, nn saniye) olarak ayarlanmasını ister. zaman değeri ile birlikte yeni bir kayıt eklerken AM/PM kullanımı seçimliktir ve büyük küçük harf ayrımı yapılmaz (yani AM yerine am yazabilirsiniz.)Tanımlama tırnak işaretleri arasında olmalıdır.
INSERT INTO WorkOrder
(ID, StartTime)
VALUES ("B00120","10:30:00 PM")
Eğer AM yada PM etiketlerinden herhangi biri kullanılmışsa bu yarım gün uygulamasının kullanılacağı anlamına gelir ve saat 12 ile karşılaştırılır. Eğer saat 12den küçükse AM büyükse PM olur Saat sahsı AM/PM tasarımını değiştirebilir. Örneğin "15:03:22 AM" "3:03:22 PM" değerine çevrilir.
Boolean ifadeler:
Boolean ifadeler TRUE ve FALSE tırnak işaretleri ile çevrilerek yada çevrilmeden kullanılabilir.
SELECT *
FROM transfers
WHERE (paid = TRUE) AND NOT (incomplete = "FALSE")
Tablo Referans Adları:
tablo referans adları tablo ile bir kolonu ilişkilendirmek için kullanılır. bu genellikle farklı tablolardan gelen adları aynı birden çok sahanın SQL ifadesi içinde kullanılırken çok büyük kolaylık sağlar. Bir tablo referans adı FROM ifadesinde tanımlanır.Bu tanımlayıcı yada tablo referans adıbir kolon adının ön eki olarak kullanılabilir.
Eğer tablo ismi tırnak işaretleri arasında değilse tablo adı varsayılan referans adı olarak kullanılır. 
SELECT *
FROM customer
LEFT OUTER JOIN orders
ON (customer.custno = orders.custno)
Eğer tablo ismi tırnak işaretli bir ifade ise aşağıdaki gibi tırnak işaretleri ile birlikte kullanabilirsiniz.
SELECT *
FROM "customer.db"
LEFT OUTER JOIN "orders.db"
ON ("customer.db".custno = "orders.db".custno)
Eğer tırnak işaretinin arasındaki ifade çok uzunsa bu tanımlamayı FROM ifadesinden sonra başka bir ifadeye atayarak kullanabilirsiniz.
SELECT *
FROM "customer.db" CUSTOMER
LEFT OUTER JOIN "orders.db" ORDERS
ON (CUSTOMER.custno = ORDERS.custno)
Saha Refereansları:
Saha referansları bir sahayı,hesaplanan saha değer kümesini yada bir SQL ifadesini ad olarak barındıran sahayı farklı bir adla tanımlamaya yarar. Saha referansları kesinlikle çift tırnak arasına alınamaz. Bir saha referansı tanımlamak için saha referansı tanımlanacak olan tanımlamadan sonra AS anahtar kelimesini kullanıp saha referans adını AS anahtar kelimesinden sonra yazmalıyız.Aşağıdaki ifade de Sub ve Word tanımlamaları saha referansıdır.
SELECT SUBSTRING(company FROM 1 FOR 1) AS sub, "Text" AS word
FROM customer
Açıklama Tanımlamak:
Eğer SQL ifadenizin daha anlaşılır olmasını istiyorsanız içine açıklama yazabilirsiniz. Açıklamanız /* ile başlayıp */ ile sona ermelidir. başlangıç ve sondaki işaretler açıklama ile aynı satırda olmak zorunda değildir.
/*
Merhaba Televole
*/
SELECT SUBSTRING(company FROM 1 FOR 1) AS sub, "Text" AS word
FROM customer
Açıklamalar aynı zamanda SQL ifadeleri de içerebilirler İfadeleriniz eğer Açıklama içinde ise yoksayılacaklardır.Açıklamalar özellikle SQL ifadelerinizi test etmek istediğinizde çok işe yarat.Her satırı ayrı ayrı açıklama içine alarak hatanın nerede olduğunu bulabilirsiniz.
SELECT company
FROM customer
/* WHERE (state = "TX") */
ORDER BY company
SQL tanımlı kelimeler:
SQL ifadeleri tanımlamak için bazı kelimeleri kullanmıştır. Biz sorgularımızda bu isimleri kullanamayız. Eğer kullanırsanız Invalid use of keyword error hata mesajını alırsınız.Aşağıda bahsettiğimiz ifadelerin alfabetik bir listesini görüyorsunuz.
    
        
            | ACTIVEADD
 ALL
 AFTER
 ALTER
 AND
 ANY
 AS
 ASC
 ASCENDING
 AT
 AUTO
 AUTOINC
 AVG
 BASE_NAME
 BEFORE
 BEGIN
 BETWEEN
 BLOB
 BOOLEAN
 BOTH
 BY
 BYTES
 CACHE
 CAST
 CHAR
 CHARACTER
 CHECK
 CHECK_POINT_LENGTH
 COLLATE
 COLUMN
 COMMIT
 COMMITTED
 COMPUTED
 CONDITIONAL
 CONSTRAINT
 CONTAINING
 COUNT
 CREATE
 CSTRING
 CURRENT
 CURSOR
 DATABASE
 DATE
 DAY
 DEBUG
 DEC
 DECIMAL
 DECLARE
 DEFAULT
 DELETE
 DESC
 DESCENDING
 DISTINCT
 | DODOMAIN
 DOUBLE
 DROP
 ELSE
 END
 ENTRY_POINT
 ESCAPE
 EXCEPTION
 EXECUTE
 EXISTS
 EXIT
 EXTERNAL
 EXTRACT
 FILE
 FILTER
 FLOAT
 FOR
 FOREIGN
 FROM
 FULL
 FUNCTION
 GDSCODE
 GENERATOR
 GEN_ID
 GRANT
 GROUP
 GROUP_COMMIT_WAIT_TIME
 HAVING
 HOUR
 IF
 IN
 INT
 INACTIVE
 INDEX
 INNER
 INPUT_TYPE
 INSERT
 INTEGER
 INTO
 IS
 ISOLATION
 JOIN
 KEY
 LONG
 LENGTH
 LOGFILE
 LOWER
 LEADING
 LEFT
 LEVEL
 LIKE
 LOG_BUFFER_SIZE
 | MANUALMAX
 MAXIMUM_SEGMENT
 MERGE
 MESSAGE
 MIN
 MINUTE
 MODULE_NAME
 MONEY
 MONTH
 NAMES
 NATIONAL
 NATURAL
 NCHAR
 NO
 NOT
 NULL
 NUM_LOG_BUFFERS
 NUMERIC
 OF
 ON
 ONLY
 OPTION
 OR
 ORDER
 OUTER
 OUTPUT_TYPE
 OVERFLOW
 PAGE_SIZE
 PAGE
 PAGES
 PARAMETER
 PASSWORD
 PLAN
 POSITION
 POST_EVENT
 PRECISION
 PROCEDURE
 PROTECTED
 PRIMARY
 PRIVILEGES
 RAW_PARTITIONS
 RDB$DB_KEY
 READ
 REAL
 RECORD_VERSION
 REFERENCES
 RESERV
 RESERVING
 RETAIN
 RETURNING_VALUES
 RETURNS
 REVOKE
 RIGHT
 | ROLLBACKSECOND
 SEGMENT
 SELECT
 SET
 SHARED
 SHADOW
 SCHEMA
 SINGULAR
 SIZE
 SMALLINT
 SNAPSHOT
 SOME
 SORT
 SQLCODE
 STABILITY
 STARTING
 STARTS
 STATISTICS
 SUB_TYPE
 SUBSTRING
 SUM
 SUSPEND
 TABLE
 THEN
 TIME
 TIMESTAMP
 TIMEZONE_HOUR
 TIMEZONE_MINUTE
 TO
 TRAILING
 TRANSACTION
 TRIGGER
 TRIM
 UNCOMMITTED
 UNION
 UNIQUE
 UPDATE
 UPPER
 USER
 VALUE
 VALUES
 VARCHAR
 VARIABLE
 VARYING
 VIEW
 WAIT
 WHEN
 WHERE
 WHILE
 WITH
 WORK
 WRITE
 YEAR
 | 
    
 
AşağıdaYerel SQL'de bulunan operatörlerleri görüyorsunuz.Bu operatörler kesinlikle hiç bir referansın yada ismin içinde kullanılamazlar.
    
        
            | | | | - | * | / | <>  | <  | >  | , | 
        
            | = | <= | >= | ~= | != | ^= | ( | ) | 
    
 
Yerel SQL'in Desteklemediği Elementler:
Aşağıdaki SQL-92 elementleri Yerel SQL'de kullanılamazlar.
    
        
            | ALLOCATE CURSOR (Komut)ALLOCATE DESCRIPTOR (Komut)
 ALTER DOMAIN (Komut)
 CASE (Deyim)
 CHECK (Sabit)
 CLOSE (Komut)
 COALESCE (Deyim)
 COMMIT (Komut)
 CONNECT (Komut)
 CONVERT (Fonksiyon)
 CORRESPONDING BY (Deyim)
 CREATE ASSERTION (Komut)
 CREATE CHARACTER SET (Komut)
 CREATE COLLATION (Komut)
 CREATE DOMAIN (Komut)
 CREATE SCHEMA (Komut)
 CREATE TRANSLATION (Komut)
 CREATE VIEW (Komut)
 CROSS JOIN (İlişki Operatörü)
 CURRENT_DATE (Fonksiyon)
 CURRENT_TIME (Fonksiyon)
 CURRENT_TIMESTAMP (Fonksiyon)
 DEALLOCATE DESCRIPTOR (Komut)
 DEALLOCATE PREPARE (Komut)
 DECLARE CURSOR (Komut)
 DECLARE LOCAL TEMPORARY TABLE (Komut)
 DESCRIBE (Komut)
 DISCONNECT (Komut)
 DROP ASSERTION (Komut)
 DROP CHARACTER SET (Komut)
 DROP COLLATION (Komut)
 DROP DOMAIN (Komut)
 DROP SCHEMA (Komut)
 | DROP TRANSLATION (Komut)DROP VIEW (Komut)
 EXCEPT (İlişki Operatörü)
 EXECUTE (Komut)
 EXECUTE IMMEDIATE (Komut)
 FETCH (Komut)
 FOREIGN KEY (Sabit)
 GET DESCRIPTOR (Komut)
 GET DIAGNOSTICS (Komut)
 GRANT (Komut)
 INTERSECT (İlişki Operatörü)
 MATCH (Yüklem)
 NATURAL (İlişki Operatörü)
 NULLIF (Deyim)
 OPEN (Komut)
 OVERLAPS (Yüklem)
 PREPARE (Komut)
 REFERENCES (Sabit)
 REVOKE (Komut)
 ROLLBACK (Komut)
 Row value constructorsSET CATALOG (Komut)
 SET CONNECTION (Komut)
 SET CONSTRAINTS MODE (Komut)
 SET DESCRIPTOR (Komut)
 SET NAMES (Komut)
 SET SCHEMA (Komut)
 SET SESSION AUTHORIZATION (Komut)
 SET TIME ZONE (Komut)
 SET TRANSACTION (Komut)
 TRANSLATE (Fonksiyon)
 UNIQUE (Yüklem)
 USING (İlişki Operatörü)
 |