SQL 命令的类型
SQL是一种结构化查询语言,用于处理结构化数据。结构化数据通常以关系或表的形式存储。
每当我们把数据存储在表或关系中时,就需要使用SQL命令。此外,还需要使用这些命令来检索存储在表中的数据。
让我们借助实际示例更深入地研究SQL命令的分类。我们将使用MySQL数据库来编写所有查询。
(A) DDL
- DDL代表数据定义语言。DDL命令处理模式,即存储数据的表。
- SQL中的DDL命令可以实现对表的所有结构更改,如创建、删除和修改。
- DDL下的命令包括:
- CREATE
- ALTER
- DROP
- TRUNCATE
- RENAME
让我们详细了解一下DDL类别中的每个命令。
1. CREATE:
在SQL中,每当我们想在数据库中创建一个新数据库或表时,我们使用create命令。
CREATE DATABASE DatabaseName;
创建表格的语法:
CREATE TABLE TableName (ColumnName1 datatype, ColumnName2 datatype,….., ColumnName3 datatype);
示例 1:
编写查询以创建一个名为school的数据库。
查询:
mysql> CREATE DATABASE SCHOOL;
在这里,我们执行了一个CREATE DATABASE查询,紧接着是数据库名称’SCHOOL’。
我们将执行以下命令来验证数据库’SCHOOL’是否已创建:
mysql> SHOW DATABASES;
以上命令的结果验证了’SCHOOL’数据库已成功创建。
示例2:
编写一个查询在数据库’SCHOOL’中创建一个名为t_school的表。
要在’SCHOOL’数据库中创建表’t_school’,我们必须先选中’SCHOOL’数据库。
要在MySQL中选中数据库,我们将执行以下查询:
mysql> USE SCHOOL;
我们已执行“ USE ”命令,其后跟着数据库名称“SCHOOL”。
现在,在执行此查询之后,我们将执行以下查询:
mysql> CREATE TABLE t_school(ID INT PRIMARY KEY, School_Name VARCHAR(40), Number_Of_Students INT, Number_Of_Teachers INT, Number_Of_Classrooms INT, EmailID VARCHAR(40));
在这里,我们执行了一个CREATE TABLE查询,后面是表名 ‘t_school’。
我们将执行以下命令来验证是否已创建表 ‘t_school’:
mysql> SHOW TABLES;
上述命令结果验证了在’SCHOOL’数据库中成功创建了’t_school’表。
2. ALTER
在SQL中,每当我们希望更改表结构时,我们将使用ALTER命令。使用alter命令,我们可以对表进行结构更改,例如添加新列,删除表中的现有列,更改现有列的数据类型和重命名现有列。
在编写使用ALTER命令的查询之前,让我们先来看一下语法。
ALTER命令添加新列的语法:
ALTER TABLE table_name ADD column_name datatype(size);
ALTER命令的语法用于删除现有列:
ALTER TABLE table_name DROP COLUMN column_name;
修改命令语法以重命名现有表的列:
ALTER TABLE table_name RENAME COLUMN old_column_name TO new_column_name;
更改现有列的数据类型的ALTER命令的语法:
ALTER TABLE table_name MODIFY column_name datatype(size);
示例 1:
编写一个查询,在t_school表中添加一个新列Board_of_Education,数据类型为VARCHAR。
在执行向’t_school’表添加新列的查询之前,我们将执行以下查询以查看表结构:
mysql> DESC t_school;
mysql> ALTER TABLE t_school ADD Board_of_Education VARCHAR(20);
在这里,我们在表t_school上执行了“ALTER命令”,紧跟着使用ADD关键字和列名’Board_of_Education’,数据类型为VARCHAR,大小为20。这意味着一个新的列名为’Board_of_Education’,数据类型为VARCHAR,大小为20将会被添加到现有的’t_school’表中。
现在,我们将再次对t_school表应用DESC命令。
mysql> DESC t_school;
这将验证新列“Board_of_Education”已成功添加到t_school表中。
示例2:
编写一个查询以从t_school表中删除列Board_of_Education。
在执行从’t_school’表中删除列的查询之前,我们将执行以下查询以查看表结构:
mysql> DESC t_school;
mysql> ALTER TABLE t_school DROP COLUMN Board_of_Education;
我们在表格t_school上执行了“ALTER command”,紧接着使用DROP COLUMN关键字,并指定了要删除的列名‘Board_of_Education’。这意味着表格t_school中名为‘Board_of_Education’的列将被删除。
现在,我们将再次对t_school表格应用DESC命令。
mysql> DESC t_school;
此验证了列“Board_of_Education”已经成功从t_school表中删除。
示例3:
编写一个查询,使用alter命令将列Number_of_Students重命名为“Count_Students”从t_school表中。
在执行查询以将列从“t_school”表中重命名之前,我们将执行以下查询以查看表结构:
mysql> DESC t_school;
mysql> ALTER TABLE t_school RENAME COLUMN Number_of_Students TO Count_Students;
我们在表t_school上执行了’ALTER’命令,然后是RENAME COLUMN关键字。这里,Number_of_Students是旧的列名,TO关键字后指定的列名,即Count_Students是新的列名。这意味着’t_school’表中的现有列’Number_of_Students’将被’Count_Students’替换。
现在,我们将再次对t_school表应用DESC命令。
mysql> DESC t_school;
这验证了在t_school表中,列’Number_of_Students’成功重命名为’Count_Students’。
例子4:
编写一个查询语句,将’t_school’表中’Number_of_Students’的数据类型更改为’VARCHAR’,并设置新的数据类型为’20’。
在执行修改’t_school’表中的列数据类型和大小的查询之前,我们将执行以下查询以查看表结构:
mysql> DESC t_school;
mysql> ALTER TABLE t_school MODIFY ID VARCHAR(20);
我们在表t_school上执行了’ALTER命令’,然后是MODIFY关键字。在这里,ID是列名,VARCHAR是ID列的新数据类型,后面是大小,即20。
现在,我们将再次应用DESC命令在t_school表上。
mysql> DESC t_school;
3. DROP
DROP命令是 用于从数据库中删除表的记录和表的结构。
语法:
DROP TABLE table_name;
示例:
编写一个查询来从SCHOOL数据库中删除t_school表。
查询:
mysql> DROP TABLE t_school;
在这里,我们对表“t_school”执行了DROP TABLE命令。
我们将执行以下命令来验证表“t_school”是否存在。
mysql> SHOW TABLES;
以上命令的结果验证了在“SCHOOL”数据库中成功删除了“t_school”表。
4. TRUNCATE
TRUNCATE命令用于删除表的记录,但表的结构在数据库中保持不变。
语法:
TRUNCATE TABLE table_name;
示例:
编写查询以从“t_school”表中删除所有记录。
在执行从“t_school”表中删除记录的查询之前,我们将执行SELECT查询以查看表中的记录:
mysql> SELECT *FROM t_school;
ID | School_Name | Number_Of_Students | Number_Of_Teachers | Number_Of_Classrooms | EmailID |
---|---|---|---|---|---|
1 | Boys Town Public School | 1000 | 80 | 12 | btps15@gmail.com |
2 | Guru Govind Singh Public School | 800 | 35 | 15 | ggps25@gmail.com |
3 | Delhi Public School | 1200 | 30 | 10 | dps101@gmail.com |
4 | Ashoka Universal School | 1110 | 40 | 40 | aus17@gmail.com |
5 | Calibers English Medium School | 9000 | 31 | 50 | cems@gmail.com |
6 | Cantonment Board High School | 7050 | 41 | 60 | cbhs@gmail.com |
7 | Podar International School | 12000 | 120 | 120 | podaris89@gmail.com |
8 | Barnes School | 18000 | 100 | 100 | barnes99@gmail.com |
9 | D.S Kothari Kanya School | 10000 | 120 | 125 | ksmh@gmail.com |
10 | Orchid International School | 20000 | 200 | 180 | ois@gmail.com |
mysql> TRUNCATE TABLE t_school;
这里,我们在t_school表上执行了“TRUNCATE命令”。 这意味着将删除t_school表中的所有记录,同时保持数据库中的表结构不变。
现在,我们将再次对t_school表应用SELECT查询。
mysql> SELECT *FROM t_school;
以上结果显示,’t_school’表中的所有记录已成功删除。
5. RENAME
RENAME命令用于给现有表赋予新名称。
重命名表的语法:
RENAME TABLE old_table_name TO new_table_name;
示例:
编写一个查询来将t_school表重命名为tbl_school。
在执行查询以重命名’t_school’表之前,我们将执行SHOW TABLES命令。
mysql>SHOW TABLES;
mysql> RENAME TABLE t_school TO tbl_school;
我们在表t_school上执行了’RENAME command’,接着使用’TO’关键字指定了新表名。这意味着’t_school’表现在将被重命名为tbl_school。
现在,我们将再次执行SHOW TABLES命令。
mysql>SHOW TABLES;
以上的结果显示t_school表不在列表中。相反,列表中存在tbl_school表,这意味着该表已成功重命名为tbl_school。
(B) DML
- DML代表数据操作语言。使用SQL中的DML命令,我们可以对表中的数据进行更改。
- 每当我们希望操作数据或获取SQL表中的数据时,我们可以使用SQL中的DML命令。
- SQL中的DML命令将更改数据,例如向SQL表中插入新记录、删除或更新现有记录。我们还可以根据我们的需求检索SQL表中的所有数据。
- DDL中包含的命令有:
- INSERT
- SELECT
- UPDATE
- DELETE
让我们更详细地看一下DML类别中的每个命令。
1. INSERT
INSERT命令用于向表中插入记录。我们可以同时为单个表插入单个记录和多个记录。
语法:
INSERT INTO table_name VALUES (Column1_Value, Column2_Value, …., ColumnN_Value);
示例:
编写一个查询,在t_school表中插入10条记录。
查询语句:
mysql> INSERT INTO t_school(ID, School_Name, Number_of_Students, Number_of_Teachers, Number_of_Classrooms, EmailID) VALUES(1, "Boys Town Public School", 1000, 80, 12, "btps15@gmail.com"), (2, "Guru Govind Singh Public School", 800, 35, 15, "ggps25@gmail.com"), (3, "Delhi Public School", 1200, 30, 10, "dps101@gmail.com"), (4, "Ashoka Universal School", 1110, 40, 40, "aus17@gmail.com"), (5, "Calibers English Medium School", 9000, 31, 50, "cems@gmail.com"), (6, "Cantonment Board High School", 7050, 41, 60, "cbhs@gmail.com"), (7, "Podar International School", 12000, 120, 120, "podaris89@gmail.com"), (8, "Barnes School", 18000, 100, 100, "barnes99@gmail.com"), (9, "D.S Kothari Kanya School", 10000, 120, 125, "ksmh@gmail.com"), (10, "Orchid International School", 20000, 200, 180, "ois@gmail.com");
由于我们希望在表中插入十个记录,所以我们没有写十次INSERT命令,而是写了一个单独的INSERT命令来一次性插入多个记录。
2. SELECT
SELECT命令用于从表中检索记录。 根据我们的要求,我们可以检索出所有记录或者从表中检索出一些特定的记录。每当我们想要从表中检索一些特定的记录时,就必须在SELECT查询中指定WHERE子句。WHERE子句会包含一个条件,与该条件匹配的任何记录都将被视为输出的一部分。
检索所有记录的语法:
SELECT *FROM table_name;
检索特定记录的语法:
SELECT *FROM table_name WHERE condition;
示例1:
编写一个查询,从t_school表的所有记录中检索所有列的值。
查询:
mysql> SELECT *FROM t_school;
在这里,我们对t_school表执行了带有星号(*
)的SELECT查询。这将从t_school表中检索所有记录的所有列值。
输出:
ID | School_Name | Number_Of_Students | Number_Of_Teachers | Number_Of_Classrooms | EmailID |
---|---|---|---|---|---|
1 | Boys Town Public School | 1000 | 80 | 12 | btps15@gmail.com |
2 | Guru Govind Singh Public School | 800 | 35 | 15 | ggps25@gmail.com |
3 | Delhi Public School | 1200 | 30 | 10 | dps101@gmail.com |
4 | Ashoka Universal School | 1110 | 40 | 40 | aus17@gmail.com |
5 | Calibers English Medium School | 9000 | 31 | 50 | cems@gmail.com |
6 | Cantonment Board High School | 7050 | 41 | 60 | cbhs@gmail.com |
7 | Podar International School | 12000 | 120 | 120 | podaris89@gmail.com |
8 | Barnes School | 18000 | 100 | 100 | barnes99@gmail.com |
9 | D.S Kothari Kanya School | 10000 | 120 | 125 | ksmh@gmail.com |
10 | Orchid International School | 20000 | 200 | 180 | ois@gmail.com |
所有记录从t_school表中成功检索。
示例2:
编写一个查询来检索只有超过11间教室的学校的所有列值。
查询:
mysql> SELECT *FROM t_school WHERE Number_Of_Classrooms > 11;
我们使用星号(*
)在t_school表上执行了一个SELECT查询,然后是一个WHERE子句条件。由于WHERE子句条件,在“Number_of_classrooms”列中值大于11的记录才会被检索出来。
输出:
ID | School_Name | Number_Of_Students | Number_Of_Teachers | Number_Of_Classrooms | EmailID |
---|---|---|---|---|---|
1 | Boys Town Public School | 1000 | 80 | 12 | btps15@gmail.com |
2 | Guru Govind Singh Public School | 800 | 35 | 15 | ggps25@gmail.com |
4 | Ashoka Universal School | 1110 | 40 | 40 | aus17@gmail.com |
5 | Calibers English Medium School | 9000 | 31 | 50 | cems@gmail.com |
6 | Cantonment Board High School | 7050 | 41 | 60 | cbhs@gmail.com |
7 | Podar International School | 12000 | 120 | 120 | podaris89@gmail.com |
8 | Barnes School | 18000 | 100 | 100 | barnes99@gmail.com |
9 | D.S Kothari Kanya School | 10000 | 120 | 125 | ksmh@gmail.com |
10 | Orchid International School | 20000 | 200 | 180 | ois@gmail.com |
在t_school表中有九所学校,有超过11个教室。
3. UPDATE
UPDATE命令用于修改表中的值。每当我们希望更新表中任何记录的值时,我们将使用SQL中的UPDATE命令。
语法:
UPDATE table_name SET column_name = value WHERE condition;
示例:
编写一个查询来更新ID为9的记录,并将Number_of_Teachers和Number_of_Classrooms的更新值分别设置为125和9。
查询语句:
mysql> UPDATE t_school SET Number_Of_Teachers = 125, Number_Of_Classrooms = 120 WHERE ID=9;
我们将执行SELECT查询来验证ID为9的记录的教师数量和教室数量是否更新。
mysql> SELECT *FROM t_school WHERE ID=9;
ID | School_Name | Number_Of_Students | Number_Of_Teachers | Number_Of_Classrooms | EmailID |
---|---|---|---|---|---|
9 | D.S Kothari Kanya School | 10000 | 125 | 120 | ksmh@gmail.com |
4. DELETE
DELETE命令用于从表中删除记录。
语法:
DELETE FROM table_name;
示例:
编写查询以从t_school表中删除ID为6的记录。
查询:
mysql> DELETE FROM t_school WHERE ID = 6;
我们将执行SELECT查询以验证ID为6的记录是否已被删除。
mysql> SELECT * FROM t_school;
ID | School_Name | Number_Of_Students | Number_Of_Teachers | Number_Of_Classrooms | EmailID |
---|---|---|---|---|---|
1 | Boys Town Public School | 1000 | 80 | 12 | btps15@gmail.com |
2 | Guru Govind Singh Public School | 800 | 35 | 15 | ggps25@gmail.com |
3 | Delhi Public School | 1200 | 30 | 10 | dps101@gmail.com |
4 | Ashoka Universal School | 1110 | 40 | 40 | aus17@gmail.com |
5 | Calibers English Medium School | 9000 | 31 | 50 | cems@gmail.com |
7 | Podar International School | 12000 | 120 | 120 | podaris89@gmail.com |
8 | Barnes School | 18000 | 100 | 100 | barnes99@gmail.com |
9 | D.S Kothari Kanya School | 10000 | 120 | 125 | ksmh@gmail.com |
10 | Orchid International School | 20000 | 200 | 180 | ois@gmail.com |
结果显示,ID为6的记录已成功从t_school表中删除。
(C) DCL
- DCL代表数据控制语言。
- 当我们想要控制SQL表中的数据访问时,我们将使用SQL中的DCL命令。只有授权用户可以访问存储在表中的数据。
- 每个用户都将拥有一些预定义的权限;相应地,该特定用户可以访问数据。使用SQL中的DCL命令,我们可以为用户在SQL数据库和表上授予权限,或者也可以从用户那里撤销已给予的权限。
- DCL涵盖的命令有:
1. GRANT
使用GRANT命令可以为用户分配对数据库和表的访问权限。
2. REVOKE
使用REVOKE命令可以撤销已分配给用户的所有访问权限。
(D) TCL
- TCL代表事务控制语言。TCL命令通常用于事务中。
- 使用SQL中的TCL命令,我们可以将我们的事务保存到数据库中,并将其回滚到事务中的特定点。我们还可以使用SAVEPOINT命令保存事务的特定部分。
- TCL涵盖的命令有:
1. COMMIT:
要保存在特定事务中执行的所有操作,我们需要在事务完成后执行提交命令。
2. ROLLBACK
使用SQL中的回滚命令,您可以回滚到事务的最后保存状态。
3. SAVEPOINT
使用SAVEPOINT命令,您可以为事务的特定部分分配一个名称。
示例:
mysql> START TRANSACTION;
mysql>INSERT INTO t_school(ID, School_Name, Number_of_Students, Number_of_Teachers, Number_of_Classrooms, EmailID) VALUES(1, "Boys Town Public School", 1000, 80, 12, "btps15@gmail.com"), (2, "Guru Govind Singh Public School", 800, 35, 15, "ggps25@gmail.com"), (3, "Delhi Public School", 1200, 30, 10, "dps101@gmail.com"), (4, "Ashoka Universal School", 1110, 40, 40, "aus17@gmail.com"), (5, "Calibers English Medium School", 9000, 31, 50, "cems@gmail.com");
mysql> COMMIT;
mysql> SET autocommit = 0;
mysql> SAVEPOINT ins;
直到这一点,我们已经开始了一个事务,在其中插入记录,提交了事务,并在插入之后创建了一个SAVEPOINT。
mysql> DELETE FROM t_school WHERE ID = 3;
mysql> SAVEPOINT del;
我们已经删除了一条记录并在删除之后创建了一个保存点del,但是后来我们意识到我们需要最近删除的记录。因此,我们将回滚到SAVEPOINT ins。
mysql> ROLLBACK TO ins;
mysql> SELECT *FROM t_school;
ID | School_Name | Number_Of_Students | Number_Of_Teachers | Number_Of_Classrooms | EmailID |
---|---|---|---|---|---|
1 | Boys Town Public School | 1000 | 80 | 12 | btps15@gmail.com |
2 | Guru Govind Singh Public School | 800 | 35 | 15 | ggps25@gmail.com |
3 | Delhi Public School | 1200 | 30 | 10 | dps101@gmail.com |
4 | Ashoka Universal School | 1110 | 40 | 40 | aus17@gmail.com |
5 | Calibers English Medium School | 9000 | 31 | 50 | cems@gmail.com |
在回滚到ins之后,我们可以看到所有的记录都被检索出来了(包括删除的记录)。