ضمائم SQL؛ پایگاه داده تمرین، پاسخ تمرین‌ها، خلاصه نحو، نقد و منابع

ضمائم راهنمای SQL

توسط admin | گروه SQL Server | 1405/05/16

نظرات 0

ضمائم راهنمای SQL

نشان فصل AضمائمA

ضمائم شامل پایگاه دادهٔ تمرین، پاسخ تمرین‌ها، خلاصهٔ نحو، نقدی کوتاه، مطالعهٔ پیشنهادی و نمایه است.

پایگاه دادهٔ تمرین

جدول‌های زیر پایگاه دادهٔ منطقیِ همهٔ مثال‌ها و تمرین‌ها را تشکیل می‌دهند. توجه کنید جدول‌های واقعی نصب‌شده در کلاس شما ردیف‌های بسیار بیشتری خواهند داشت.

PERSONS
PERSONNAMEBDATEGENDERCOUNTRYJOB
1Einstein1879-03-20MaleGermanyS
2Dickinson1812-07-22MaleEnglandW
3Dickinson1830-07-15FemaleUSAW
COUNTRIES
COUNTRYPOPAREAGNPLANGUAGELITERACY
Germany813375411378231331000German100
USA26381403236791926380000English95
England5829511994251980200English99
ARMIES
COUNTRYBUDGETTROOPSTANKSSHIPSPLANES
Germany35200367300285532300
USA28060016505001452423010600
England4170025430092152340
JOBS
JOBTITLE
SScientist
EEntertainer
WWriter
RELIGIONS
COUNTRYRELIGIONPERCENT
GermanyProtestant45
GermanyCatholic37
EnglandCatholic30

POP بر حسب نفر، AREA بر حسب مایل مربع و GNP بر حسب میلیون دلار است. LANGUAGE زبان اصلی کشور و LITERACY درصد باسوادی است. BUDGET بر حسب میلیون دلار و TROOPS فقط نیروهای فعال است. این جدول‌ها فقط برای مقاصد تصویری/آموزشی هستند؛ در تولید این پایگاه داده هیچ حیوانی آسیب ندیده است.

پاسخ تمرین‌ها

صفحهٔ ۱۰

  1. مهربان‌ترین و بزرگوارترین مدرس، آیا ممکن است آموزش کوتاهی دربارهٔ استفاده از پایگاه دادهٔ کلاس به ما بدهید؟
SQL
SELECT *
FROM PERSONS
SQL
SELECT *
FROM COUNTRIES
SQL
SELECT *
FROM ERRORS

این پرس‌وجو یک خطای نحوی ایجاد می‌کند.

SQL
SELECT *
FROM ARMIES
SQL
SELECT *
FROM MYCOLUMNS
SQL
SELECT *
FROM HOW-WOULD-WE-KNOW-WHAT-YOU-PICKED

صفحهٔ ۱۲

SQL
SELECT JOB
FROM JOBS
SQL
SELECT NAME, BDATE
FROM PERSONS
SQL
SELECT PERCENT, RELIGION, COUNTRY
FROM RELIGIONS
SQL
SELECT COUNTRY, POP, AREA, GNP, LANGUAGE, LITERACY, COUNTRY
FROM COUNTRIES
SQL
SELECT *, COUNTRY
FROM COUNTRIES

صفحهٔ ۱۶

SQL
SELECT *
FROM COUNTRIES

SELECT *
FROM COUNTRIES
WHERE AREA < 30
SQL
SELECT NAME, COUNTRY
FROM PERSONS

SELECT NAME, COUNTRY
FROM PERSONS
WHERE COUNTRY = 'CANADA'
SQL
SELECT NAME, BDATE
FROM PERSONS
WHERE BDATE > '1964-01-01'
SQL
SELECT BDATE
FROM PERSONS
WHERE NAME = 'O''TOOLE'

به دو کوتیشن متوالی در رشته توجه کنید. تاریخ تولد O'Toole برابر 1932-08-12 است.

صفحهٔ ۱۹

SQL
SELECT *
FROM PERSONS
WHERE COUNTRY = 'IRELAND'

SELECT *
FROM PERSONS
WHERE COUNTRY = 'IRELAND'
ORDER BY NAME
SQL
SELECT *
FROM COUNTRIES
WHERE LANGUAGE = 'GERMAN'

SELECT *
FROM COUNTRIES
WHERE LANGUAGE = 'GERMAN'
ORDER BY GNP DESC
SQL
SELECT COUNTRY, JOB, NAME
FROM PERSONS
WHERE COUNTRY = 'ITALY'
ORDER BY NAME
SQL
SELECT *
FROM ARMIES
ORDER BY BUDGET DESC

ایالات متحده بزرگ‌ترین بودجه را دارد.

SQL
SELECT *
FROM ARMIES
ORDER BY BUDGET

ویتنام کوچک‌ترین بودجه را دارد. چین بیشترین نیرو، روسیه بیشترین تانک و کشتی، و ایالات متحده بیشترین هواپیما را دارد.

صفحهٔ ۲۱

SQL
SELECT JOB
FROM PERSONS

SELECT DISTINCT JOB
FROM PERSONS
SQL
SELECT LANGUAGE
FROM COUNTRIES
WHERE LITERACY < 30
ORDER BY LANGUAGE

SELECT DISTINCT LANGUAGE
FROM COUNTRIES
WHERE LITERACY < 30
ORDER BY LANGUAGE
SQL
SELECT COUNTRY
FROM PERSONS
WHERE JOB = 'S'
ORDER BY COUNTRY

