تصميم قواعد البيانات — الطبعة الثانية › معالجة البيانات في SQL 16 / 19 السابق التالي

معالجة البيانات في SQL

المتن الرئيسي

SELECT  FirstName, LastName, phone

FROM Employees

ORDER BY LastName

تُستخدم لغة معالجة البيانات (data manipulation language)‏ (DML) في SQL للاستعلام عن بيانات قاعدة البيانات وتعديلها. وفي هذا الفصل، سنشرح كيفية استخدام عبارات أوامر DML في SQL وهي SELECT وINSERT وUPDATE وDELETE، والمعرَّفة أدناه.

SELECT PubName, city

FROM Publishers
  • SELECT – للاستعلام عن البيانات في قاعدة البيانات
  • INSERT – لإدراج البيانات في جدول
  • UPDATE – لتحديث البيانات في جدول
  • DELETE – لحذف البيانات من جدول
SELECT PubName city

FROM Publishers

في عبارة DML الخاصة بـ SQL:

SELECT StorID, qty, TitleID

FROM Sales

WHERE qty BETWEEN 20 and 50  (includes the 20 and 50)
  • يجب أن تبدأ كل جملة (clause) في العبارة على سطر جديد.
  • يجب أن تصطف بداية كل جملة عند المحاذاة نفسها مع بداية الجمل الأخرى.
  • إذا كانت لأحد الجمل عدة أجزاء، فيجب أن تظهر في أسطر منفصلة وتُزاح إلى الداخل تحت بداية الجملة لإظهار العلاقة بينها.
  • تُستخدم الأحرف الكبيرة لتمثيل الكلمات المحجوزة (reserved words).
  • تُستخدم الأحرف الصغيرة لتمثيل الكلمات التي عرّفها المستخدم.
SELECT StorID, qty, TitleID

FROM Sales

WHERE qty >= 20 and qty  <= 50

عبارة SELECT

SELECT StorID, qty, TitleID

FROM Sales

WHERE qty NOT BETWEEN 20 and 50

تتيح عبارة SELECT، أو الأمر، للمستخدم استخراج البيانات من الجداول (tables) وفق معايير محدَّدة. وتُنفَّذ وفق التسلسل التالي:

SELECT *

FROM Publishers

WHERE province = ‘BC’ OR province = ‘AB’ OR province = ‘ON’

SELECT DISTINCT item(s) FROM table(s) WHERE predicate GROUP BY field(s) ORDER BY fields

SELECT *

FROM Publishers

WHERE province IN (‘BC’, ‘AB’, ‘ON’)

ويمكننا استخدام عبارة SELECT لإنشاء قائمة بأرقام هواتف الموظفين من جدول Employees على النحو التالي:

SELECT price, title

FROM Books

WHERE price IS NULL

SELECT FirstName, LastName, phone FROM Employees ORDER BY LastName

SELECT price, title

FROM Books

WHERE price IS NOT NULL

سيؤدي هذا الإجراء إلى عرض اسم عائلة الموظف واسمه الأول ورقم هاتفه من جدول Employees، كما هو مبين في الجدول 16.1.

SELECT LastName

FROM Employees

WHERE LastName LIKE ‘Mc%’
اسم العائلة الاسم الأول رقم الهاتف
Hagans Jim 604-232-3232
Wong Bruce 604-244-2322
SELECT LastName

FROM Employees

WHERE LastName LIKE ‘%inger’

الجدول 16.1. جدول Employees.

SELECT LastName

FROM Employees

WHERE LastName LIKE ‘%en%’

في المثال التالي، سنستخدم جدول الناشرين (Publishers) (الجدول 16.2). (ولاحِظ أن كلمة Canada مكتوبة خطأً في حقل بلد الناشر لكل من Example Publishing وABC Publishing. ولتصحيح الخطأ، استخدم عبارة UPDATE لتوحيد حقل البلد على Canada – انظر عبارة UPDATE لاحقًا في هذا الفصل.)

SELECT *

FROM Employees

ORDER BY HireDate ASC
اسم الناشر مدينة الناشر مقاطعة الناشر بلد الناشر
Acme Publishing Vancouver BC Canada
Example Publishing Edmonton AB Cnada
ABC Publishing Toronto ON Canda
SELECT *

FROM Books

ORDER BY type, price DESC

الجدول 16.2. جدول Publishers.

SELECT type

FROM Books

GROUP BY type

إذا أردت إضافة اسم الناشر ومدينته، فستستخدم عبارة SELECT تليها أسماء الحقول مفصولة بفاصلة:

SELECT type AS ‘Type’, MIN(price) AS ‘Minimum Price’

FROM Books

WHERE royalty > 10

GROUP BY type

SELECT PubName, city FROM Publishers

SELECT type, price

FROM Books

WHERE price is not null

سيؤدي هذا الإجراء إلى عرض اسم الناشر ومدينة الناشر من جدول Publishers.

SELECT type AS ‘Type’, MIN(price) AS ‘Minimum Price’

FROM Books

WHERE price is not null

GROUP BY type

وإذا كنت تريد اسم الناشر فقط تحت عنوان العرض city، فستستخدم عبارة SELECT من دون فاصلة تفصل بين pub_name وcity:

SELECT COUNT(*)

FROM Books

GROUP BY type

SELECT PubName city FROM Publishers

SELECT AVG(qty)

FROM Books

GROUP BY type

سيؤدي تنفيذ هذا الإجراء إلى عرض قيمة pub_name فقط من جدول Publishers مع عنوان “city”. وإذا لم تُدرج الفاصلة، فسيفترض SQL Server أنك تريد اسم عمود جديدًا للقيمة pub_name.

SELECT SUM(qty)

FROM Books

GROUP BY type

عبارة SELECT مع معيار WHERE

SELECT ‘Total Sales’ = SUM(qty), ‘Average Sales’ = AVG(qty), stor_id

FROM Sales

GROUP BY StorID ORDER BY  ‘Total Sales’

قد ترغب أحيانًا في التركيز على جزء من جدول الناشرين، مثل الناشرين الموجودين في Vancouver وحدهم. وفي هذه الحالة، ستستخدم عبارة SELECT مع معيار WHERE، أي WHERE city = ‘Vancouver’.

SELECT au_fname AS ‘Author”s First Name’, province as ‘Province’

FROM Authors

GROUP BY au_fname, province

HAVING province <> ‘BC’

يوضح المثالان الأولان كيفية تقييد اختيار السجلات بمعيار WHERE باستخدام BETWEEN. ويعطي كل من هذين المثالين النتيجة نفسها لعناصر المتجر التي يتراوح عددها بين 20 و50 في المخزون.

