目录
[方式1:使用常规INSERT INTO语句](#方式1:使用常规INSERT INTO语句)
[方式1:使用常规DELETE FROM语句](#方式1:使用常规DELETE FROM语句)
[SQL Server](#SQL Server)
[a. 基本SELECT语句](#a. 基本SELECT语句)
[b. 条件筛选](#b. 条件筛选)
[c. 排序结果](#c. 排序结果)
[SQL Server常用语法](#SQL Server常用语法)
SQL(Structured Query Language)具有四个主要的子集,用于不同的数据库操作,这些子集分别是:
-
DML(Data Manipulation Language): DML用于操纵数据库中的数据,主要包括插入、更新、删除数据的操作。常见的DML语句包括INSERT、UPDATE、DELETE。
-
DQL(Data Query Language): DQL用于查询数据库中的数据,它主要包括用于检索信息的查询操作,其中最常见的是SELECT语句。
-
DDL(Data Definition Language): DDL用于定义数据库的结构,包括创建、修改、删除数据库对象,如表、索引、视图等。常见的DDL语句包括CREATE、ALTER、DROP。
-
DCL(Data Control Language): DCL用于数据库的访问控制和权限管理,它包括授权、撤销授权等语句,用于管理用户对数据库的权限。常见的DCL语句包括GRANT和REVOKE。
这四个子集一起构成了SQL的核心功能,使用户能够管理数据库对象、执行查询、操纵数据以及控制访问权限。不同的数据库管理系统(DBMS)支持SQL的不同子集,但这些子集都是SQL语言的标准组成部分。
常见的DDL操作
创建数据库
要创建一个新数据库,您可以使用SQL中的CREATE DATABASE
语句,后面跟着数据库的名称。例如:
sql
CREATE DATABASE MyDatabase;
这将创建一个名为"MyDatabase"的新数据库。
删除数据库
要删除数据库及其所有内容,可以使用SQL中的DROP DATABASE
语句,后面跟着数据库的名称。请谨慎使用此操作,因为它将永久删除数据库中的所有数据。例如:
sql
DROP DATABASE MyDatabase;
这将永久删除名为"MyDatabase"的数据库。
查看数据库:
要查看数据库的列表或属性,可以使用数据库管理系统(DBMS)提供的查询或命令。具体操作取决于使用的DBMS。以下是一些常见的示例:
在MySQL中,您可以使用以下命令列出所有数据库:
sql
SHOW DATABASES;
在SQL Server中,您可以使用以下查询来列出所有数据库:
sql
SELECT name FROM sys.databases;
创建表格
创建表格是数据库设计的第一步。使用DDL中的CREATE TABLE
语句,我们可以定义表格的结构,包括列的名称、数据类型、约束条件等。这是数据存储的基础。
sql
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Salary DECIMAL(10, 2)
);
这个SQL代码用于创建名为"Employees"的表格。以下是各个部分的解释:
-
CREATE TABLE Employees
: 这是DDL语句的起始部分,指示要创建一个名为"Employees"的表格。 -
(EmployeeID INT PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50), Salary DECIMAL(10, 2))
: 这部分定义了表格的列。每列由列名和数据类型组成,其中包括EmployeeID
(整数类型),FirstName
和LastName
(文本类型),以及Salary
(十进制数类型)。PRIMARY KEY
关键字指示EmployeeID
列是主键,用于唯一标识每个记录。
删除表格
有时候,我们需要从数据库中删除不再需要的表格。使用DDL中的DROP TABLE
语句,我们可以永久删除表格及其数据。
sql
DROP TABLE Employees;
这个SQL代码用于永久删除名为"Employees"的表格及其所有数据。以下是解释:
DROP TABLE Employees
: 这部分指示要删除名为"Employees"的表格。
添加主键
sql
Alter table tabname add primary key(col)
删除主键
sql
Alter table tabname drop primary key(col)
查看表格
在MySQL中,您可以使用以下SQL查询来查看数据库中的表格:
sql
SHOW TABLES;
在SQL Server中,您可以使用以下SQL查询来列出当前数据库中的所有表格:
sql
SELECT table_name = t.name
FROM sys.tables t
INNER JOIN sys.schemas s
ON t.schema_id = s.schema_id;
查看表的结构
使用以下SQL语句可以查看表格的结构
sql
DESCRIBE table_name;
或
sql
SHOW COLUMNS FROM table_name;
改变表格名字
使用以下SQL语句可以更改表格的名字:
sql
ALTER TABLE old_table_name RENAME TO new_table_name;
添加列
sql
-- 在Employees表格中添加新列Email
ALTER TABLE Employees
ADD Email VARCHAR(100);
在上面的示例中,我们使用ALTER TABLE
语句,指定要修改的表格(Employees),然后使用ADD
子句添加新列(Email),并指定新列的数据类型(VARCHAR(100))。
删除列
sql
-- 从Employees表格中删除列Email
ALTER TABLE Employees
DROP COLUMN Email;
在上面的示例中,我们使用ALTER TABLE
语句指定要修改的表格(Employees),然后使用DROP COLUMN
子句删除列(Email)。
修改列名
使用以下SQL语句可以修改列名:
sql
ALTER TABLE table_name
CHANGE old_column_name new_column_name new_data_type;
这将把名为old_column_name
的列的名字更改为new_column_name
,并可以选择性地更改数据类型。
修改表格
据库结构是动态的,需要不断适应变化的需求。DDL允许我们使用ALTER TABLE
语句来修改表格结构,如添加新列、修改列数据类型或添加约束条件。
sql
ALTER TABLE Employees
ADD Email VARCHAR(100);
这个SQL代码用于修改名为"Employees"的表格,添加一个名为"Email"的新列。以下是解释:
-
ALTER TABLE Employees
: 这部分指示要修改名为"Employees"的表格。 -
ADD Email VARCHAR(100)
: 这部分表示要向表格中添加一个新列,名为"Email",数据类型为VARCHAR,最大长度为100个字符。
创建索引
索引是加速数据检索的关键。DDL允许我们使用CREATE INDEX
语句来定义一个或多个列的索引,提高数据检索性能。
sql
CREATE INDEX idx_EmployeeLastName ON Employees(LastName);
个SQL代码用于在名为"Employees"的表格的"LastName"列上创建一个索引。以下是解释:
-
CREATE INDEX idx_EmployeeLastName
: 这部分表示要创建一个名为"idx_EmployeeLastName"的索引。 -
ON Employees(LastName)
: 这部分指示该索引应该建立在名为"Employees"的表格的"LastName"列上,以加速对"LastName"列的数据检索。
删除索引
sql
DROP INDEX index_name ON table_name
**注:**索引是不可更改的,想更改必须删除重新建。
创建视图
sql
create view viewname as select statement
删除视图
sql
drop view viewname
常见的DML操作
DML是SQL的子集,专注于操作和管理数据库中的数据。它是数据库管理的核心,允许我们以不同的方式操纵数据,以满足应用程序的需求。
插入数据
插入数据是DML中的基本操作,用于将新数据添加到数据库表格中。有多种方式可以实现插入数据,下面是一些示例:
方式1:使用常规INSERT INTO语句
sql
INSERT INTO Customers (CustomerName, ContactName, ContactEmail)
VALUES ('CompanyA', 'John Smith', 'john@example.com');
在这个示例中,我们使用INSERT INTO
语句指定要插入数据的目标表格(Customers),然后在VALUES
子句中指定要插入的值,这将在表格中创建一条新记录。
方式2:插入多行数据
sql
INSERT INTO Orders (OrderID, CustomerID, OrderDate)
VALUES (1, 101, '2023-01-15'),
(2, 102, '2023-01-16'),
(3, 101, '2023-01-17');
这个示例演示如何一次插入多行数据,以便高效地添加多个记录。
更新数据
更新数据是DML的另一个关键操作,它允许我们修改数据库中的现有数据。以下是一些更新数据的方式:
方式1:使用常规UPDATE语句
sql
UPDATE Employees
SET Salary = 55000.00
WHERE EmployeeID = 1001;
在这个示例中,我们使用UPDATE
语句指定要更新的目标表格(Employees),然后使用SET
子句指定要更新的列和新值,最后使用WHERE
子句确定要更新的行。
方式2:同时更新多个列
sql
UPDATE Orders
SET OrderStatus = 'Shipped',
ShippedDate = '2023-01-20'
WHERE OrderID = 123;
这个示例演示了如何同时更新多个列,以便在一次操作中修改多个字段的值。
删除数据
删除数据是DML操作的一个关键方面,用于从数据库中永久删除不再需要的数据。以下是一些删除数据的方式:
方式1:使用常规DELETE FROM语句
sql
DELETE FROM Customers
WHERE CustomerName = 'CompanyA';
在这个示例中,我们使用DELETE FROM
语句指定要删除的目标表格(Customers),然后使用WHERE
子句确定要删除的行。
方式2:删除所有数据
sql
DELETE FROM Products;
这个示例演示了如何删除表格中的所有数据,这在清理整个表格时非常有用。
查询数据
查询数据是DML的核心,用于检索数据库中的数据。以下是一些不同方式的查询数据:
方式1:基本SELECT语句
sql
SELECT CustomerName, ContactName
FROM Customers;
这是最基本的查询方式,用于选择特定列的数据。
方式2:使用聚合函数
sql
SELECT COUNT(*) AS TotalOrders
FROM Orders;
这个示例演示了如何使用聚合函数(COUNT
)来汇总数据,以获取总订单数。
方式3:多表联接
sql
SELECT Customers.CustomerName, Orders.OrderDate
FROM Customers
JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
这个示例演示了如何将多个表格联接在一起,以获取相关数据。
高级DML技巧
除了基本的插入、更新、删除和查询操作,还有一些高级DML技巧:
事务管理
使用事务可以确保一系列DML操作要么全部成功,要么全部失败。这有助于维护数据库的一致性。
sql
BEGIN TRANSACTION;
-- 执行一系列DML操作
COMMIT;
-- 或者 ROLLBACK 如果需要回滚操作
使用子查询
子查询允许您在DML操作中使用查询结果,以便根据其他数据来操作数据。
sql
UPDATE Products
SET Price = Price * 0.9
WHERE CategoryID IN (SELECT CategoryID FROM Categories WHERE CategoryName = 'Electronics');
使用触发器
触发器是在DML操作之前或之后自动触发的存储过程。它们可以用于执行特定的操作,如日志记录或数据验证。
常见的DCL操作
数据库授权是授予用户或角色对数据库对象的访问权限的过程。权限控制是确保用户只能执行其具备权限的操作的方法。通过DCL语句,数据库管理员可以执行以下操作:
SQL Server
创建用户
-
创建登录(用户名和密码):
sqlCREATE LOGIN NewUser WITH PASSWORD = 'UserPassword';
使用
CREATE LOGIN
语句创建登录,登录将作为用户的凭证。NewUser
是要创建的登录用户名,UserPassword
是登录的密码。 -
创建用户并将其与数据库关联:
sqlUSE YourDatabaseName; CREATE USER NewUser FOR LOGIN NewUser;
使用 USE
语句选择要创建用户的数据库。使用 CREATE USER
语句为登录创建数据库用户。NewUser
是用户的名称,它将与创建的登录关联起来。
给用户授权
使用 GRANT
语句为用户分配权限。
sql
GRANT SELECT, INSERT, UPDATE ON YourTableName TO NewUser;
这个语句将授予 NewUser
用户对 YourTableName
表格的 SELECT
、INSERT
和 UPDATE
权限。
撤销授权
使用 REVOKE
语句来撤销已授予的权限。
sql
REVOKE SELECT, INSERT, UPDATE ON YourTableName FROM NewUser;
这个语句将从 NewUser
用户中撤销对 YourTableName
表格的 SELECT
、INSERT
和 UPDATE
权限。
查看用户权限
要查看用户的权限,您可以使用以下查询:
sql
SELECT permission_name, state_desc
FROM sys.database_permissions
WHERE grantee_principal_id = USER_ID('NewUser');
这个查询将返回 NewUser
用户在数据库中拥有的权限列表,以及这些权限的状态。
删除用户
删除用户需要首先删除用户与数据库的关联,然后删除登录。
-
删除用户与数据库的关联:
sqlUSE YourDatabaseName; DROP USER NewUser;
使用
USE
语句选择要删除用户的数据库。使用DROP USER
语句删除用户。 -
删除登录:
sqlDROP LOGIN NewUser;
使用
DROP LOGIN
语句删除登录。
修改用户密码
要更改用户密码,可以使用以下命令:
sql
ALTER LOGIN NewUser WITH PASSWORD = 'NewPassword';
这个命令将 NewUser
登录的密码更改为 NewPassword
。
MySQL
创建用户
在MySQL中,您可以使用 CREATE USER
语句创建用户。
sql
CREATE USER 'NewUser'@'localhost' IDENTIFIED BY 'UserPassword';
这个语句将创建一个名为 NewUser
的用户,只允许从 localhost
访问,并且使用 UserPassword
作为密码。
给用户授权
使用 GRANT
语句为用户分配权限:
sql
GRANT SELECT, INSERT, UPDATE ON YourDatabaseName.YourTableName TO 'NewUser'@'localhost';
这个语句将授予 NewUser
用户对 YourDatabaseName.YourTableName
表格的 SELECT
、INSERT
和 UPDATE
权限。
撤销授权
使用 REVOKE
语句来撤销已授予的权限:
sql
REVOKE SELECT, INSERT, UPDATE ON YourDatabaseName.YourTableName FROM 'NewUser'@'localhost';
这个语句将从 NewUser
用户中撤销对 YourDatabaseName.YourTableName
表格的 SELECT
、INSERT
和 UPDATE
权限。
查看用户权限
您可以使用以下查询来查看用户的权限:
sql
SHOW GRANTS FOR 'NewUser'@'localhost';
这个查询将返回 NewUser
用户在数据库中的权限列表。
删除用户
要删除MySQL用户,使用 DROP USER
语句:
sql
DROP USER 'NewUser'@'localhost';
修改用户密码
要更改用户密码,可以使用以下命令:
sql
SET PASSWORD FOR 'NewUser'@'localhost' = PASSWORD('NewPassword');
这个命令将 NewUser
用户在 localhost
上的密码更改为 NewPassword
。
数据库权限的层次结构
数据库权限通常具有层次结构,其中高级别的权限包含了低级别的权限。一些常见的数据库权限包括:
SELECT
:允许用户查询数据库对象的数据。INSERT
:允许用户向数据库对象中插入新数据。UPDATE
:允许用户修改数据库对象中的数据。DELETE
:允许用户从数据库对象中删除数据。CREATE
:允许用户创建新的数据库对象,如表格、视图、存储过程等。ALTER
:允许用户修改现有的数据库对象的结构。DROP
:允许用户删除数据库对象。GRANT
:允许用户授权其他用户或角色。REVOKE
:允许用户回收已授权的权限。
通过将这些权限分配给特定的用户或角色,数据库管理员可以实现细粒度的权限控制,确保数据库的安全性和完整性。
角色的使用
数据库管理员通常使用角色来简化权限管理。角色是一组权限的集合,可以将用户分配给角色,而不必单独分配每个权限。这提高了权限管理的效率,因为可以根据角色来管理权限,而不是为每个用户分配权限。
注意事项和最佳实践
在使用DCL进行权限控制时,有一些重要的注意事项和最佳实践:
- 最小权限原则:仅授予用户或角色所需的最小权限,以降低不必要的风险。
- 定期审查权限:定期审查和更新用户和角色的权限,以确保数据库安全性和完整性。
- 谨慎使用
WITH GRANT OPTION
:WITH GRANT OPTION
允许用户将其获得的权限授予其他用户,要慎用以防止权限滥用。 - 记录权限变更:记录权限的授予和撤销,以便跟踪权限变更的历史。
常见的DQL操作
多种查询方式
a. 基本SELECT语句
基本的SELECT语句用于从数据库中检索数据。以下是一个例子,从名为Employees
的表格中检索员工的姓名和工资信息:
sql
SELECT FirstName, LastName, Salary
FROM Employees;
b. 条件筛选
条件筛选允许您根据特定条件筛选数据行。在以下示例中,我们只检索工资高于50000的员工:
sql
SELECT FirstName, LastName, Salary
FROM Employees
WHERE Salary > 50000;
c. 排序结果
您可以使用ORDER BY
子句对结果进行排序。以下是一个示例,按工资降序排列员工:
sql
SELECT FirstName, LastName, Salary
FROM Employees
ORDER BY Salary DESC;
使用聚合函数
聚合函数用于计算结果集中的统计信息,如总和、平均值、最大值和最小值。以下是一个示例,计算所有员工的平均工资:
sql
SELECT AVG(Salary)
FROM Employees;
分组和分组函数
分组操作允许您将结果集按一列或多列分组,然后使用分组函数对每个组进行聚合。以下是一个示例,按部门分组并计算每个部门的平均工资:
sql
SELECT Department, AVG(Salary)
FROM Employees
GROUP BY Department;
内连接
内连接(INNER JOIN)用于将两个表格中相匹配的行联接在一起。以下是一个内连接的示例,它检索员工的姓名和所属部门:
sql
SELECT Employees.FirstName, Employees.LastName, Departments.DepartmentName
FROM Employees
INNER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
内连接仅返回两个表格中匹配的行。
左连接
左连接(LEFT JOIN)返回左表格的所有行,以及与右表格匹配的行。如果没有匹配的行,将显示NULL值。以下是一个左连接示例,返回所有员工和他们的部门信息,包括那些没有分配到部门的员工:
sql
SELECT Employees.FirstName, Employees.LastName, Departments.DepartmentName
FROM Employees
LEFT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
这个查询将返回所有员工的姓名以及他们所属的部门,如果员工没有分配到部门,将显示NULL。
右连接
右连接(RIGHT JOIN)返回右表格的所有行,以及与左表格匹配的行。如果没有匹配的行,将显示NULL值。以下是一个右连接示例,返回所有部门以及属于该部门的员工,包括那些没有员工的部门:
sql
SELECT Employees.FirstName, Employees.LastName, Departments.DepartmentName
FROM Employees
RIGHT JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;
这个查询将返回所有部门的名称以及在该部门工作的员工,如果没有员工在某个部门工作,将显示NULL。
子查询
子查询是一个嵌套在主查询中的查询,允许您根据其他查询的结果进行进一步的操作。以下是一个子查询的示例,筛选出工资高于平均工资的员工:
sql
SELECT FirstName, LastName, Salary
FROM Employees
WHERE Salary > (SELECT AVG(Salary) FROM Employees);
WHERE Salary > (SELECT AVG(Salary) FROM Employees)
:这是一个子查询,它计算了员工的平均工资,并将其与每个员工的工资进行比较。
这个查询将返回工资高于平均工资的员工的姓名和工资信息。
SQL Server常用语法
创建数据库:
sql
CREATE DATABASE database_name;
CREATE DATABASE database_name;
: 用于创建一个新的数据库,其中database_name
是您要创建的数据库的名称。
选择数据库:
sql
USE database_name;
USE database_name;
: 用于选择要在其上执行SQL操作的数据库,database_name
是数据库的名称。
创建表格:
sql
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...
);
CREATE TABLE table_name (...)
: 创建一个新表格,您需要指定表格的名称和列的定义,列定义包括列名和数据类型。
插入数据:
sql
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
INSERT INTO table_name (...) VALUES (...)
: 用于将新数据插入到表格中,您需要指定表格名称和要插入的值。
更新数据:
sql
UPDATE table_name
SET column1 = new_value1, column2 = new_value2, ...
WHERE condition;
UPDATE table_name SET ... WHERE ...
: 用于更新表格中的数据,指定要更新的列和条件,以确定要更新的行。
删除数据:
sql
DELETE FROM table_name
WHERE condition;
DELETE FROM table_name WHERE ...
: 用于从表格中删除数据,指定要删除的行的条件。
选择数据:
sql
SELECT column1, column2, ...
FROM table_name
WHERE condition;
SELECT ... FROM table_name WHERE ...
: 用于从表格中检索数据,可以指定要选择的列和筛选条件。
排序数据:
sql
SELECT column1, column2, ...
FROM table_name
ORDER BY column1 ASC, column2 DESC;
ORDER BY column1 ASC, column2 DESC
: 用于对检索的数据进行排序,ASC
表示升序,DESC
表示降序。
聚合函数:
- 求和:
SUM(column_name)
- 平均值:
AVG(column_name)
- 最大值:
MAX(column_name)
- 最小值:
MIN(column_name)
- 计数:
COUNT(column_name)
分组和分组函数:
sql
SELECT column1, COUNT(*)
FROM table_name
GROUP BY column1;
GROUP BY column1
: 用于将结果集按列分组,以便应用分组函数来计算每个组的统计信息。
连接表格:
- 内连接:
INNER JOIN
- 左连接:
LEFT JOIN
- 右连接:
RIGHT JOIN
- 全外连接:
FULL OUTER JOIN
子查询:
sql
SELECT column1
FROM table_name
WHERE column2 = (SELECT column3 FROM another_table WHERE condition);
子查询嵌套在主查询中,可用于根据其他查询的结果进行进一步的操作,例如根据子查询的结果筛选数据。
创建索引:
sql
CREATE INDEX index_name ON table_name (column1, column2, ...);
CREATE INDEX index_name ON table_name (...)
: 用于在一个或多个列上创建索引,以加速数据检索。
更改表格结构:
- 添加列:
ALTER TABLE table_name ADD column_name datatype;
- 删除列:
ALTER TABLE table_name DROP COLUMN column_name;
- 修改列:
ALTER TABLE table_name ALTER COLUMN column_name new_datatype;
删除表格:
sql
DROP TABLE table_name;
DROP TABLE table_name;
: 用于删除整个表格以及其数据。