SELECT DISTINCT COUNTRY
FROM PERSONS
WHERE JOB = 'S'
ORDER BY COUNTRY
SQL
SELECT RELIGION
FROM RELIGIONS
WHERE PERCENT < 5
ORDER BY RELIGION

SELECT DISTINCT RELIGION
FROM RELIGIONS
WHERE PERCENT < 5
ORDER BY RELIGION

صفحهٔ ۲۴

SQL
SELECT COUNTRY
FROM COUNTRIES
WHERE COUNTRY LIKE '%GUINEA%'
SQL
SELECT *
FROM PERSONS
WHERE NAME LIKE '_Z%'
SQL
SELECT *
FROM PERSONS
WHERE BDATE LIKE '%07-15'
SQL
SELECT *
FROM PERSONS
WHERE NAME LIKE '%''%'
SQL
SELECT DISTINCT RELIGION
FROM RELIGIONS
WHERE RELIGION LIKE '%ORTHODOX%'
ORDER BY RELIGION

صفحهٔ ۲۶

SQL
SELECT *
FROM PERSONS
WHERE JOB = 'S'
AND COUNTRY = 'GERMANY'
SQL
SELECT *
FROM COUNTRIES
WHERE GNP < 3000
AND LITERACY < 40
ORDER BY GNP
SQL
SELECT COUNTRY, LITERACY
FROM COUNTRIES
WHERE LITERACY >= 55
AND LITERACY <= 60
SQL
SELECT *
FROM PERSONS
WHERE COUNTRY = 'ENGLAND'
AND BDATE LIKE '15%'
ORDER BY NAME
SQL
SELECT *
FROM ARMIES
WHERE TROOPS > 100000
AND TANKS < 1000
AND SHIPS < 1000
AND PLANES < 1000

صفحهٔ ۲۸

SQL
SELECT *
FROM COUNTRIES
WHERE AREA BETWEEN 5 AND 75
SQL
SELECT *
FROM COUNTRIES
WHERE POP BETWEEN 100000 AND 200000
SQL
SELECT *
FROM ARMIES
WHERE PLANES BETWEEN 301 AND 399
SQL
SELECT *
FROM ARMIES
WHERE TROOPS >= 300000
AND BUDGET BETWEEN 10000 AND 100000

صفحهٔ ۳۰

SQL
SELECT *
FROM ARMIES
WHERE COUNTRY = 'ISRAEL'
OR COUNTRY = 'IRAQ'
SQL
SELECT *
FROM PERSONS
WHERE BDATE = '1835-10-19'
OR BDATE = '1917-02-06'
SQL
SELECT NAME, BDATE
FROM PERSONS
WHERE NAME = 'POE'
OR NAME = 'HUGO'
OR NAME = 'DAHL'
SQL
SELECT *
FROM PERSONS
WHERE BDATE LIKE '12%'
OR BDATE LIKE '14%'

پنج نفر در این دوره متولد شده‌اند.

صفحهٔ ۳۲

SQL
SELECT *
FROM PERSONS
WHERE NAME IN ('EINSTEIN','GALILEI','NEWTON')
SQL
SELECT *
FROM COUNTRIES
WHERE LITERACY IN (20,40,60)
SQL
SELECT NAME, COUNTRY
FROM PERSONS
WHERE JOB = 'S'
AND COUNTRY IN ('GERMANY','AUSTRIA','ITALY')
SQL
SELECT *
FROM PERSONS
WHERE JOB IN ('W','E','B')
AND COUNTRY IN ('GERMANY','AUSTRIA','ITALY')

صفحهٔ ۳۴

SQL
SELECT *
FROM COUNTRIES
WHERE GNP IS NULL
SQL
SELECT *
FROM PERSONS
WHERE JOB = 'E'
AND GENDER IS NULL
SQL
SELECT *
FROM PERSONS
WHERE COUNTRY = 'ISRAEL'
AND BDATE IS NULL
SQL
SELECT *
FROM COUNTRIES
WHERE AREA < 10
AND GNP >= 250

یک کشور چنین وضعی دارد.

SQL
SELECT *
FROM COUNTRIES
WHERE AREA < 10
AND GNP <= 250

دو کشور چنین وضعی دارند.

SQL
SELECT *
FROM COUNTRIES
WHERE AREA < 10

ممکن است پاسخ را ۳ حدس بزنید، اما تعداد کل ردیف‌ها ۴ است. یک کشور GNP برابر NULL دارد و بنابراین در هیچ‌یک از دو پرس‌وجوی نخست ظاهر نمی‌شود.

صفحهٔ ۳۶

SQL
SELECT *
FROM PERSONS
WHERE COUNTRY = 'GERMANY'
AND ( JOB = 'T' OR JOB = 'B' )
ORDER BY NAME
SQL
SELECT *
FROM PERSONS
WHERE COUNTRY = 'GERMANY'
AND NOT ( JOB = 'T' OR JOB = 'B' )
ORDER BY NAME
SQL
SELECT *
FROM ARMIES
WHERE COUNTRY NOT IN ('USA','RUSSIA')
AND BUDGET > 30000

سه ردیف در نتیجه وجود دارد.

صفحهٔ ۴۰

SQL
SELECT POP * .2
FROM COUNTRIES
WHERE COUNTRY = 'CANADA'

۵٬۶۸۶٬۹۰۹ کانادایی-آمریکایی.

SQL
SELECT BUDGET * 1000000 / TROOPS
FROM ARMIES
WHERE COUNTRY = 'USA'

