3.4. Bir Tablonun Sorgulanması

Bir tablodan verileri almak için tablo sorgulanır. Bunun için bir SQL cümlesi olan SELECT kullanılır. Cümle, bir seçim listesi (istenen sütunları içeren bir liste), bir tablo listesi (verilerin alınacağı tabloların listesi) ve isteğe bağlı bir niteleme (sınırlamaların belirtildiği kısım) içerir. Örneğin, hava_durumu tablosundaki satırların tamamını almak için şunu yazın:

SELECT * FROM hava_durumu;

Burada *, "tüm sütunlar" anlamına gelen bir kısayoldur.[65]

Yani, aynı sonuç böyle de alınacaktır:

SELECT il, asg_sck, azm_sck, yağış, tarih FROM hava_durumu;

Çıktı şöyle olmalıdır:

      il       | asg_sck | azm_sck | yağış |   tarih
---------------+---------+---------+-------+------------
 San Francisco |      46 |      50 |  0.25 | 1994-11-27
 San Francisco |      43 |      57 |     0 | 1994-11-29
 Hayward       |      37 |      54 |       | 1994-11-29
(3 satır)

Seçim listesinde sadece sütun isimlerini değil, ifadeleri de kullanabilirsiniz. Örnek:

SELECT il, (asg_sck+azm_sck)/2 AS ort_sck, tarih FROM hava_durumu;

Bunun çıktısı şöyle olacaktır:

      il       | ort_sck |   tarih
---------------+---------+------------
 San Francisco |      48 | 1994-11-27
 San Francisco |      50 | 1994-11-29
 Hayward       |      45 | 1994-11-29
(3 satır)

AS deyiminin çıktılanacak sütunu yeniden isimlendirmekte nasıl kullanıldığına dikkat edin. (AS deyimi isteğe bağlıdır.)

Bir sorgu, istenen satırların yerini belirtmek üzere bir WHERE deyimi eklenerek nitelikli yapılabilir. WHERE deyimi bir mantıksal ifade içerir ve sadece mantıksal ifadeyi doğrulayan satırlar döndürülür. Niteleme amacıyla mantıksal işleçlere (AND, OR ve NOT) izin verilir. Örneğin, San Francisco'nun yağışlı olduğu günleri bulalım:

SELECT * FROM hava_durumu
     WHERE il = 'San Francisco' AND yağış > 0.0;

Sonuç:

      il       | asg_sck | azm_sck | yağış |   tarih
---------------+---------+---------+-------+------------
 San Francisco |      46 |      50 |  0.25 | 1994-11-27
(1 satır)

Sorgu sonucunun sıralanmış olmasını da isteyebilirsiniz:

SELECT * FROM hava_durumu
    ORDER BY il;

Sonuç:

      il       | asg_sck | azm_sck | yağış |   tarih
---------------+---------+---------+-------+------------
 Hayward       |      37 |      54 |       | 1994-11-29
 San Francisco |      46 |      50 |  0.25 | 1994-11-27
 San Francisco |      43 |      57 |     0 | 1994-11-29
(3 satır)

Bu örnekte, sıralamanın nasıl yapılacağı tam olarak belirtilmemiştir, dolayısıyla hangi San Fransisco satırının önce geleceği belli olmaz. Fakat aşağıdaki sorgu daima bu sıralamayla dönecektir.

SELECT * FROM hava_durumu
    ORDER BY il, asg_sck;

Bir sorgunun sonucundan yinelenmiş satırların kaldırılmasını isteyebilirsiniz:

mydb=> SELECT DISTINCT il
    FROM hava_durumu;

Sonuç:

      il
---------------
 Hayward
 San Francisco
(2 satır)

Burada da yine satırların sırası her sorguda farklı olabilir. Sonucun istediğimiz sırada olmasını DISTINCT ve ORDER BY deyimlerini birlikte kullanarak sağlayabilirsiniz[66]:

SELECT DISTINCT il
    FROM hava_durumu
    ORDER BY il;


[65] SELECT * kolay bir sorgulama olarak kullanışlı gibi görünse de, tabloya bir sütun eklemek sonuçları değiştireceğinden uygulamada çoğunlukla kötü bir tarz olarak kabul edilir.

[66] Bazı veritabanı sistemlerinde ve PostgreSQL'in eski sürümlerinde DISTINCT gerçeklenimi sıralamayı özdevimli yaptığından ORDER BY gereksizdir. Fakat bunun böyle olması SQL standardının bir zorlaması değildir ve şimdiki PostgreSQL DISTINCT deyiminin satırları sıralayacağını garanti etmemektedir.