INSERT [INTO] Table_name | view name [column_list]

DEFAULT VALUES | values_list | select statement

يستخدم المثال رقم 1 الكمية qty BETWEEN 20 and 50.

INSERT INTO Authors

VALUES(‘555-093-467’, ‘Martin’, ‘April’, ‘281 555-5673’, ‘816 Market St.,’ , ‘Vancouver’, ‘BC’, ‘V7G3P4’, 0)

SELECT StorID, qty, TitleID FROM Sales WHERE qty BETWEEN 20 and 50 (يشمل 20 و50)

INSERT INTO Publishers (PubID, PubName, city, province)

VALUES (‘9900’, ‘Acme Publishing’, ‘Vancouver’, ‘BC’)

أما المثال رقم 2، من ناحية أخرى، فيستخدم qty >=20 وqty <=50 .

INSERT INTO jobs

VALUES (‘DBA’, 100, 175)

SELECT StorID, qty, TitleID FROM Sales WHERE qty >= 20 and qty <= 50

IDENTITY_INSERT option

يوضح المثال رقم 3 كيفية تقييد اختيار السجلات بمعيار WHERE باستخدام NOT BETWEEN.

SET IDENTITY_INSERT jobs ON

INSERT INTO jobs  (job_id, job_desc, min_lvl, max_lvl)

VALUES (19, ’DBA2’, 100, 175)

SET IDENTITY_INSERT jobs OFF

SELECT StorID, qty, TitleID FROM Sales WHERE qty NOT BETWEEN 20 and 50

CREATE TABLE dbo.tmpPublishers (

PubID char (4) NOT NULL ,

PubName varchar (40) NULL ,

city varchar (20) NULL ,

province char (2) NULL ,

country varchar (30) NULL  DEFAULT (‘Canada’)

)

INSERT  tmpPublishers

SELECT * FROM Publishers

يوضح المثالان التاليان طريقتين مختلفتين لتقييد اختيار السجلات بمعيار WHERE باستخدام IN، معطي كل منهما النتيجة نفسها.

INSERT tmpPublishers (pub_id, pub_name)

SELECT PubID, PubName

FROM Publishers

يوضح المثال رقم 4 كيفية اختيار السجلات باستخدام province= كجزء من عبارة WHERE.

INSERT tmpPublishers (PubID, PubName, city, province, country)

SELECT PubID, PubName, city, province, ‘Canada’

FROM Publishers

SELECT * FROM Publishers WHERE province = ‘BC’ OR province = ‘AB’ OR province = ‘ON’

UPDATE Publishers

SET country = ‘Canada’

ويُختار المثال رقم 5 السجلات باستخدام province IN كجزء من عبارة WHERE.

UPDATE roysched

SET royalty = royalty + (royalty * .10)

WHERE royalty BETWEEN 10 and 20

SELECT * FROM Publishers WHERE province IN (‘BC’, ‘AB’, ‘ON’)

UPDATE Employees

SET job_lvl =

(SELECT max_lvl FROM jobs

WHERE employee.job_id = jobs.job_id)

WHERE DATEPART(year, employee.hire_date) = 2010

يوضح المثالان الأخيران كيفية استخدام NULL وNOT NULL لاختيار السجلات. وفي هذين المثالين، يُستخدم جدول الكتب (Books) (غير المبيَّن) الذي يحوي حقولًا اسمها Title وQuantity وPrice (سعر الكتاب). ولكل ناشر جدول Books يسرد جميع كتبه.

DELETE [FROM] {table_name | view_name }

[WHERE clause]

يستخدم المثال رقم 6 القيمة NULL.

DELETE

FROM Discounts

SELECT price, title FROM Books WHERE price IS NULL

DELETE

FROM Sales

WHERE stor_id = ‘6380’

ويستخدم المثال رقم 7 القيمة NOT NULL.

DELETE FROM Sales

WHERE title_id IN

(SELECT title_id FROM Books WHERE type = ‘mod_cook’)

SELECT price, title FROM Books WHERE price IS NOT NULL

SELECT AVG (price) AS ‘Average Title Price’

FROM Books

استخدام المحارف البديلة (wildcards) في جملة LIKE

SELECT COUNT(PubID) AS ‘Number of Publishers’

FROM Publishers

تختار الكلمة المفتاحية LIKE الصفوف التي تحوي حقولًا تطابق أجزاء محدَّدة من سلاسل المحارف. وتُستخدم LIKE مع بيانات char وvarchar وtext وdatetime وsmalldatetime. ويسمح المحرف البديل (wildcard) للمستخدم بمطابقة الحقول التي تحوي حروفًا معيَّنة. فمثلًا، يعطي المحرف البديل province = ‘N%’ جميع المقاطعات التي تبدأ بالحرف ‘N’. ويعرض الجدول 16.3 أربع طرق لتحديد المحارف البديلة في عبارة SELECT بصيغة التعابير النمطية (regular express format).

SELECT COUNT(province) AS ‘Number of Publishers’

FROM Publishers
% أي سلسلة من صفر أو أكثر من المحارف
_ أي محرف مفرد
[ ] أي محرف مفرد ضمن النطاق المحدَّد (مثل [a-f]) أو ضمن المجموعة (مثل [abcdef])
[^] أي محرف مفرد لا يقع ضمن النطاق المحدَّد (مثل [^a – f]) أو ضمن المجموعة (مثل [^abcdef])
SELECT COUNT(*)

FROM Employees

WHERE job_lvl = 35

الجدول 16.3. كيفية تحديد المحارف البديلة في عبارة SELECT.

SELECT MAX (HireDate)

FROM Employees

في المثال رقم 1، تبحث LIKE ‘Mc%’ عن جميع أسماء العائلة التي تبدأ بالحرفين “Mc” (مثل McBadden).

SELECT MIN (price)

FROM Books

SELECT LastName FROM Employees WHERE LastName LIKE ‘Mc%’

SELECT SUM(discount) AS ‘Total Discounts’

FROM Discounts

وفي المثال رقم 2: تبحث LIKE ‘%inger’ عن جميع أسماء العائلة التي تنتهي بالحروف “inger” (مثل Ringer وStringer).

SELECT CONVERT(int, 10.6496)

SELECT title_id, price

FROM Books

WHERE CONVERT(char(5), price) LIKE ‘%99%’

SELECT LastName FROM Employees WHERE LastName LIKE ‘%inger’

SELECT title_id, CONVERT(char(4), ytd_sales) as ‘Sales’

FROM Books

WHERE type LIKE ‘%cook’

وفي المثال رقم 3: تبحث LIKE ‘%en%’ عن جميع أسماء العائلة التي تحوي الحرفين “en” (مثل Bennett وGreen وMcBadden).