در ایالات متحده ۱۷۰٬۰۰۰٫۰۹ دلار به ازای هر سرباز هزینه می‌شود.

SQL
SELECT BUDGET * 1000000 / TROOPS
FROM ARMIES
WHERE COUNTRY = 'CHINA'

در چین ۹۲۱٫۵۰ دلار به ازای هر سرباز هزینه می‌شود.

SQL
SELECT TANKS + SHIPS + PLANES
FROM ARMIES
WHERE COUNTRY = 'USA'

مجموع ۲۵٬۳۵۴ وسیلهٔ نظامی.

SQL
SELECT BUDGET * 1000000 * .45 / 125
FROM ARMIES
WHERE COUNTRY = 'USA'

۱٬۰۱۰٬۱۶۰٬۰۰۰ چکش!

صفحهٔ ۴۲

SQL
SELECT COUNTRY, POP, AREA, POP / AREA
FROM COUNTRIES
WHERE POP / AREA < 7
ORDER BY POP / AREA DESC
SQL
SELECT COUNTRY, POP, LITERACY, LITERACY / 100 * POP
FROM COUNTRIES
WHERE LITERACY / 100 * POP > 100000000
SQL
SELECT COUNTRY, BUDGET * 1000000 * .3 / 650 / TROOPS
FROM ARMIES
WHERE BUDGET * 1000000 * .3 / 650 / TROOPS > 10
ORDER BY BUDGET * 1000000 * .3 / 650 / TROOPS DESC

صفحهٔ ۴۴

SQL
SELECT COUNTRY, POP, LITERACY,
       LITERACY / 100 * POP AS READERS
FROM COUNTRIES
WHERE READERS > 100000000
SQL
SELECT COUNTRY, POP, GNP,
       GNP * 1000000 / POP AS GPP
FROM COUNTRIES
WHERE GPP > 20000
ORDER BY GPP DESC
SQL
SELECT COUNTRY,
       TROOPS * .20 * 20000 AS FISSION_FUND
FROM ARMIES
WHERE FISSION_FUND >= 2000000000
ORDER BY FISSION_FUND DESC

۱۱ کشور مشارکت‌کننده وجود دارد.

صفحهٔ ۴۸

SQL
SELECT SUM(TROOPS)
FROM ARMIES
SQL
SELECT MIN(LITERACY), MAX(LITERACY), AVG(LITERACY)
FROM COUNTRIES
WHERE LANGUAGE = 'FRENCH'
SQL
SELECT COUNT(COUNTRY), COUNT(DISTINCT LANGUAGE)
FROM COUNTRIES

صفحهٔ ۵۰

SQL
SELECT LANGUAGE, SUM(POP)
FROM COUNTRIES
WHERE LANGUAGE IN ('HEBREW','SPANISH','ENGLISH','FRENCH')
GROUP BY LANGUAGE
SQL
SELECT LANGUAGE, MIN(LITERACY), MAX(LITERACY), AVG(LITERACY)
FROM COUNTRIES
WHERE LANGUAGE IN ('HEBREW','SPANISH','ENGLISH','FRENCH')
GROUP BY LANGUAGE
SQL
SELECT COUNTRY, GENDER, COUNT(PERSON)
FROM PERSONS
WHERE COUNTRY IN ('CANADA','FRANCE')
GROUP BY COUNTRY, GENDER
ORDER BY COUNTRY, GENDER
SQL
SELECT JOB, GENDER, COUNT(PERSON)
FROM PERSONS
WHERE NOT GENDER IS NULL
GROUP BY JOB, GENDER
ORDER BY JOB, GENDER

صفحهٔ ۵۳

SQL
SELECT COUNTRY, COUNT(PERSON)
FROM PERSONS
WHERE JOB = 'W'
GROUP BY COUNTRY
ORDER BY COUNT(PERSON)
SQL
SELECT LANGUAGE, SUM(POP)
FROM COUNTRIES
GROUP BY LANGUAGE
HAVING SUM(POP) < 1000000
SQL
SELECT LANGUAGE, MIN(LITERACY), MAX(LITERACY), AVG(LITERACY)
FROM COUNTRIES
GROUP BY LANGUAGE
HAVING MIN(LITERACY) <> MAX(LITERACY)
SQL
SELECT LANGUAGE, SUM(AREA), SUM(POP)
FROM COUNTRIES
GROUP BY LANGUAGE
HAVING COUNT(*) > 1
ORDER BY SUM(AREA) DESC

صفحهٔ ۵۸

SQL
SELECT NAME, LANGUAGE
FROM PERSONS, COUNTRIES
WHERE PERSONS.COUNTRY = COUNTRIES.COUNTRY
AND JOB = 'S'
AND BDATE LIKE '19%'
SQL
SELECT COUNTRIES.COUNTRY, GNP, BUDGET
FROM COUNTRIES, ARMIES
WHERE COUNTRIES.COUNTRY = ARMIES.COUNTRY
AND POP > 100000000
SQL
SELECT COUNTRIES.COUNTRY, GNP, BUDGET, BUDGET / GNP * 100
FROM COUNTRIES, ARMIES
WHERE COUNTRIES.COUNTRY = ARMIES.COUNTRY
AND POP > 100000000
SQL
SELECT TROOPS * PERCENT / 100
FROM ARMIES, RELIGIONS
WHERE ARMIES.COUNTRY = RELIGIONS.COUNTRY
AND RELIGIONS.COUNTRY = 'GERMANY'
AND RELIGION = 'PROTESTANT'

با فرض اینکه نیروهای ارتش برشی از کل جمعیت باشند، حدود ۱۶۵٬۲۸۵ نفر از آن‌ها پروتستان‌اند.

