WHERE Age IN (SELECT Age FROM Students WHERE Age > 18);
复制代码
多行多列子查询:返回多个值(行和列)。
SELECT FirstName, LastName, Age
FROM Students
WHERE (FirstName, LastName) IN (SELECT FirstName, LastName FROM Students WHERE Age > 18);
复制代码
2.4 数据控制语言(DCL)
数据控制语言(DCL,Data Control Language)用于管理数据库中的访问权限、用户管理以及控制数据操作的权限。DCL语句确保数据库的安全性和合理的访问控制,主要包括用户的创建、权限的授予与撤销。常见的DCL语句有CREATE USER、DROP USER、GRANT和REVOKE。
1. 管理用户:CREATE USER, DROP USER
SHOW GRANTS语句用于查看某个用户的权限。可以查询特定用户的权限环境,以确认用户当前拥有的操作权限。 语法:
SHOW GRANTS FOR 'username'@'host';
复制代码
示例:
SHOW GRANTS FOR 'new_user'@'localhost';
复制代码
该语句将显示new_user用户在localhost主机上拥有的所有权限。
5. 权限类型
常见的权限类型有:
SELECT:允许查询数据。
INSERT:允许插入数据。
UPDATE:允许更新数据。
DELETE:允许删除数据。
CREATE:允许创建数据库或表。
DROP:允许删除数据库或表。
ALTER:允许修改数据库或表的结构。
INDEX:允许创建或删除索引。
GRANT OPTION:允许将权限授予其他用户。
ALL PRIVILEGES:授予所有权限。
三、 SQL关键字与操作符
SQL中有许多关键字与操作符,它们用于帮助进行更灵活的查询和数据操作。以下是一些常见的SQL关键字与操作符。 关键字/操作符描述示例LIKE用于在WHERE子句中进行含糊查询,可以匹配指定模式的字符串。通常与通配符%和_一起使用。%表示零个或多个字符,_表示单个字符。SELECT * FROM Students WHERE FirstName LIKE 'J%';
(查找所有名字以’J’开头的学生)IN用于查抄某个值是否在指定的值列表或子查询返回的结果会集。它简化了多个OR条件的写法。SELECT * FROM Students WHERE Age IN (18, 19, 20);
(查找年事为18、19或20岁的学生)BETWEEN用于查抄某个值是否在一个范围内。包括范围的两个边界。SELECT * FROM Students WHERE Age BETWEEN 18 AND 22;
(查找年事在18到22岁之间的学生)AS用于给列或表指定别名,通常用于结果的展示,增强可读性。SELECT FirstName AS Name, Age FROM Students;
(将FirstName列重命名为Name)JOIN用于从两个或多个表中查询相干数据,连接表的方式有多种(如INNER JOIN、LEFT JOIN等)。SELECT Students.FirstName, Courses.CourseName FROM Students INNER JOIN Enrollments ON Students.StudentID = Enrollments.StudentID;
(查找学生和他们选修的课程)UNION用于归并多个SELECT语句的结果集。默认环境下,UNION去除重复的纪录。如果想保留所有纪录,可以使用UNION ALL。SELECT FirstName FROM Students WHERE Age > 18 UNION SELECT FirstName FROM Students WHERE Age < 18;
(查找所有学生的名字)NOT NULL用于指定某列的数据不允许为NULL,常用于字段束缚。CREATE TABLE Students (StudentID INT, FirstName VARCHAR(50) NOT NULL);
(FirstName列不能为空)VIEW用于创建一个虚拟表,该表包含一个SQL查询的结果集,方便多次查询使用,且不存储现实数据。CREATE VIEW StudentAgeView AS SELECT FirstName, Age FROM Students WHERE Age > 18;
(创建一个视图StudentAgeView,显示所有年事大于18岁的学生)
LIKE:
用于进行含糊匹配查询,可以结合通配符进行更加灵活的查询。%代表任意数目的字符,_代表单个字符。
示例:
SELECT * FROM Employees WHERE LastName LIKE 'S%'; -- 查找所有姓氏以'S'开头的员工
SELECT * FROM Employees WHERE FirstName LIKE '_n'; -- 查找所有名字为2个字符且第二个字符为'n'的员工
复制代码
IN:
用于指定一个值是否在给定的列表中,制止了多个OR语句的使用,使SQL更简便。
示例:
SELECT * FROM Employees WHERE Department IN ('HR', 'IT', 'Finance'); -- 查找部门为HR、IT或Finance的员工
复制代码
BETWEEN:
用于在肯定范围内查找数据,实用于数字、日期等类型。BETWEEN包含范围的两头。
示例:
SELECT * FROM Products WHERE Price BETWEEN 100 AND 500; -- 查找价格在100到500之间的产品
复制代码
AS:
用于给表或列指定别名,提拔可读性。尤其在复杂查询中,别名非常有用。
示例:
SELECT Name AS EmployeeName FROM Employees; -- 将列`Name`命名为`EmployeeName`
复制代码
JOIN:
用于将两个或多个表的数据按相干联的列进行连接。常见的连接类型有:
INNER JOIN:返回两个表中满足连接条件的纪录。
LEFT JOIN:返回左表的所有纪录以及右表中满足条件的纪录。如果右表没有匹配纪录,返回NULL。
RIGHT JOIN:与LEFT JOIN相对,返回右表的所有纪录以及左表中满足条件的纪录。
示例:
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
INNER JOIN Departments ON Employees.DepartmentID = Departments.DepartmentID;