SELECT DATEADD(day, 3, hire_date)

FROM Employees

SELECT LastName FROM Employees WHERE LastName LIKE ‘%en%’

SELECT DATEDIFF(day, HireDate, ‘Nov 30 1995’)

FROM Employees

عبارة SELECT مع جملة ORDER BY (ترتيب حسب)

SELECT Price, (price * 1.1) AS ‘New Price’, title

FROM Books

SELECT ‘Square Root’ = SQRT(81)

SELECT ‘Rounded‘ = ROUND(4567.9876,2)

SELECT FLOOR (123.45)

تستخدم جملة ORDER BY لترتيب السجلات في القائمة الناتجة. واستخدم ASC لترتيب النتائج تصاعديًا وDESC لترتيبها تنازليًا.

SELECT jobs.job_id, job_desc

FROM jobs

INNER JOIN Employees ON employee.job_id = jobs.job_id

WHERE jobs.job_id < 7

على سبيل المثال، مع ASC:

SELECT authors.au_fname, authors.au_lname, books.royalty, title

FROM authorsINNER JOIN titleauthor ON authors.au_id=titleauthor.au_id

INNER JOIN books ON titleauthor.title_id=books.title_id

GROUP BY authors.au_lname, authors.au_fname, title, title.royalty

ORDER BY authors.au_lname

SELECT * FROM Employees ORDER BY HireDate ASC

SELECT publishers.pub_name, books.title

FROM Publishers

LEFT OUTER JOIN Books On publishers.pub_id = books.pub_id

ومع DESC:

SELECT publishers.pub_name, books.title

FROM Publishers, Books

WHERE publishers.pub_id *= books.pub_id

SELECT * FROM Books ORDER BY type, price DESC

SELECT titleauthor.title_id, authors.au_lname, authors.au_fname

FROM titleauthor

RIGHT OUTER JOIN authors ON titleauthor.au_id = authors.au_id

ORDERY BY au_lname

عبارة SELECT مع جملة GROUP BY (تجميع حسب)

SELECT titleauthor.title_id, authors.au_lname, authors.au_fname

FROM titleauthor, authors

WHERE titleauthor.au_id =* authors.au_id

ORDERY BY au_lname

تُستخدم جملة GROUP BY لإنشاء صف ناتج واحد لكل مجموعة، وتنتج قيمًا ملخَّصة للأعمدة المحدَّدة، كما هو موضح أدناه.

SELECT books.title, publishers.pub_name, publishers.province

FROM Publishers

FULL OUTER JOIN Books ON books.pub_id = publishers.pub_id

WHERE (publishers.province <> “BC” and publishers.province <> “ON”)

ORDER BY books.title_id

SELECT type FROM Books GROUP BY type

SELECT au_lname, pub_name,

FROM Authors CROSS JOIN Publishers

وفيما يلي مثال يستخدم العبارة أعلاه.

Key Terms

aggregate function: returns summary valuesASC: ascending order

conversion function: transforms one data type to another

cross join: a product combining two tables

date function: displays information about dates and times

DELETE statement: removes rows from a record set

DESC: descending order

full outer join: specifies that if a row from either table does not match the selection criteria

GROUP BY: used to create one output row per each group and produces summary values for the selected columns

inner join: connects two tables on a column with the same data type

INSERT statement: adds rows to a table

left outer join: specifies that all left outer rows be returned

mathematical function: performs operations on numeric data

right outer join: includes all rows from the right table that did not meet the condition specified

SELECT statement: used to query data in the database

string function: performs operations on character strings, binary data or expressions

system function: returns a special piece of information from the database

text and image functions: performs operations on text and image data

UPDATE statement: changes data in existing rows either by adding new data or modifying existing data

wildcard:  allows the user to match fields that contain certain letters.

SELECT type AS ‘Type’, MIN(price) AS ‘Minimum Price’ FROM Books WHERE royalty > 10 GROUP BY type

Exercises

For questions 1 to 18 use the PUBS sample database created by Microsoft. To download the script to generate this database please go to the following site: http://www.microsoft.com/en-ca/download/details.aspx?id=23654.

Display a list of publication dates and titles (books) that were published in 2011.
Display a list of titles that have been categorized as either traditional or modern cooking. Use the Books table.
Display all authors whose first names are five letters long.
Display from the Books table: type, price, pub_id, title about the books put out by each publisher. Rename the column type with ”Book Category.” Sort by type (descending) and then price (ascending).
Display title_id, pubdate and pubdate plus three days, using the Books table.
Using the datediff and getdate function determine how much time has elapsed in months since the books in the Books table were published.
List the title IDs and quantity of all books that sold more than 30 copies.
Display a list of all last names of the authors who live in Ontario (ON) and the cities where they live.
Display all rows that contain a 60 in the payterms field. Use the Sales table.
Display all authors whose first names are five letters long , end in O or A, and start with M or P.
Display all titles that cost more than $30 and either begin with T or have a publisher ID of  0877.
Display from the Employees table the first name (fname), last name (lname), employe ID(emp_id) and job level (job_lvl) columns for those employees with a job level greater than 200; and rename the column headings to:  “First Name,” “Last Name,” “IDENTIFICATION#” and “Job Level.”
Display the royalty, royalty plus 50% as “royalty plus 50” and title_id. Use the Roysched table.
Using the STUFF function create a string “12xxxx567” from the string “1234567.”
Display the first 40 characters of each title, along with the average monthly sales for that title to date (ytd_sales/12). Use the Title table.
Show how many books have assigned prices.
Display a list of cookbooks with the average cost for all of the books of each type. Use the GROUP BY.

وإذا كانت عبارة SELECT تتضمن معيار WHERE يكون فيه price ليس فارغًا (not null)،

Advanced Questions (Union, Intersect, and Minus)

The relational set operators UNION, INTERSECT and MINUS work properly only if the relations are union-compatible. What does union-compatible mean, and how would you check for this condition?
What is the difference between UNION and UNION ALL? Write the syntax for each.
Suppose that you have two tables, Employees and Employees_1. The Employees table contains the records for three employees: Alice Cordoza, John Cretchakov, and Anne McDonald. The Employees_1 table contains the records for employees: John Cretchakov and Mary Chen. Given that information, what is the query output for the UNION query? List the query output.
Given the employee information in question 3, what is the query output for the UNION ALL query? List the query output.
Given the employee information in question 3, what is the query output for the INTERSECT query? List the query output.
Given the employee information in question 3, what is the query output for the EXCEPT query? List the query output.
What is a cross join? Give an example of its syntax.
Explain these three join types:

left outer join
right outer join
full outer join

What is a subquery, and what are its basic characteristics?
What is a correlated subquery? Give an example.
Suppose that a Product table contains two attributes, PROD_CODE and VEND_CODE. The values for the PROD_CODE are: ABC, DEF, GHI and JKL. These are matched by the following values for the VEND_CODE:  125, 124, 124 and 123, respectively (e.g., PROD_CODE value ABC corresponds to VEND_CODE value 125). The Vendor table contains a single attribute, VEND_CODE, with values 123, 124, 125 and 126. (The VEND_CODE attribute in the Product table is a foreign key to the VEND_CODE in the Vendor table.)
Given the information in question 11, what would be the query output for the following? Show values.

A UNION query based on these two tables
A UNION ALL query based on these two tables
An INTERSECT query based on these two tables
A MINUS query based on these two tables

SELECT type, price FROM Books WHERE price is not null

Advanced Questions (Using Joins)

Display a list of all titles and sales numbers in the Books and Sales tables, including titles that have no sales. Use a join.
Display a list of authors’ last names and all associated titles that each author has published sorted by the author’s last name. Use a join.  Save it as a view named: Published Authors.
Using a subquery, display all the authors (show last and first name, postal code) who receive a royalty of 100% and live in Alberta. Save it as a view titled: AuthorsView. When creating the view, rename the author’s last name and first name as ‘Last Name’ and ‘First Name’.
Display the stores that did not sell the title Is Anger the Enemy?
Display a list of store names for sales after 2013 (Order Date is greater than 2013).  Display store name and order date.
Display a list of titles for books sold in store name “News & Brews.”  Display store name, titles and order dates.
List total sales (qty) by title. Display total quantity and title columns.
List total sales (qty) by type. Display total quantity and type columns.
List total sales (qty*price) by type. Display total dollar value and type columns.
Calculate the total number of types of books by publisher. Show publisher name and total count of types of books for each publisher.
Show publisher names that do not have any type of book.  Display publisher name only.

فإن العبارة التي تحوي جملة GROUP BY ستبدو هكذا:

SELECT type AS ‘Type’, MIN(price) AS ‘Minimum Price’ FROM Books WHERE price is not null GROUP BY type

استخدام COUNT مع GROUP BY

يمكننا استخدام COUNT لمعرفة عدد العناصر الموجودة في حاوية. لكن إذا أردنا عد عناصر مختلفة في مجموعات منفصلة، مثل كرات ملونة بألوان مختلفة، فسنستخدم الدالة COUNT مع الأمر GROUP BY.

تُوضّح عبارة SELECT التالية كيفية عد مجموعات البيانات باستخدام الدالة COUNT مع جملة GROUP BY.

SELECT COUNT(*) FROM Books GROUP BY type

استخدام AVG وSUM مع GROUP BY

يمكننا استخدام الدالة AVG للحصول على متوسط أي مجموعة، وSUM للحصول على المجموع.

يستخدم المثال رقم 1 الدالة AVG مع GROUP BY type.

SELECT AVG(qty) FROM Books GROUP BY type

ويستخدم المثال رقم 2 الدالة SUM مع GROUP BY type.

SELECT SUM(qty) FROM Books GROUP BY type

ويستخدم المثال رقم 3 الدالتين AVG وSUM معًا مع GROUP BY type في عبارة SELECT.

SELECT ‘Total Sales’ = SUM(qty), ‘Average Sales’ = AVG(qty), stor_id FROM Sales GROUP BY StorID ORDER BY ‘Total Sales’

تقييد الصفوف باستخدام HAVING

يمكن استخدام جملة HAVING لتقييد الصفوف. وهي مشابهة لشرط WHERE، غير أن HAVING يمكن أن تتضمّن الدالة التجميعية (aggregate function)، بينما لا يستطيع WHERE ذلك.

تعمل جملة HAVING مثل جملة WHERE، لكنها تنطبق على المجموعات. وفي هذا المثال، نستخدم جملة HAVING لاستبعاد المجموعات التي مقاطعتُها ‘BC’.

SELECT au_fname AS ‘Author”s First Name’, province as ‘Province’ FROM Authors GROUP BY au_fname, province HAVING province <> ‘BC’

عبارة INSERT

تضيف عبارة INSERT صفوفًا إلى جدول. وإضافة إلى ذلك:

  • تحدد INSERT الجدول أو العرض (view) الذي ستُدرَج البيانات فيه.
  • تسرد Column_list الأعمدة التي ستتأثر بعبارة INSERT.
  • إذا أُغفل عمود، فيجب تزويد كل قيمة.
  • إذا أدرجت أعمدة، فيمكن سردها بأي ترتيب.
  • تحدد VALUES البيانات التي تريد إدراجها في الجدول. وVALUES إلزامية.
  • يجب ألا تسرد الأعمدة التي تحمل خاصية IDENTITY صراحةً في column_list أو values_clause.

الصيغة لعبارة INSERT هي:

INSERT [INTO] Table_name | view name [column_list] DEFAULT VALUES | values_list | select statement

وعند إدراج صفوف بعبارة INSERT، تنطبق القواعد التالية:

  • إدراج سلسلة فارغة (‘ ‘) في عمود varchar أو text يُدرِج مسافة واحدة.
  • تُحشو جميع أعمدة char من اليمين حتى الطول المحدَّد.
  • تُزال جميع المسافات الزائدة من البيانات المُدرَجة في أعمدة varchar، باستثناء السلاسل التي لا تحوي سوى مسافات. وتُقتطع هذه السلاسل إلى مسافة واحدة.
  • إذا خالفت عبارة INSERT قيدًا أو قيمة افتراضية أو قاعدة، أو إذا كان نوع البيانات خاطئًا، تفشل العبارة ويعرض SQL Server رسالة خطأ.

عند تحديد قيم لبعض الأعمدة في column_list فقط، يمكن أن يحدث لأعمدة لا قيم لها واحد من ثلاثة أمور:

  • تُدخَل قيمة افتراضية إذا كان للعمود قيد DEFAULT، أو إذا كانت القيمة الافتراضية مرتبطة بالعمود، أو إذا كانت القيمة الافتراضية مرتبطة بنوع البيانات المعرَّف من المستخدم الأساسي.
  • تُدخَل القيمة NULL إذا كان العمود يسمح بقيم NULL ولم تكن هناك قيمة افتراضية للعمود.
  • تُعرض رسالة خطأ ويُرفض الصف إذا كان العمود معرَّفًا بأنه NOT NULL ولم تكن هناك قيمة افتراضية.

يستخدم هذا المثال INSERT لإضافة سجل إلى جدول الناشرين Authors.