صفحهٔ ۶۰

SQL
SELECT C.COUNTRY, C.POP, TROOPS
FROM COUNTRIES AS C, ARMIES AS A
WHERE C.COUNTRY = A.COUNTRY
AND POP > 100000000
SQL
SELECT DISTINCT LANGUAGE
FROM COUNTRIES AS C, RELIGIONS AS R
WHERE C.COUNTRY = R.COUNTRY
AND RELIGION = 'MUSLIM'
AND PERCENT > 90
SQL
SELECT NAME, TITLE, LANGUAGE
FROM PERSONS AS P, JOBS AS J, COUNTRIES AS C
WHERE P.JOB = J.JOB
AND P.COUNTRY = C.COUNTRY
AND BDATE < '1400-01-01'

صفحهٔ ۶۲

SQL
SELECT COUNTRY
FROM RELIGIONS
WHERE RELIGION = 'PROTESTANT'
AND PERCENT > 40
UNION
SELECT COUNTRY
FROM COUNTRIES
WHERE LANGUAGE = 'GERMAN'

۱۰ ردیف در نتیجه وجود دارد.

SQL
SELECT COUNTRY
FROM PERSONS
WHERE JOB = 'S'
UNION
SELECT COUNTRY
FROM ARMIES
WHERE BUDGET > 10000
ORDER BY 1
SQL
SELECT NAME
FROM PERSONS
WHERE NAME LIKE '_Z%'
UNION
SELECT COUNTRY
FROM COUNTRIES
WHERE COUNTRY LIKE '_Z%'
UNION
SELECT LANGUAGE
FROM COUNTRIES
WHERE LANGUAGE LIKE '_Z%'

۹ ردیف در نتیجه وجود دارد.

صفحهٔ ۶۵

SQL
SELECT MAX(POP)
FROM COUNTRIES

SELECT *
FROM COUNTRIES
WHERE POP = ( SELECT MAX(POP) FROM COUNTRIES )

چین برنده است.

SQL
SELECT *
FROM ARMIES
WHERE BUDGET > ( SELECT AVG(BUDGET) FROM ARMIES )
SQL
SELECT LANGUAGE, NAME, TITLE, BDATE
FROM PERSONS AS P, JOBS AS J, COUNTRIES AS C
WHERE P.JOB = J.JOB
AND P.COUNTRY = C.COUNTRY
AND P.JOB = ( SELECT JOB FROM PERSONS WHERE NAME = 'LUTHER' )
ORDER BY LANGUAGE, NAME

صفحهٔ ۶۷

SQL
SELECT COUNTRY
FROM COUNTRIES
WHERE LITERACY < 50

SELECT *
FROM PERSONS
WHERE JOB = 'W'
AND COUNTRY IN ( SELECT COUNTRY FROM COUNTRIES WHERE LITERACY < 50 )
SQL
SELECT *
FROM PERSONS
WHERE COUNTRY IN ( SELECT COUNTRY FROM RELIGIONS
                   WHERE RELIGION = 'CATHOLIC' AND PERCENT > 95 )
SQL
SELECT *
FROM PERSONS
WHERE JOB = 'M'
AND COUNTRY IN ( SELECT COUNTRY FROM COUNTRIES WHERE LANGUAGE = 'ENGLISH' )
AND COUNTRY IN ( SELECT COUNTRY FROM ARMIES
                 WHERE TROOPS < ( SELECT AVG(TROOPS) FROM ARMIES ) )

صفحهٔ ۶۹

SQL
SELECT JOB, NAME
FROM PERSONS AS P
WHERE BDATE = ( SELECT MAX(BDATE)
                FROM PERSONS
                WHERE JOB = P.JOB )
SQL
SELECT *
FROM PERSONS AS P
WHERE BDATE = ( SELECT MAX(BDATE)
                FROM PERSONS
                WHERE GENDER = P.GENDER )

هر دو نفر اهل Liechtenstein و عضو خانوادهٔ سلطنتی‌اند، هر دو در نیمهٔ نخست سال متولد شده‌اند و نام‌هایی تقریباً تلفظ‌ناپذیر دارند.

SQL
SELECT COUNTRY, RELIGION
FROM RELIGIONS AS R
WHERE PERCENT = ( SELECT MAX(PERCENT)
                  FROM RELIGIONS
                  WHERE COUNTRY = R.COUNTRY )
AND COUNTRY IN ( SELECT COUNTRY FROM COUNTRIES WHERE LANGUAGE = 'GERMAN' )

صفحهٔ ۷۲

SQL
SELECT *
FROM JOBS

INSERT
INTO JOBS ( JOB, TITLE )
VALUES ( 'A', 'Author' )
SQL
SELECT *
FROM PERSONS
WHERE PERSON >= 500

INSERT
INTO PERSONS ( PERSON, NAME, BDATE, GENDER, COUNTRY, JOB )
VALUES ( 500, 'name', 'bdate', 'gen', 'country', 'job' )
SQL
INSERT
INTO PERSONS ( PERSON, NAME, BDATE, GENDER, COUNTRY, JOB )
VALUES ( 501, 'name', 'bdate', 'gen', 'country', 'job' )

صفحهٔ ۷۴

SQL
UPDATE PERSONS
SET JOB = 'A'

SELECT *
FROM PERSONS
ORDER BY JOB
SQL
UPDATE PERSONS
SET BDATE = 'bdate', JOB = 'E'
WHERE PERSON = 500

