Introduction to SQLمقدمة في لغة SQL
مقدمة الفصل
ماذا ستتعلم في هذا الفصل
- SQL history and data definition: domain types, create table, integrity constraints, drop and alter.
- Basic query structure: select, from, where; rename, string matching, ordering, between, duplicates.
- Set operations, null values and three-valued logic, aggregate functions with group by and having.
- Nested subqueries: in / not in, some, all, exists, unique, subqueries in from, with, scalar subqueries.
- Modifying the database: delete, insert, update and case.
أقسام الفصل
- 1SQL history and the data-definition languageتاريخ SQL ولغة تعريف البيانات
- 2Domain types in SQLأنواع النطاقات في SQL
- 3Create table, integrity constraints, drop and alterإنشاء الجداول والقيود والحذف والتعديل
- 4Basic query structure: select, from, whereبنية الاستعلام: select وfrom وwhere
- 5Rename, string operations, ordering and betweenإعادة التسمية والنصوص والترتيب وbetween
- 6Duplicates and set operationsالتكرار وعمليات المجموعات
- 7Null values and three-valued logicالقيم null والمنطق الثلاثي
- 8Aggregate functions, group by and havingدوال التجميع وgroup by وhaving
- 9Nested subqueries: membership, some, allالاستعلامات الفرعية: الانتماء وsome وall
- 10exists, not exists and uniqueexists وnot exists وunique
- 11Subqueries in from, the with clause and scalar subqueriesالاستعلام الفرعي في from وwith والاستعلام القياسي
- 12Modification of the database: delete, insert, updateتعديل القاعدة: الحذف والإدراج والتحديث
تلميح: استخدم أسهم لوحة المفاتيح للتنقل بين الشرائح.
SQL and its data-definition languageSQL ولغة التعريف
SQL history and the data-definition language
History (slide 3)
- IBM Sequel language developed as part of the System R project at the IBM San Jose Research Laboratory.
- Renamed Structured Query Language (SQL).
- ANSI and ISO standard SQL: SQL-86, SQL-89, SQL-92, SQL:1999 (language name became Y2K compliant!), SQL:2003.
- Commercial systems offer most, if not all, SQL-92 features, plus varying feature sets from later standards and special proprietary features. Not all examples here may work on your particular system.
The SQL DDL specifies (slide 4)
- The schema for each relation.
- The domain of values associated with each attribute.
- Integrity constraints.
- Also: the set of indices, security and authorization information, and the physical storage structure of each relation on disk.
Domain typesأنواع البيانات
| Typeالنوع | Meaningالمعنى |
|---|---|
| char(n) | Fixed length character string, with user-specified length n. |
| varchar(n) | Variable length character strings, with user-specified maximum length n. |
| int | Integer (a finite subset of the integers that is machine-dependent). |
| smallint | Small integer (a machine-dependent subset of the integer domain type). |
| numeric(p,d) | Fixed point number, with user-specified precision of p digits, with d digits to the right of decimal point. |
| real, double precision | Floating point and double-precision floating point numbers, with machine-dependent precision. |
| float(n) | Floating point number, with user-specified precision of at least n digits. |
- More are covered in Chapter 4.
المسألة
Which values can numeric(3,1) store exactly: 44.5, 444.5, 0.32? (slide 5)
خطوات الحل
- numeric(3,1): 3 digits in all, 1 of them after the decimal point.
- 44.5 has 3 digits with 1 after the point. 444.5 needs 4 digits. 0.32 needs 2 digits after the point.
النتيجة
Only 44.5 (not 444.5 or 0.32).
Attribute data types and domains in SQLأنواع البيانات
Domain types in SQL
| Typeالفئة | SQL Data Typeنوع SQL | Usedالاستخدام |
|---|---|---|
| Numeric | INTEGER or INT and SMALLINT |
|
| Numeric | FLOAT or REAL and DOUBLE PRECISION | Floating-point (real) numbers of various precision |
| Numeric | NUMERIC (i, j) or DECIMAL (i, j) |
|
| Character-string | CHAR(n) or CHARACTER(n) |
|
| Character-string | VARCHAR2(n) or CHAR VARYING(n) or CHARACTER VARYING(n) |
|
| Bit-string | BIT(n) |
|
| Bit-string | BIT VARYING (n) |
|
| Boolean | BOOLEAN | There are three values (TRUE, FALSE and UNKNOWN) |
| Date_Time | DATE |
|
| Date_Time | TIME |
|
| Date_Time | TIME(i) | Made up of hour:minute:second plus i additional digits specifying fractions of a second. Format is hh:mm:ss:i |
create table and integrity constraintsإنشاء الجداول
Create table, integrity constraints, drop and alter
create table r (A1 D1, A2 D2, …, An Dn, (integrity-constraint1), …, (integrity-constraintk)) — r is the relation name, each Ai an attribute name, Di the data type of the domain of Ai.
Integrity constraints (slide 10)
- not null
- primary key (A1, …, An)
- foreign key (Am, …, An) references r
- A primary key declaration on an attribute automatically ensures not null.
More definitions, drop and alterdrop وalter
Create table, integrity constraints, drop and alter
takes (slide 11)
- primary key (ID, course_id, sec_id, semester, year); foreign key (ID) references student; foreign key (course_id, sec_id, semester, year) references section.
- Note: sec_id can be dropped from the primary key to ensure a student cannot be registered for two sections of the same course in the same semester.
- The ALTER TABLE statement is used to add, delete, or modify columns in an existing table.
Removes the relation r.
Adds attribute A with domain D; all existing tuples are assigned null as the value for the new attribute.
Removes attribute A; dropping of attributes is not supported by many databases.
select, from, whereselect وfrom وwhere
select A1, …, An from r1, …, rm where P — Ai attributes, ri relations, P a predicate. The result of an SQL query is a relation.
| Clauseالجملة | Roleدورها | Relational algebraالمقابل في الجبر العلائقي |
|---|---|---|
| select | Lists the attributes desired in the result | Projection (Π) |
| from | Lists the relations involved in the query | Cartesian product (×) |
| where | Specifies conditions the result must satisfy | Selection predicate (σ) |
- SQL names are case insensitive (Name ≡ NAME ≡ name).
- Conditions combine with and, or, not: where dept_name = 'Comp. Sci.' and salary > 80000.
Inside the select clauseجملة select
Basic query structure: select, from, where
- SQL allows duplicates in relations and query results; select distinct dept_name removes duplicates; select all keeps them.
- An asterisk select * denotes "all attributes".
- A literal: select '437' returns one column and a single row; select '437' as FOO names the column; select 'A' from instructor returns N rows (one per instructor tuple), each "A".
- Arithmetic: select ID, name, salary/12 as monthly_salary from instructor.
| ID | name | dept_name | salary |
|---|---|---|---|
| 10101 | Srinivasan | Comp. Sci. | 65000 |
| 12121 | Wu | Finance | 90000 |
| 15151 | Mozart | Music | 40000 |
| 22222 | Einstein | Physics | 95000 |
| 32343 | El Said | History | 60000 |
| 33456 | Gold | Physics | 87000 |
| 45565 | Katz | Comp. Sci. | 75000 |
| 58583 | Califieri | History | 62000 |
| 76543 | Singh | Finance | 80000 |
| 76766 | Crick | Biology | 72000 |
| 83821 | Brandt | Comp. Sci. | 92000 |
| 98345 | Kim | Elec. Eng. | 80000 |
| dept_name |
|---|
| Comp. Sci. |
| Finance |
| Music |
| Physics |
| History |
| Physics |
| Comp. Sci. |
| History |
| Finance |
| Biology |
| Comp. Sci. |
| Elec. Eng. |
Combining relations in fromالربط في from
Basic query structure: select, from, where
select * from instructor, teaches generates every possible instructor–teaches pair; common attributes are renamed with the relation name (instructor.ID). The Cartesian product is useful combined with a where condition.
| ID | course_id | sec_id | semester | year |
|---|---|---|---|---|
| 10101 | CS-101 | 1 | Fall | 2009 |
| 10101 | CS-315 | 1 | Spring | 2010 |
| 10101 | CS-347 | 1 | Fall | 2009 |
| 12121 | FIN-201 | 1 | Spring | 2010 |
| 15151 | MU-199 | 1 | Spring | 2010 |
| 22222 | PHY-101 | 1 | Fall | 2009 |
| Inst.ID | name | dept_name | salary | teaches.ID | course_id | sec_id | semester | year |
|---|---|---|---|---|---|---|---|---|
| 10101 | Srinivasan | Comp. Sci. | 65000 | 10101 | CS-101 | 1 | Fall | 2009 |
| 10101 | Srinivasan | Comp. Sci. | 65000 | 10101 | CS-315 | 1 | Spring | 2010 |
| 10101 | Srinivasan | Comp. Sci. | 65000 | 10101 | CS-347 | 1 | Fall | 2009 |
| 10101 | Srinivasan | Comp. Sci. | 65000 | 12121 | FIN-201 | 1 | Spring | 2010 |
| 10101 | Srinivasan | Comp. Sci. | 65000 | 15151 | MU-199 | 1 | Spring | 2010 |
| 10101 | Srinivasan | Comp. Sci. | 65000 | 22222 | PHY-101 | 1 | Fall | 2009 |
| … | … | … | … | … | … | … | … | … |
| … | … | … | … | … | … | … | … | … |
| 12121 | Wu | Finance | 90000 | 10101 | CS-101 | 1 | Fall | 2009 |
| 12121 | Wu | Finance | 90000 | 10101 | CS-315 | 1 | Spring | 2010 |
| 12121 | Wu | Finance | 90000 | 10101 | CS-347 | 1 | Fall | 2009 |
| 12121 | Wu | Finance | 90000 | 12121 | FIN-201 | 1 | Spring | 2010 |
| 12121 | Wu | Finance | 90000 | 15151 | MU-199 | 1 | Spring | 2010 |
| 12121 | Wu | Finance | 90000 | 22222 | PHY-101 | 1 | Fall | 2009 |
| … | … | … | … | … | … | … | … | … |
| … | … | … | … | … | … | … | … | … |
Names with department and building (Figure 3.5)الشكل 3.5
Basic query structure: select, from, where
Figure 3.5: the result of "Retrieve the names of all instructors, along with their department names and department building name." It combines the instructor table with the department table.
| ID | name | dept_name | salary |
|---|---|---|---|
| 22222 | Einstein | Physics | 95000 |
| 12121 | Wu | Finance | 90000 |
| 32343 | El Said | History | 60000 |
| 45565 | Katz | Comp. Sci. | 75000 |
| 98345 | Kim | Elec. Eng. | 80000 |
| 76766 | Crick | Biology | 72000 |
| 10101 | Srinivasan | Comp. Sci. | 65000 |
| 58583 | Califieri | History | 62000 |
| 83821 | Brandt | Comp. Sci. | 92000 |
| 15151 | Mozart | Music | 40000 |
| 33456 | Gold | Physics | 87000 |
| 76543 | Singh | Finance | 80000 |
| dept_name | building | budget |
|---|---|---|
| Comp. Sci. | Taylor | 100000 |
| Biology | Watson | 90000 |
| Elec. Eng. | Taylor | 85000 |
| Music | Packard | 80000 |
| Finance | Painter | 120000 |
| History | Painter | 50000 |
| Physics | Watson | 70000 |
| name | dept_name | building |
|---|---|---|
| Srinivasan | Comp. Sci. | Taylor |
| Wu | Finance | Painter |
| Mozart | Music | Packard |
| Einstein | Physics | Watson |
| El Said | History | Painter |
| Gold | Physics | Watson |
| Katz | Comp. Sci. | Taylor |
| Califieri | History | Painter |
| Singh | Finance | Painter |
| Crick | Biology | Watson |
| Brandt | Comp. Sci. | Taylor |
| Kim | Elec. Eng. | Taylor |
Rename and the self-joinإعادة التسمية
Rename, string operations, ordering and between
old-name as new-name renames relations and attributes; the keyword as is optional (instructor as T ≡ instructor T).
| person | supervisor |
|---|---|
| Bob | Alice |
| Mary | Susan |
| Alice | David |
| David | Mary |
Questions on emp_super (slide 26)
- Find the supervisor of "Bob".
- Find the supervisor of the supervisor of "Bob".
- Find ALL the supervisors (direct and indirect) of "Bob".
| S.person | S.supervisor | T.person | T.supervisor |
|---|---|---|---|
| Bob | Alice | Bob | Alice |
| Bob | Alice | Mary | Susan |
| Bob | Alice | Alice | David |
| Bob | Alice | David | Mary |
| Mary | Susan | Bob | Alice |
| Mary | Susan | Mary | Susan |
| Mary | Susan | Alice | David |
| Mary | Susan | David | Mary |
| Alice | David | Bob | Alice |
| Alice | David | Mary | Susan |
| Alice | David | Alice | David |
| Alice | David | David | Mary |
| David | Mary | Bob | Alice |
| David | Mary | Mary | Susan |
| David | Mary | Alice | David |
| David | Mary | David | Mary |
المسألة
select distinct S.supervisor, T.supervisor from emp_super S, emp_super T where S.supervisor = T.person; (slide 27)
خطوات الحل
- Pair each row S with the row T whose person is S's supervisor.
- Bob→Alice with Alice→David; Alice→David with David→Mary; David→Mary with Mary→Susan; Susan has no row as a person.
النتيجة
(Alice, David), (David, Mary), (Mary, Susan) — so the supervisor of Bob's supervisor (Alice) is David.
String matching with likelike والأنماط
Rename, string operations, ordering and between
Matches any substring.
Matches any (one) character.
| Patternالنمط | Matchesما يطابقه |
|---|---|
| 'Intro%' | Any string beginning with "Intro" |
| '%Comp%' | Any string containing "Comp" as a substring |
| '_ _ _' | Any string of exactly three characters |
| '_ _ _ %' | Any string of at least three characters |
- Patterns are case sensitive.
- Find the names of all instructors whose name includes the substring "dar": select name from instructor where name like '%dar%'
- Match the string "100%": like '100 \%%' escape '\' — in that example backslash (\) is the escape character. The slide also gives: like '1_ _$%%' escape '$'.
- SQL supports a variety of string operations such as concatenation (using "||"), converting from upper to lower case (and vice versa), finding string length, extracting substrings, etc.
order by and betweenالترتيب وbetween
Rename, string operations, ordering and between
order by (slide 30)
- select distinct name from instructor order by name
- desc for descending, asc for ascending — ascending is the default.
- Sort on multiple attributes: order by dept_name, name.
Where-clause predicates (slide 31)
- between: where salary between 90000 and 100000 — that is, ≥ 90000 and ≤ 100000.
- Tuple comparison: where (instructor.ID, dept_name) = (teaches.ID, 'Biology').
Set operations and duplicatesعمليات المجموعات
Duplicates and set operations
| Operationالعملية | Meaning in the exampleالمعنى في المثال |
|---|---|
| union | Courses that ran in Fall 2009 or in Spring 2010 |
| intersect | Courses that ran in Fall 2009 and in Spring 2010 |
| except | Courses that ran in Fall 2009 but not in Spring 2010 |
- union, intersect and except automatically eliminate duplicates; the multiset versions union all, intersect all, except all retain them.
| Expressionالتعبير | Occurrences of the tupleعدد مرات الظهور |
|---|---|
| r union all s | m + n |
| r intersect all s | min(m, n) |
| r except all s | max(0, m − n) |
Set operations on c1 and c2 (Figures 3.9–3.13)مثال c1 وc2
Duplicates and set operations
| course_id |
|---|
| CS-101 |
| CS-347 |
| PHY-101 |
| course_id |
|---|
| CS-101 |
| CS-315 |
| CS-319 |
| CS-319 |
| FIN-201 |
| HIS-351 |
| MU-199 |
| course_id |
|---|
| CS-101 |
| CS-315 |
| CS-319 |
| CS-347 |
| FIN-201 |
| HIS-351 |
| MU-199 |
| PHY-101 |
| course_id |
|---|
| CS-101 |
| course_id |
|---|
| CS-347 |
| PHY-101 |
Multiset semanticsدلالة التكرار
Duplicates and set operations
- σθ(r1): all c1 copies of a tuple that satisfies θ are kept.
- ΠA(r1): one projected copy for each copy of t1.
- r1 × r2: c1 × c2 copies of t1.t2.
المسألة
r1(A, B) = {(1, a), (2, a)}, r2(C) = {(2), (3), (3)} (slide 33). What are ΠB(r1) and ΠB(r1) × r2?
خطوات الحل
- Projection keeps one (a) per tuple of r1: {(a), (a)}.
- Each (a) pairs with each tuple of r2: 2 × 3 = 6 tuples.
النتيجة
ΠB(r1) = {(a), (a)}; ΠB(r1) × r2 = {(a,2), (a,2), (a,3), (a,3), (a,3), (a,3)}
SQL duplicate semantics (slide 33)
- select A1, A2, …, An from r1, r2, …, rm where P is equivalent to the multiset version of the expression Π A1, A2, …, An (σP (r1 × r2 × … × rm)).
The largest salary with except (slide 36)
- (select distinct salary from instructor) except (select distinct T.salary from instructor as T, instructor as S where T.salary < S.salary)
Null values and three-valued logicnull والمنطق الثلاثي
- null signifies an unknown value or that a value does not exist.
- Any arithmetic expression involving null is null: 5 + null returns null.
- Check with is null: select name from instructor where salary is null.
- Any comparison with null returns unknown: 5 < null, null <> null, null = null.
| Expressionالتعبير | Resultالناتج |
|---|---|
| unknown or true | true |
| unknown or false | unknown |
| unknown or unknown | unknown |
| true and unknown | unknown |
| false and unknown | false |
| unknown and unknown | unknown |
| not unknown | unknown |
- A where-clause predicate that evaluates to unknown is treated as false.
- It is possible for tuples to have a null value, denoted by null, for some of their attributes (slide 38).
- "P is unknown" evaluates to true if predicate P evaluates to unknown (slide 39).
Aggregate functionsدوال التجميع
Aggregate functions (slide 40)
- avg
- min
- max
- sum
- count
Null values and aggregates (slide 46)
- sum(salary) ignores null amounts; the result is null if there is no non-null amount.
- All aggregate operations except count(*) ignore tuples with null values on the aggregated attributes.
- Only null values: count returns 0; all other aggregates return null.
| SUM(SALARY) | AVG(SALARY) | MAX(SALARY) | MIN(SALARY) | COUNT(SALARY) |
|---|---|---|---|---|
| null | null | null | null | 0 |
group by: average salary per departmentمثال group by
Aggregate functions, group by and having
| ID | name | dept_name | salary |
|---|---|---|---|
| 76766 | Crick | Biology | 72000 |
| 45565 | Katz | Comp. Sci. | 75000 |
| 10101 | Srinivasan | Comp. Sci. | 65000 |
| 83821 | Brandt | Comp. Sci. | 92000 |
| 98345 | Kim | Elec. Eng. | 80000 |
| 12121 | Wu | Finance | 90000 |
| 76543 | Singh | Finance | 80000 |
| 32343 | El Said | History | 60000 |
| 58583 | Califieri | History | 62000 |
| 15151 | Mozart | Music | 40000 |
| 33456 | Gold | Physics | 87000 |
| 22222 | Einstein | Physics | 95000 |
| dept_name | salary |
|---|---|
| Biology | 72000 |
| Comp. Sci. | 77333 |
| Elec. Eng. | 80000 |
| Finance | 85000 |
| History | 61000 |
| Music | 40000 |
| Physics | 91000 |
group by and havinggroup by وhaving
- Attributes in the select clause outside of aggregate functions must appear in the group by list: select dept_name, ID, avg(salary) … group by dept_name is erroneous.
- having predicates are applied after the formation of groups; where predicates are applied before forming groups.
| course | semester | student |
|---|---|---|
| IS320 | 1 | Norah |
| IS320 | 1 | Haya |
| IS320 | 2 | Mona |
| IS320 | 2 | Maha |
| IS320 | 2 | Rana |
| IS200 | 1 | Nada |
| IS200 | 1 | Arwa |
المسألة
SELECT course, semester, COUNT(student) AS count FROM course_attend GROUP BY course, semester;
خطوات الحل
- Form one group per (course, semester) pair.
- Count the students in each group.
النتيجة
(IS320, 1, 2), (IS320, 2, 3), (IS200, 1, 2)
Subqueries and set membershipالاستعلام الفرعي وin
Nested subqueries: membership, some, all
A select-from-where expression nested within another query. In select A1, …, An from r1, …, rm where P: Ai can be a subquery that generates a single value, ri any valid subquery, and P an expression B <operation> (subquery).
Tests in the where clause (slide 49)
- set membership: in, not in
- set comparison: any, some, all
- set cardinality: count(*)
some and allsome وall
Nested subqueries: membership, some, all
F <comp> some rsome
- ⇔ ∃ t ∈ r such that (F <comp> t) — true for at least one t.
- (5 < some {0, 5, 6}) = true; (5 < some {0, 5}) = false.
- (5 = some {0, 5}) = true; (5 ≠ some {0, 5}) = true.
- (= some) ≡ in, but (≠ some) ≢ not in.
F <comp> all rall
- ⇔ ∀ t ∈ r (F <comp> t) — true for every t.
- (5 < all {0, 5, 6}) = false; (5 < all {6, 10}) = true.
- (5 = all {4, 5}) = false; (5 ≠ all {4, 6}) = true.
- (≠ all) ≡ not in, but (= all) ≢ in.
exists, not exists and uniqueexists وunique
exists r ⇔ r ≠ Ø — true if the argument subquery is nonempty.
not exists r ⇔ r = Ø.
Tests whether a subquery has any duplicate tuples; true if the subquery contains no duplicates — e.g., courses offered at most once in 2009.
- S is a correlation name (a variable of the outer query); the inner query is a correlated subquery.
- Students who took all Biology courses: not exists ((Biology courses) except (courses the student took)) — because X − Y = Ø ⇔ X ⊆ Y. This query cannot be written using = all and its variants.
not exists, unique and not unique in queriesاستعلامات unique
exists, not exists and unique
- We can test for the existence of duplicate tuples in a subquery by using the not unique construct (slide 61).
Subqueries in from and the with clausefrom الفرعي وwith
Subqueries in from, the with clause and scalar subqueries
- With a subquery in from, the having clause is not needed — the outer where filters the averages.
Defines a temporary relation whose definition is available only to the query in which the with clause occurs.
Scalar subqueriesالاستعلام القياسي
A subquery used where a single value is expected.
- Runtime error if the subquery returns more than one result tuple.
Deletionالحذف
Modification of the database: delete, insert, update
Modification of the database (slide 68)
- Deletion of tuples from a given relation.
- Insertion of new tuples into a given relation.
- Updating of values in some tuples in a given relation.
المسألة
delete from instructor where salary < (select avg (salary) from instructor); — the average changes as tuples are deleted. What does SQL do? (slide 70)
خطوات الحل
- 1. First, compute avg(salary) and find all tuples to delete.
- 2. Next, delete all tuples found above (without recomputing avg or retesting the tuples).
النتيجة
The tuples to delete are fixed by the average computed before any deletion.
Insertionالإدراج
Modification of the database: delete, insert, update
- The select-from-where statement is evaluated fully before any of its results are inserted into the relation; otherwise queries like insert into table1 select * from table1 would cause problems.
Updates and caseالتحديث وcase
Modification of the database: delete, insert, update
- The order is important — running the 5% update first could push a salary over 100,000 and then raise it again by 3%.
- Done better with case: update instructor set salary = case when salary <= 100000 then salary * 1.05 else salary * 1.03 end
Update with a scalar subquery (slide 75)
- update student S set tot_cred = (select sum(credits) from takes, course where takes.course_id = course.course_id and S.ID = takes.ID and takes.grade <> 'F' and takes.grade is not null);
- This sets tot_cred to null for students who have not taken any course; use case when sum(credits) is not null then sum(credits) else 0 end instead.
الخلاصة
أنهيت الدرس
الخطوة التالية: ثبّت المعلومات بالبطاقات، ثم اختبر نفسك بالأسئلة.
ما راجعته في هذا الدرس
- SQL history and the data-definition languageتاريخ SQL ولغة تعريف البيانات
- Domain types in SQLأنواع النطاقات في SQL
- Create table, integrity constraints, drop and alterإنشاء الجداول والقيود والحذف والتعديل
- Basic query structure: select, from, whereبنية الاستعلام: select وfrom وwhere
- Rename, string operations, ordering and betweenإعادة التسمية والنصوص والترتيب وbetween
- Duplicates and set operationsالتكرار وعمليات المجموعات
- Null values and three-valued logicالقيم null والمنطق الثلاثي
- Aggregate functions, group by and havingدوال التجميع وgroup by وhaving
- Nested subqueries: membership, some, allالاستعلامات الفرعية: الانتماء وsome وall
- exists, not exists and uniqueexists وnot exists وunique
- Subqueries in from, the with clause and scalar subqueriesالاستعلام الفرعي في from وwith والاستعلام القياسي
- Modification of the database: delete, insert, updateتعديل القاعدة: الحذف والإدراج والتحديث