INSERT INTO Authors VALUES(‘555-093-467’, ‘Martin’, ‘April’, ‘281 555-5673’, ‘816 Market St.,’ , ‘Vancouver’, ‘BC’, ‘V7G3P4’, 0)

ويوضح المثال التالي كيفية إدراج صف جزئي في جدول الناشرين Publishers مع سرد الأعمدة. وكان لعمود البلد قيمة افتراضية هي Canada، لذا لا يلزم تضمينه في قيمك.

INSERT INTO Publishers (PubID, PubName, city, province) VALUES (‘9900’, ‘Acme Publishing’, ‘Vancouver’, ‘BC’)

ولإدراج صفوف في جدول يحوي عمود IDENTITY، اتبع المثال أدناه. ولا توفّر قيمة عمود IDENTITY ولا اسم العمود في قائمة الأعمدة.

INSERT INTO jobs VALUES (‘DBA’, 100, 175)

إدراج قيم محدَّدة في عمود IDENTITY

لا يمكن افتراضيًا إدراج البيانات مباشرة في عمود IDENTITY؛ لكن إذا حُذف صف بالخطأ، أو إذا كانت هناك فجوات في قيم عمود IDENTITY، فيمكنك إدراج صف مع تحديد قيمة عمود IDENTITY.

خيار IDENTITY_INSERT

للإسمح بالإدراج بقيمة هوية محدَّدة، يمكن استخدام خيار IDENTITY_INSERT على النحو التالي.

SET IDENTITY_INSERT jobs ON INSERT INTO jobs (job_id, job_desc, min_lvl, max_lvl) VALUES (19, ’DBA2’, 100, 175) SET IDENTITY_INSERT jobs OFF

إدراج الصفوف بعبارة SELECT

نحتاج أحيانًا إلى إنشاء جدول مؤقت صغير من جدول كبير. ولهذا، يمكننا إدراج صفوف بعبارة SELECT. وعند استخدام هذا الأمر، لا يوجد تحقق من التفرّد. ونتيجة لذلك، قد توجد صفوف كثيرة لها القيمة pub_id نفسها في المثال أدناه.

ينشئ هذا المثال جدول ناشرين مؤقتًا أصغر باستخدام عبارة CREATE TABLE. ثم تُستخدم INSERT مع عبارة SELECT لإضافة سجلات إلى جدول الناشرين المؤقت هذا من جدول publis.

CREATE TABLE dbo.tmpPublishers ( PubID char (4) NOT NULL , PubName varchar (40) NULL , city varchar (20) NULL , province char (2) NULL , country varchar (30) NULL DEFAULT (‘Canada’) ) INSERT tmpPublishers SELECT * FROM Publishers

وفي هذا المثال، ننسخ مجموعة جزئية من البيانات.

INSERT tmpPublishers (pub_id, pub_name) SELECT PubID, PubName FROM Publishers

وفي هذا المثال، تُنسخ بيانات الناشرين إلى الجدول tmpPublishers وتُضبط قيمة عمود البلد على Canada.

INSERT tmpPublishers (PubID, PubName, city, province, country) SELECT PubID, PubName, city, province, ‘Canada’ FROM Publishers

عبارة UPDATE

تغيّر عبارة UPDATE البيانات في الصفوف القائمة، سواء بإضافة بيانات جديدة أو بتعديل بيانات قائمة.

يستخدم هذا المثال عبارة UPDATE لتوحيد حقل البلد على Canada لكل السجلات في جدول الناشرين Publishers.

UPDATE Publishers SET country = ‘Canada’

ويزيد هذا المثال مبالغ رسوم الإتاوات (royalty) التي تتراوح بين 10 and 20 بنسبة 10%.

UPDATE roysched SET royalty = royalty + (royalty * .10) WHERE royalty BETWEEN 10 and 20

تضمين استعلامات فرعية (subqueries) في عبارة UPDATE

يُرقّى الموظفون من جدول Employees الذين وظّفهم الناشر عام 2010 إلى أعلى مستوى وظيفي لنوع وظيفتهم. وهذا هو ما ستبدو عليه عبارة UPDATE.

UPDATE Employees SET job_lvl = (SELECT max_lvl FROM jobs WHERE employee.job_id = jobs.job_id) WHERE DATEPART(year, employee.hire_date) = 2010

عبارة DELETE

تزيل عبارة DELETE الصفوف من مجموعة سجلات. وتُسمّي DELETE الجدول أو العرض الذي يحوي الصفوف التي ستُحذف، ولا يمكن سرد أكثر من جدول أو صف واحد في الوقت نفسه. وWHERE هي عبارة WHERE اعتيادية تحدّ من الحذف إلى السجلات المحدَّدة.

تبدو صيغة DELETE على النحو التالي.

DELETE [FROM] {table_name | view_name } [WHERE clause]

وقواعد عبارة DELETE هي:

  • إذا أغفلت جملة WHERE، فستُزال جميع الصفوف في الجدول (باستثناء الفهارس (indexes) والجدول والقيود).
  • لا يمكن استخدام DELETE مع عرض (view) يحوي جملة FROM تسمّي أكثر من جدول واحد. (يمكن أن يؤثر الحذف على جدول أساسي واحد فقط في الوقت نفسه.)

وفيما يلي ثلاث عبارات DELETE مختلفة يمكن استخدامها.

  1. حذف جميع الصفوف من جدول.

DELETE FROM Discounts

  1. حذف صفوف محدَّدة:

DELETE FROM Sales WHERE stor_id = ‘6380’

  1. حذف الصفوف استنادًا إلى قيمة في استعلام فرعي (subquery):

DELETE FROM Sales WHERE title_id IN (SELECT title_id FROM Books WHERE type = ‘mod_cook’)

الدوال المدمجة (built-in functions)

توجد في SQL Server دوال مدمجة (built-in functions) كثيرة، مثل:

  • التجميعية (Aggregate): تُعيد قيمًا ملخَّصة
  • التحويل (Conversion): تحوّل نوع بيانات إلى نوع آخر
  • التاريخ (Date): تعرض معلومات عن التواريخ والأوقات
  • الرياضية (Mathematical): تنفّذ عمليات على البيانات الرقمية
  • النصوص (String): تنفّذ عمليات على سلاسل المحارف أو البيانات الثنائية أو التعابير
  • النظام (System): تُعيد معلومة خاصة من قاعدة البيانات
  • النصوص والصور (Text and image): تنفّذ عمليات على بيانات النصوص والصور

فيما يلي أوصاف تفصيلية وأمثلة للدوال الأربع الأولى.

الدوال التجميعية (aggregate functions)