SELECT *
FROM PERSONS
WHERE PERSON = 500
SQL
UPDATE PERSONS
SET JOB = 'W'
WHERE JOB = 'A'

SELECT *
FROM PERSONS
ORDER BY JOB

صفحهٔ ۷۶

SQL
DELETE
FROM PERSONS
WHERE PERSON >= 501

DELETE
FROM PERSONS
WHERE PERSON = 500

SELECT *
FROM PERSONS
WHERE PERSON >= 500

هیچ ردیفی.

SQL
SELECT COUNT(*)
FROM PERSONS
WHERE BDATE LIKE '17%'

DELETE
FROM PERSONS
WHERE BDATE LIKE '17%'

SELECT COUNT(*)
FROM PERSONS
WHERE BDATE LIKE '17%'
SQL
SELECT COUNT(*)
FROM RELIGIONS

DELETE
FROM RELIGIONS
WHERE RELIGION LIKE '%ORTHODOX%'

SELECT COUNT(*)
FROM RELIGIONS

باید ۳۶۹ ردیف باقی بماند.

صفحهٔ ۷۸

SQL
ROLLBACK

SELECT * FROM JOBS
-- 'A' should no longer be in JOBS
SELECT COUNT(*) FROM RELIGIONS
SQL
DELETE FROM PERSONS
DELETE FROM ARMIES
SELECT * FROM PERSONS
SELECT * FROM ARMIES
-- They're gone!
ROLLBACK
SELECT * FROM PERSONS
SELECT * FROM ARMIES
-- They're back!
SQL
INSERT
INTO PERSONS ( PERSON, NAME, BDATE, GENDER, COUNTRY, JOB )
VALUES ( 500, 'name', 'bdate', 'gen', 'country', 'job' )
COMMIT
ROLLBACK
SELECT * FROM PERSONS WHERE PERSON = 500
-- You're still there!
DELETE FROM PERSONS WHERE PERSON = 500
COMMIT

صفحهٔ ۸۱

SQL
CREATE TABLE SCIENTISTS
(
  NAME CHAR(20),
  BDATE DATE,
  GENDER CHAR(6),
  COUNTRY CHAR(20)
)
SQL
INSERT
INTO SCIENTISTS ( NAME, BDATE, GENDER, COUNTRY )
VALUES ( 'name', 'bdate', 'gen', 'country' )

SELECT *
FROM SCIENTISTS
SQL
DROP TABLE SCIENTISTS

SELECT *
FROM SCIENTISTS

صفحهٔ ۸۳

SQL
CREATE TABLE SCIENTISTS
( NAME CHAR(20), BDATE DATE, GENDER CHAR(6), COUNTRY CHAR(20) )
SQL
INSERT
INTO SCIENTISTS ( NAME, BDATE, GENDER, COUNTRY )
( SELECT NAME, BDATE, GENDER, COUNTRY
  FROM PERSONS
  WHERE JOB = 'S' AND GENDER = 'FEMALE' )

SELECT COUNT(*) FROM SCIENTISTS

۱ دانشمند زن وجود دارد.

SQL
INSERT
INTO SCIENTISTS ( NAME, BDATE, GENDER, COUNTRY )
( SELECT NAME, BDATE, GENDER, COUNTRY
  FROM PERSONS
  WHERE JOB = 'S' AND GENDER = 'MALE' )
SELECT COUNT(*) FROM SCIENTISTS

اکنون ۲۹ دانشمند وجود دارد.

SQL
INSERT
INTO SCIENTISTS ( NAME, BDATE, GENDER, COUNTRY )
( SELECT NAME, BDATE, GENDER, COUNTRY
  FROM PERSONS
  WHERE JOB = 'T' )
SELECT COUNT(*) FROM SCIENTISTS

در مجموع ۴۲ دانشمند وجود دارد.

SQL
DROP TABLE SCIENTISTS

صفحهٔ ۸۷

SQL
CREATE TABLE THEOLOGIANS
(
  NAME CHAR(20),
  BDATE DATE,
  GENDER CHAR(6) NOT NULL DEFAULT 'Male',
  COUNTRY CHAR(20),
  CHECK ( GENDER IN ('Male','Female') ),
  PRIMARY KEY ( NAME ),
  FOREIGN KEY ( COUNTRY ) REFERENCES COUNTRIES ( COUNTRY )
)

INSERT
INTO THEOLOGIANS ( NAME, BDATE, GENDER, COUNTRY )
( SELECT NAME, BDATE, GENDER, COUNTRY
  FROM PERSONS
  WHERE JOB = 'T' )
SQL
INSERT
INTO THEOLOGIANS ( NAME, BDATE, GENDER, COUNTRY )
VALUES ( 'name', 'bdate', 'gen', 'Prussia' )

INSERT
INTO THEOLOGIANS ( NAME, BDATE, GENDER, COUNTRY )
VALUES ( 'name', 'bdate', NULL, 'country' )
SQL
DROP TABLE THEOLOGIANS

صفحهٔ ۸۹

SQL
CREATE TABLE REGIONS ( NAME CHAR(10) )
INSERT INTO REGIONS ( NAME ) VALUES ( 'North' )
INSERT INTO REGIONS ( NAME ) VALUES ( 'South' )
INSERT INTO REGIONS ( NAME ) VALUES ( 'East' )
INSERT INTO REGIONS ( NAME ) VALUES ( 'West' )

-- Execute the following statement 14 times:
INSERT INTO REGIONS SELECT * FROM REGIONS
SQL
SELECT NAME, COUNT(*)
FROM REGIONS
GROUP BY NAME