تنفّذ الدوال التجميعية حسابًا على مجموعة من القيم وتُعيد قيمة واحدة، أي قيمة ملخَّصة. ويسرد الجدول 16.4 هذه الدوال.

الدالة الوصف
AVG تُعيد متوسط جميع قيم التعبير، أو قيم DISTINCT منها فقط.
COUNT تُعيد عدد القيم غير الفارغة (non-null) في التعبير. وإذا حُدِّدت DISTINCT، فتُعدّ COUNT عدد القيم الفريدة غير الفارغة.
COUNT(*) تُعيد عدد الصفوف. ولا تأخذ COUNT(*) أي وسائط ولا يمكن استخدامها مع DISTINCT.
MAX تُعيد أكبر قيمة في التعبير. ويمكن استخدام MAX مع الأعمدة الرقمية والمحرفية وأعمدة datetime، لكن ليس مع أعمدة bit. ومع الأعمدة المحرفية، تجد MAX أعلى قيمة في تسلسل الفرز. وتتجاهل MAX أي قيم فارغة (null).
MIN تُعيد أصغر قيمة في التعبير. ويمكن استخدام MIN مع الأعمدة الرقمية والمحرفية وأعمدة datetime، لكن ليس مع أعمدة bit. ومع الأعمدة المحرفية، تجد MIN القيمة الأدنى في تسلسل الفرز. وتتجاهل MIN أي قيم فارغة.
SUM تُعيد مجموع جميع قيم التعبير، أو قيم DISTINCT منها فقط. ولا يمكن استخدام SUM إلا مع الأعمدة الرقمية.

الجدول 16.4 قائمة بالدوال التجميعية وأوصافها.

فيما يلي أمثلة لكل دالة تجميعية مدرجة في الجدول 16.4.

المثال رقم 1: AVG

SELECT AVG (price) AS ‘Average Title Price’ FROM Books

المثال رقم 2: COUNT

SELECT COUNT(PubID) AS ‘Number of Publishers’ FROM Publishers

المثال رقم 3: COUNT

SELECT COUNT(province) AS ‘Number of Publishers’ FROM Publishers

المثال رقم 3: COUNT (*)

SELECT COUNT(*) FROM Employees WHERE job_lvl = 35

المثال رقم 4: MAX

SELECT MAX (HireDate) FROM Employees

المثال رقم 5: MIN

SELECT MIN (price) FROM Books

المثال رقم 6: SUM

SELECT SUM(discount) AS ‘Total Discounts’ FROM Discounts

دالة التحويل (conversion function)

تحوّل دالة التحويل نوع بيانات إلى نوع آخر.

في المثال أدناه، يُحوَّل سعر يحوي الرقم 9 مرتين إلى خمسة محارف. وصيغة هذه العبارة هي SELECT ‘The date is ‘ + CONVERT(varchar(12), getdate()).

SELECT CONVERT(int, 10.6496) SELECT title_id, price FROM Books WHERE CONVERT(char(5), price) LIKE ‘%99%’

وفي هذا المثال الثاني، تغيّر دالة التحويل البيانات إلى نوع بيانات بحجم مختلف.

SELECT title_id, CONVERT(char(4), ytd_sales) as ‘Sales’ FROM Books WHERE type LIKE ‘%cook’

دالة التاريخ (date function)

تُنتج دالة التاريخ تاريخًا بإضافة فاصل زمني (interval) إلى تاريخ محدَّد. والنتيجة هي قيمة datetime تساوي التاريخ زائد عدد أجزاء التاريخ. وإذا كانت معامل التاريخ من نوع smalldatetime، فستكون النتيجة أيضًا من نوع smalldatetime.

تُستخدم الدالة DATEADD لإضافة قيم التاريخ وزيادتها. وصيغة هذه الدالة هي DATEADD(datepart, number, date).

SELECT DATEADD(day, 3, hire_date) FROM Employees

وفي هذا المثال، تُستخدم الدالة DATEDIFF(datepart, date1, date2).

ويُعيد هذا الأمر عدد “حدود” أجزاء التاريخ (datepart) التي تم عبورها بين تاريخين محدّدين.

SELECT DATEDIFF(day, HireDate, ‘Nov 30 1995’) FROM Employees

ولأي تاريخ بعينه، يمكننا فحص أي جزء من ذلك التاريخ من السنة إلى جزء الألف من الثانية.

وأجزاء التاريخ (DATEPART) واختصاراتها التي يتعرف عليها SQL Server، والقيم المقبولة مدرجة في الجدول 16.5.

جزء التاريخ الاختصار القيم
السنة yy 1753-9999
ربع السنة qq 1-4
الشهر mm 1-12
يوم من السنة dy 1-366
اليوم dd 1-31
الأسبوع wk 1-53
يوم الأسبوع dw 1-7 (Sun.-Sat.)
الساعة hh 0-23
الدقيقة mi 0-59
الثانية ss 0-59
جزء الألف من الثانية ms 0-999

الجدول 16.5. اختصارات أجزاء التاريخ وقيمها.

الدوال الرياضية (mathematical functions)

تنفّذ الدوال الرياضية عمليات على البيانات الرقمية. ويعرض المثال التالي السعر الحالي لكل كتاب باعته الناشر، وكيف سيكون السعر لو زادت جميع الأسعار بنسبة 10%.

SELECT Price, (price * 1.1) AS ‘New Price’, title FROM Books SELECT ‘Square Root’ = SQRT(81) SELECT ‘Rounded‘ = ROUND(4567.9876,2) SELECT FLOOR (123.45)

ضمّ الجداول (joining tables)

ضمّ جدولين أو أكثر هو عملية مقارنة البيانات في الأعمدة المحدَّدة واستخدام نتائج المقارنة لتكوين جدول جديد من الصفوف المؤهلة. وعبارة الضمّ (join):

  • تحدد عمودًا من كل جدول
  • تقارن القيم في تلك الأعمدة صفًا بصف
  • تدمج الصفوف ذات القيم المؤهلة في صف جديد

وعلى رغم أن المقارنة تكون عادةً بالتساوي – أي بقيم متطابقة تماماً – فإنه يمكن أيضاً تحديد أنواع أخرى من عمليات الضمّ. وفيما يلي وصف لجميع عمليات الضمّ المختلفة، مثل الضمّ الخارجي الأيسر (left outer join) والأيمن (right outer join) والمتقاطع (cross join).

الضمّ الداخلي (inner join)

يربط الضمّ الداخلي جدولين على عمود لهما نوع البيانات نفسه. ولا تُعاد إلا الصفوف التي تتطابق فيها قيم العمودين؛ أما الصفوف غير المتطابقة فتُهمَل.

المثال رقم 1

SELECT jobs.job_id, job_desc FROM jobs INNER JOIN Employees ON employee.job_id = jobs.job_id WHERE jobs.job_id < 7

المثال رقم 2

SELECT authors.au_fname, authors.au_lname, books.royalty, title FROM authorsINNER JOIN titleauthor ON authors.au_id=titleauthor.au_id INNER JOIN books ON titleauthor.title_id=books.title_id GROUP BY authors.au_lname, authors.au_fname, title, title.royalty ORDER BY authors.au_lname

الضمّ الخارجي الأيسر (left outer join)

يحدد الضمّ الخارجي الأيسر أن جميع الصفوف الخارجية اليسرى ستُعاد. وتُدرَج في مجموعة النتائج جميع الصفوف من الجدول الأيسر التي لم تستوفِ الشرط المحدَّد، وتضبط أعمدة الإخراج من الجدول الآخر على NULL.

ويستخدم هذا المثال الأول الصيغة الجديدة للضمّ الخارجي الأيسر.

SELECT publishers.pub_name, books.title FROM Publishers LEFT OUTER JOIN Books On publishers.pub_id = books.pub_id

وهذا مثال على ضمّ خارجي أيسر باستخدام الصيغة القديمة.

SELECT publishers.pub_name, books.title FROM Publishers, Books WHERE publishers.pub_id *= books.pub_id

الضمّ الخارجي الأيمن (right outer join)

يشمل الضمّ الخارجي الأيمن في مجموعة نتائجه جميع الصفوف من الجدول الأيمن التي لم تستوفِ الشرط المحدّد. وتضبط أعمدة الإخراج المقابلة للجدول الآخر على NULL.

وفيما يلي مثال باستخدام الصيغة الجديدة للضمّ الخارجي الأيمن.

SELECT titleauthor.title_id, authors.au_lname, authors.au_fname FROM titleauthor RIGHT OUTER JOIN authors ON titleauthor.au_id = authors.au_id ORDERY BY au_lname

ويوضح هذا المثال الثاني الصيغة القديمة المستخدمة في الضمّ الخارجي الأيمن.

SELECT titleauthor.title_id, authors.au_lname, authors.au_fname FROM titleauthor, authors WHERE titleauthor.au_id =* authors.au_id ORDERY BY au_lname

الضمّ الخارجي الكامل (full outer join)

يحدد الضمّ الخارجي الكامل أنه إذا لم يطابق صف من أي من الجدولين معايير الاختيار، فإن الصف يُدرَج في مجموعة النتائج، وتضبط أعمدة الإخراج فيه المقابلة للجدول الآخر على NULL.

وفيما يلي مثال على الضمّ الخارجي الكامل.

SELECT books.title, publishers.pub_name, publishers.province FROM Publishers FULL OUTER JOIN Books ON books.pub_id = publishers.pub_id WHERE (publishers.province <> “BC” and publishers.province <> “ON”) ORDER BY books.title_id

الضمّ المتقاطع (cross join)

الضمّ المتقاطع هو حاصل ضرب يجمع جدولين. وتعيد هذه العملية الضمّ نفس الصفوف التي لو لم تُحدَّد جملة WHERE. فمثلًا:

SELECT au_lname, pub_name, FROM Authors CROSS JOIN Publishers

دالة تجميعية (aggregate function): تُعيد قيمًا ملخَّصة. ASC: ترتيب تصاعدي

دالة التحويل (conversion function): تحوّل نوع بيانات إلى نوع آخر

ضمّ متقاطع (cross join): حاصل ضرب يجمع جدولين

دالة التاريخ (date function): تعرض معلومات عن التواريخ والأوقات

عبارة DELETE: تزيل الصفوف من مجموعة سجلات

DESC: ترتيب تنازلي

ضمّ خارجي كامل (full outer join): يحدد أنه إذا لم يطابق صف من أي من الجدولين معايير الاختيار

GROUP BY: يُستخدم لإنشاء صف ناتج واحد لكل مجموعة وينتج قيمًا ملخَّصة للأعمدة المحدَّدة

ضمّ داخلي (inner join): يربط جدولين على عمود لهما نوع البيانات نفسه

عبارة INSERT: تضيف صفوفًا إلى جدول

ضمّ خارجي أيسر (left outer join): يحدد أن جميع الصفوف الخارجية اليسرى ستُعاد

دالة رياضية (mathematical function): تنفّذ عمليات على البيانات الرقمية

ضمّ خارجي أيمن (right outer join): يضمّ جميع الصفوف من الجدول الأيمن التي لم تستوفِ الشرط المحدَّد

عبارة SELECT: تُستخدم للاستعلام عن البيانات في قاعدة البيانات

دالة نصوص (string function): تنفّذ عمليات على سلاسل المحارف أو البيانات الثنائية أو التعابير

دالة نظام (system function): تُعيد معلومة خاصة من قاعدة البيانات

دوال النصوص والصور (text and image functions): تنفّذ عمليات على بيانات النصوص والصور

عبارة UPDATE: تغيّر البيانات في الصفوف القائمة، سواء بإضافة بيانات جديدة أو بتعديل بيانات قائمة

المحرف البديل (wildcard): يسمح للمستخدم بمطابقة الحقول التي تحوي حروفًا معيَّنة.