در متن، اجرای این پرس‌وجو بدون ایندکس تقریباً ۴۰ ثانیه طول می‌کشد؛ بسته به رایانه ممکن است زمان متفاوت باشد.

SQL
CREATE INDEX RX
ON REGIONS ( NAME )

اکنون پرس‌وجو باید بسیار سریع‌تر اجرا شود، زیرا ایندکس برای هر گروه ردیف‌ها را سریع‌تر پیدا می‌کند.

SQL
DROP INDEX RX
DROP TABLE REGIONS

صفحهٔ ۹۱

SQL
CREATE VIEW IV ( PERSON, NAME, BDATE, GENDER, COUNTRY, JOB )
AS
SELECT *
FROM PERSONS
WHERE COUNTRY = 'ISRAEL'

SELECT * FROM IV
SQL
INSERT
INTO IV ( PERSON, NAME, BDATE, GENDER, COUNTRY, JOB )
VALUES ( 502, 'name', 'bdate', 'gen', 'Israel', 'job' )

INSERT
INTO IV ( PERSON, NAME, BDATE, GENDER, COUNTRY, JOB )
VALUES ( 503, 'name', 'bdate', 'gen', 'USA', 'job' )

دوست «گمشده» در جدول زیرین PERSONS درج شده است، اما چون شرط تعریف View را برآورده نمی‌کند در View دیده نمی‌شود.

SQL
CREATE VIEW IJV ( NAME, BDATE, COUNTRY, TITLE )
AS
SELECT NAME, BDATE, COUNTRY, TITLE
FROM IV, JOBS
WHERE IV.JOB = JOBS.JOB
SQL
DROP VIEW IJV
DROP VIEW IV

خداحافظ. Farewell. Aufwiedersein. Shalom.

امتیاز اضافه — پاسخ پرسش‌های فراتر از متن

این ستون شامل پاسخ به پرسش‌های مهمی است که فراتر از دامنهٔ این متن قرار دارند.

  1. بله، انسان‌ها بد هستند. به‌گفتهٔ متن، این موضوع را می‌توان از سه راه دید: الف) کتاب مقدس، ب) استدلال، و ج) تجربه. در بخش «کتاب مقدس» نویسنده به نقل‌قولی از ارمیا اشاره می‌کند که قلب انسان را فریبکار و شدیداً شرور توصیف می‌کند. در بخش «استدلال» می‌پرسد اگر انسان‌ها اساساً خوب‌اند، چرا وسایل خود را قفل می‌کنیم؟ و در بخش «تجربه» به این نکته اشاره می‌کند که کودکان بدون آموزش، دروغ‌گفتن، خودخواهی و تنبلی را کشف می‌کنند.
  2. خیر؛ به‌گفتهٔ متن، انسان‌های اساساً بد مناسب بهشت نیستند، زیرا آن مکان را خراب خواهند کرد.
  3. به‌گفتهٔ متن، «خود قدیمی» باید بمیرد و «خود جدید» جای آن نصب شود. این کار کاملاً عمل خدا توصیف می‌شود و فرد آن را مانند نوزادی که دست‌ها و پاهایش را کشف می‌کند، کشف می‌کند.
  4. اصطلاح الهیاتی این فرایند «regeneration» است و معمولاً «دوباره متولد شدن» نامیده می‌شود.
  5. خیر؛ متن می‌گوید افراد بسیار کمی این تولد جدید را تجربه می‌کنند و برای مثال به نجات هشت نفر در زمان نوح و نجات لوط و دو دخترش اشاره می‌کند.
  6. خیر؛ متن می‌گوید «پایان جهان» هنوز زمان زیادی فاصله دارد، اما عصر کنونیِ فیض به‌سرعت رو به پایان است و تأخیر توصیه نمی‌شود.
  7. کل طرح در کتاب مقدس شرح داده شده است. متن اضافه می‌کند که کتاب The Truth نیز با درخواست در دسترس است.

خلاصهٔ نحو

دستورهای SQL بر اساس دسته
CATEGORYSTATEMENTPURPOSE
QuerySELECTDisplay rows of one or more tables
MaintenanceINSERTAdd rows to a table
MaintenanceUPDATEChange rows in a table
MaintenanceDELETERemove rows from a table
DefinitionCREATEAdd tables, indices, views
DefinitionDROPRemove tables, indices, views
مقادیر بر اساس دسته
CATEGORYDESCRIPTIONEXAMPLES
NUMERICpositive values3, +12
NUMERICnegative values-7, -1024000
NUMERICdecimal values3.141519, -.96
NON-NUMERICsingle words'Chamberlin', 'SELECT'
NON-NUMERICmultiple words'We love SQL', 'The LORD is good to me'
NON-NUMERICsingle quotes'10 O''Clock', 'I don''t know'
DATE'yyyy-mm-dd' format'1996-01-01', '1996-12-31'
عملگرهای مقایسه
OPERATORMEANINGEXAMPLE
=Equal toNAME = 'EINSTEIN'
<>Not equal toBDATE <> '1944-05-02'
<Less thanPOP < 100000
<=Less than or equal toNAME <= 'O''Grady'
>Greater thanAREA > 999
>=Greater than or equal toBDATE >= '1962-06-19'
عملگرهای حسابی
OPERATORMEANINGEXAMPLE
+Add2 + 2
-SubtractBDATE - 365
*MultiplyPOP * 1.25
/DividePERCENT / 100
( )Precedence2 + ( 4 / 2 )
توابع آماری
FUNCTIONMEANINGEXAMPLE
COUNT( )Count all rowsCOUNT(*)
COUNT( )Count non-null rowsCOUNT(JOB)
COUNT( )Count unique rowsCOUNT(DISTINCT JOB)
SUM( )Total valueSUM(POP)
MIN( )Smallest valueMIN(POP)
MAX( )Largest valueMAX(POP)
AVG( )Average valueAVG(POP / AREA)
خلاصهٔ کامل دستور SELECT
CLAUSEPARAMETERSEXAMPLE
SELECT**
[ DISTINCT ]col [ AS alias ] listNAME, PERSONS.JOB, TITLE AS POS
expr [ AS alias ] listPOP / AREA AS DENSITY
func [ AS alias ] listMIN( POP ) AS LOWEST
FROMtable [ AS alias ] listPERSONS, JOBS AS J
WHEREcol oper valueAREA > 3000000
[ NOT ]col LIKE patternNAME LIKE '%ST__N%'
cmpr AND cmprNAME LIKE '%ST__N%' AND JOB = 'S'
col BETWEEN i AND jLITERACY BETWEEN 55 AND 60
cmpr OR cmprNAME = 'LUTHER' OR NAME = 'CALVIN'
col IN ( value list )NAME IN ('POE','HUGO','DAHL')
col IS NULLPOP IS NULL
( compound cmpr )( JOB = 'S' OR JOB = 'W' )
expr oper valuePOP / AREA > 300
col oper ( subquery )POP > ( SELECT AVG ( POP ) ... )
col IN ( subquery )JOB IN ( SELECT DISTINCT JOB ... )
GROUP BYcol listJOB, COUNTRY
HAVINGcomparisons with funcsCOUNT(*) > 30
UNIONquerySELECT ...
ORDER BYcol [ DESC ] listLANGUAGE DESC, COUNTRY
pos [ DESC ] list1 DESC, 3
expr [ DESC ] listPOP / AREA DESC
func [ DESC ] listCOUNT(*) DESC
دستور INSERT
CLAUSEPARAMETERSEXAMPLE
INSERT
INTOtable ( col list )COUNTRIES ( COUNTRY, POP )
VALUES( value list )( 'Beulah', 144000 )
( query )( SELECT ... )
دستور UPDATE
CLAUSEPARAMETERSEXAMPLE
UPDATEtableCOUNTRIES
SETnew value listAREA = 7992, LANGUAGE = 'Hebrew'
WHEREcomparisonsCOUNTRY = 'Beulah'
دستور DELETE
CLAUSEPARAMETERSEXAMPLE
DELETE
FROMtableCOUNTRIES
WHEREcomparisonsCOUNTRY = 'Yugoslavia'
دستور ROLLBACK
CLAUSEPARAMETERSEXAMPLE
ROLLBACK
دستور COMMIT
CLAUSEPARAMETERSEXAMPLE
COMMIT
دستور CREATE TABLE با قیود
CLAUSEPARAMETERSEXAMPLE
CREATETABLE tableTABLE WRITERS
(col type ( size ) listNAME CHAR(20), BDATE DATE, SALES NUMERIC(9,2)
NOT NULLNOT NULL
DEFAULT valueDEFAULT 0
UNIQUE( col list )( NAME )
CHECK( comparison )( GENDER IN ('Male','Female') )
PRIMARY KEY( col list )( NAME )
FOREIGN KEY( col list ) REFERENCES table ( col list )( COUNTRY ) REFERENCES COUNTRIES ( COUNTRY )
)
دستور CREATE INDEX
CLAUSEPARAMETERSEXAMPLE
CREATEINDEX indexINDEX GJX
ONtable ( col list )PERSONS ( GENDER, JOB )
دستور CREATE VIEW
CLAUSEPARAMETERSEXAMPLE
CREATEVIEW view ( col list )VIEW PTV ( PERSON, NAME, TITLE )
ASquerySELECT ...
دستورهای DROP
CLAUSEPARAMETERSEXAMPLE
DROPTABLE tableTABLE WRITERS
DROPINDEX indexINDEX GJX
DROPVIEW viewVIEW PTV

نقدی کوتاه

با وجود محبوبیت SQL و پذیرش آن به‌عنوان یک استاندارد رسمی، متن معتقد است این زبان تعریف نسبتاً ضعیفی دارد و از چند ناسازگاری داخلی رنج می‌برد، از جمله:

  • بند SELECT پیش از بند FROM می‌آید؛ در حالی‌که از دید منطقی ابتدا جدول‌ها انتخاب می‌شوند و سپس ستون‌هایی که باید نمایش داده شوند.
  • کلیدواژهٔ DISTINCT روی ردیف‌ها عمل می‌کند، اما باید در بند SELECT ــ جایی که ستون‌ها و نه ردیف‌ها فهرست می‌شوند ــ نوشته شود.
  • ستاره برای چند هدف استفاده می‌شود و نحو SQL را بی‌جهت پیچیده می‌کند؛ برای نمونه SELECT *, POP*1.1, COUNT(*).
  • توابع را نمی‌توان آزادانه تو در تو کرد؛ برای نمونه AVG(POP/AREA) مجاز است، اما AVG(COUNT(RELIGION)) نیست.
  • SQL هنگام اعمال توابع آماری مانند AVG، مقادیر Null را نادیده می‌گیرد، به‌جای آن‌که گزینه‌ای برای نادیده‌گرفتن آن‌ها یا واردکردنشان در شمارش فراهم کند.
  • متن پیشنهاد می‌کند GROUP BY اختیاری باشد، چون اطلاعات لازم معمولاً از بند SELECT قابل استنباط است.
  • بند HAVING گیج‌کننده توصیف می‌شود؛ متن پیشنهاد می‌کند توابع آماری در WHERE مجاز شوند و HAVING به‌کلی حذف شود.
  • نحو انواع مختلف دستورهای SQL ناسازگار است؛ برای نمونه شکل SELECT، INSERT، UPDATE و DELETE از الگوی واحدی پیروی نمی‌کند.
  • تعریف View نمی‌تواند بند ORDER BY داشته باشد.