للأسئلة من 1 إلى 18، استخدم قاعدة بيانات العينة PUBS التي أنشأتها Microsoft. ولتنزيل السكربت اللازم لإنشاء قاعدة البيانات هذه، انتقل إلى الموقع التالي: http://www.microsoft.com/en-ca/download/details.aspx?id=23654.

  • اعرض قائمة بتواريخ النشر وعناوين الكتب التي نُشرت في عام 2011.

  • اعرض قائمة بعناوين الكتب التي صُنِّفت إما على أنها طبخ تقليدي أو حديث. استخدم جدول Books.

  • اعرض جميع المؤلفين الذين تتكوّن أسماؤهم الأولى من خمسة محارف.

  • اعرض من جدول Books الحقول type وprice وpub_id وtitle الخاصة بالكتب التي أصدرها كل ناشر. وأعِد تسمية العمود type إلى “Book Category”. ورتّب حسب type (تنازليًا) ثم حسب price (تصاعديًا).

  • اعرض title_id وpubdate وpubdate مضافًا إليها ثلاثة أيام، باستخدام جدول Books.

  • باستخدام الدالتين datediff وgetdate، حدّد المدة المنقضية بالأشهر منذ نشر الكتب الموجودة في جدول Books.

  • سرد معرّفات العناوين (title IDs) وكميات جميع الكتب التي بيعت أكثر من 30 نسخة.

  • اعرض قائمة بجميع أسماء العائلة للمؤلفين الذين يعيشون في أونتاريو (ON) والمدن التي يعيشون فيها.

  • اعرض جميع الصفوف التي تحوي القيمة 60 في حقل payterms. استخدم جدول Sales.

  • اعرض جميع المؤلفين الذين تتكوّن أسماؤهم الأولى من خمسة محارف، وتنتهي بالحرف O أو A، وتبدأ بالحرف M أو P.

  • اعرض جميع العناوين التي تكلف أكثر من 30 دولارًا، وتبدأ إمّا بالحرف T أو يكون معرّف الناشر فيها هو 0877.

  • اعرض من جدول Employees الأعمدة fname (الاسم الأول) وlname (اسم العائلة) وemp_id (معرّف الموظف) وjob_lvl (المستوى الوظيفي) لهؤلاء الموظفين الذين مستواهم الوظيفي أكبر من 200؛ وأعِد تسمية عناوين الأعمدة إلى: “First Name” و“Last Name” و“IDENTIFICATION#” و“Job Level”.

  • اعرض royalty وroyalty مضافًا إليها 50% تحت اسم “royalty plus 50” وtitle_id. استخدم جدول Roysched.

  • باستخدام الدالة STUFF، أنشئ السلسلة “12xxxx567” من السلسلة “1234567”.

  • اعرض أول 40 محرفًا من كل عنوان، إلى جانب متوسط المبيعات الشهرية لذلك العنوان حتى تاريخه (ytd_sales/12). استخدم جدول Title.

  • بيّن كم عدد الكتب التي لها أسعار محدَّدة.

  • اعرض قائمة بكتب الطبخ مع متوسط تكلفة جميع كتب كل نوع. استخدم GROUP BY.

  • لا تعمل معاملات المجموعات العلائقية (relational set operators) UNION وINTERSECT وMINUS بشكل صحيح إلا إذا كانت العلاقات متوافقة مع الاتحاد (union-compatible). فما الذي يعنيه التوافق مع الاتحاد، وكيف تتحقق من هذا الشرط؟

  • ما الفرق بين UNION وUNION ALL؟ اكتب صيغة كل منهما.

  • ولنفترض أن لديك جدولين هما Employees وEmployees_1. ويحتوي جدول Employees على سجلات ثلاثة موظفين هم: Alice Cordoza وJohn Cretchakov وAnne McDonald. ويحتوي جدول Employees_1 على سجلات الموظفين: John Cretchakov وMary Chen. وبالنظر إلى هذه المعلومات، ما ناتج استعلام UNION؟ سرد الناتج.

  • بالنظر إلى معلومات الموظفين في السؤال 3، ما ناتج استعلام UNION ALL؟ سرد الناتج.

  • بالنظر إلى معلومات الموظفين في السؤال 3، ما ناتج استعلام INTERSECT؟ سرد الناتج.

  • بالنظر إلى معلومات الموظفين في السؤال 3، ما ناتج استعلام EXCEPT؟ سرد الناتج.

  • ما هو الضمّ المتقاطع (cross join)؟ أعطِ مثالًا على صيغته.

  • اشرح أنواع الضمّ الثلاثة التالية: الضمّ الخارجي الأيسر

  • الضمّ الخارجي الأيمن

  • الضمّ الخارجي الكامل

ما هو الاستعلام الفرعي (subquery)، وما خصائصه الأساسية؟ وما هو الاستعلام الفرعي المترابط (correlated subquery)؟ أعطِ مثالًا. ولنفترض أن جدول Product يحوي خاصيتين هما PROD_CODE وVEND_CODE. وقيم PROD_CODE هي: ABC وDEF وGHI وJKL. وتُقابَل بالقيم التالية لـVEND_CODE: 125 و124 و124 و123 على التوالي (مثلًا، قيمة PROD_CODE وهي ABC تقابل قيمة VEND_CODE وهي 125). ويحتوي جدول Vendor على خاصية واحدة هي VEND_CODE بقيمها 123 و124 و125 و126. (وخاصية VEND_CODE في جدول Product هي مفتاح أجنبي (foreign key) يشير إلى VEND_CODE في جدول Vendor.) وبالنظر إلى المعلومات في السؤال 11، ما ناتج الاستعلام لكل مما يلي؟ بيّن القيم.

  • استعلام UNION قائم على هذين الجدولين

  • استعلام UNION ALL قائم على هذين الجدولين

  • استعلام INTERSECT قائم على هذين الجدولين

  • استعلام MINUS قائم على هذين الجدولين

  • اعرض قائمة بجميع العناوين وأرقام المبيعات في جدولي Books وSales، بما في ذلك العناوين التي لا مبيعات لها. استخدم ضمًّا (join).

  • اعرض قائمة بأسماء عائلة المؤلفين والعناوين المرتبطة التي أصدرها كل مؤلف، مرتبة حسب اسم عائلة المؤلف. استخدم ضمًّا. واحفظها كعرض (view) باسم: Published Authors.

  • باستخدام استعلام فرعي، اعرض جميع المؤلفين (اعرض اسم العائلة والاسم الأول والرمز البريدي) الذين يحصلون على إتاوات 100% ويعيشون في ألبرتا. واحفظه كعرض بعنوان: AuthorsView. وعند إنشاء العرض، أعِد تسمية اسم عائلة المؤلف واسمه الأول إلى ‘Last Name’ و‘First Name’.

  • اعرض المتاجر التي لم تبع العنوان Is Anger the Enemy?

  • اعرض قائمة بأسماء المتاجر للمبيعات بعد عام 2013 (أي أن تاريخ الطلب أكبر من 2013). واعرض اسم المتجر وتاريخ الطلب.

  • اعرض قائمة بالعناوين للكتب المباعة في المتجر المسمى “News & Brews”. واعرض اسم المتجر والعناوين وتواريخ الطلبات.

  • سرد إجمالي المبيعات (qty) حسب العنوان. واعرض عمودَي الكمية الإجمالية والعنوان.

  • سرد إجمالي المبيعات (qty) حسب النوع. واعرض عمودَي الكمية الإجمالية والنوع.

  • سرد إجمالي المبيعات (qty*price) حسب النوع. واعرض عمودَي القيمة الدولارية الإجمالية والنوع.

  • احسب العدد الإجمالي لأنواع الكتب لكل ناشر. وبيّن اسم الناشر والعدد الإجمالي لأنواع الكتب لكل ناشر.

  • بيّن أسماء الناشرين الذين ليس لديهم أي نوع من الكتب. واعرض اسم الناشر فقط.