نتیجهٔ متن این است که اگر برخی گویش‌های SQL بعضی از این محدودیت‌ها را رفع کنند، خودِ وجود گویش‌ها مسئله را نشان می‌دهد؛ باید یک استاندارد خوب و واحد وجود داشته باشد.

مطالعهٔ پیشنهادی

An Introduction to Database Systems

C. J. Date — به‌گفتهٔ متن، احتمالاً بهترین کتاب همه‌جانبه دربارهٔ پایگاه‌های دادهٔ رابطه‌ای؛ به‌عنوان مرور مقدماتی مفید و همچنین به‌عنوان مرجع بسیار خوب است. نویسنده این کتاب را به هر کسی که به فناوری پایگاه دادهٔ رابطه‌ای علاقه‌مند است توصیه می‌کند.

A Guide to the SQL Standard

C. J. Date — اثر دیگری از Date که موجز، دقیق و نسبتاً آسان برای خواندن توصیف شده است. متن یادآوری می‌کند که او چند کتاب دیگر دربارهٔ نسخه‌های مشخص SQL نیز نوشته یا در نگارش آن‌ها مشارکت داشته و ممکن است برای مسائل خاص محصول مفیدتر باشند.

ERA and LOGIC Workshop Manuals

Relational Systems Corporation — دو روش طراحی پایگاه داده که طبق متن برای طراحی سریع و دقیق یک پایگاه دادهٔ رابطه‌ای و پیاده‌سازی آن روی هر سیستم SQL مناسب‌اند. ERA برای سیستم‌های عملیاتی ترجیح داده شده و LOGIC برای کاربردهای انبار داده.

The Holy Bible

God — متن با لحنی طنزآمیز آن را «راهنمای کاربر برای همهٔ فرزندان آدم» می‌نامد؛ اثری آزموده، مناسب مطالعهٔ روزانه، با داستان‌های خوب و حتی کمی سرگرم‌کننده، و در پایان به آیهٔ Genesis 11 اشاره می‌کند.

نمایه

نمایهٔ زیر مدخل‌های منبع و شماره‌صفحه‌های چاپی کتاب را حفظ می‌کند.

alias, 43, 51, 59
AND, 25
ANSI, 5
arithmetic operator, 38
AS, 43, 51, 59, 90
asterisk (*), 9, 46
AVG, 46

BETWEEN, 27

calculated column, 38
Chamberlin, D.D., 5
CHECK, 85
clause, 7
column, 4
column alias, 43
column list, 11, 71
column position, 17, 61
COMMIT, 77
comparison, 14, 85
comparison operator, 14
compound, 25, 29
constraint, 84
correlated subquery, 68
COUNT, 46
course objectives, 3
CREATE, 6, 80, 88, 90
critique, 116

Date, C.J., 117
date value, 13
defining, 6
definition, 6
DEFAULT, 84
default value, 71
DELETE, 75
DESC, 17
DISTINCT, 20, 46
DROP, 6, 80, 88, 90
duplicate row, 20, 61

ERA, 117
expression, 38, 39

FOREIGN KEY, 86
FROM, 9, 57, 59
full column name, 55
function, statistical, 46
God, 117
grand total, 46
GROUP BY, 49

HAVING, 52

IN, 31, 66
index, 88
inner query, 68
INSERT, 6, 71, 82
integrity constraint, 84
INTO, 71
IS NULL, 33
ISO, 5

join, 55

keyword, 7

LIKE, 23
loading tables, 82
LOGIC, 117

maintaining, 3
maintenance, 6
MAX, 46
MIN, 46
multi-valued subquery, 66

negation, 35
non-numeric value, 13
NOT, 35
NOT NULL, 84
null, 33
numeric value, 13

operand, 38
operator, 14, 38
OR, 29
ORDER BY, 17, 41, 51, 61
outer query, 68

parameter, 7, 48
parentheses, 31, 35, 38
pattern, 23
percent (%), 23
precedence, 35
PRIMARY KEY, 86, 87
query, 6
querying, 3
quote ('), 13

range, 27
REFERENCES, 86
regeneration, 110
relational database, 4
ROLLBACK, 77
row, 4

save, 77
SELECT, 6, 9-69
SET, 73
single-quote ('), 13
single-valued subquery, 64
sorting, 17
SQL, 5
statistical function, 46
Structured Query Language, 5
subquery, correlated, 68
subquery, multi-valued, 66
subquery, single-valued, 64
subtotal, 49
SUM, 46
syntax summary, 111

table, 4, 80
table alias, 59, 68
table display, 110
total, grand, 46
transaction, 77

underscore (_), 23
UNION, 61
UNIQUE, 85
UPDATE, 6, 73

value list, 31, 71
value range, 27
VALUES, 71
view, 90
view, non-numeric, 13
value, numeric, 13
view, numeric, 13
view, 90

WHERE, 15, 41, 57

امتیاز کاربران به این مقاله

☆☆☆☆☆

0 نفر امتیاز داده اند. میانگین: 0.0 از 5

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

0 / 500