-
数据定义语言(DDL):
- CREATE TABLE :用于创建数据库表格。例如:
CREATE TABLE students (id INT, name VARCHAR(50), age INT);
- DROP TABLE :用于删除数据库表格。例如:
DROP TABLE students;
- CREATE INDEX :用于在表格上创建索引。例如:
CREATE INDEX idx_name ON students (name);
- ALTER TABLE :用于修改数据库表格结构。例如:
ALTER TABLE students ADD COLUMN email VARCHAR(100);
- CREATE TABLE :用于创建数据库表格。例如:
-
数据操作语言(DML):
- INSERT :用于向表格中插入数据。例如:
INSERT INTO students (id, name, age) VALUES (1, 'Alice', 25);
- UPDATE :用于修改表格中的数据。例如:
UPDATE students SET age = 26 WHERE name = 'Alice';
- DELETE :用于从表格中删除数据。例如:
DELETE FROM students WHERE name = 'Alice';
- INSERT :用于向表格中插入数据。例如:
-
数据查询语言(DQL):
- SELECT :用于从数据库中检索数据。例如:
SELECT * FROM students WHERE age > 20;
- WHERE :用于指定条件来过滤结果。例如:
SELECT * FROM students WHERE age > 20;
- ORDER BY :用于对结果进行排序。例如:
SELECT * FROM students ORDER BY age DESC;
- GROUP BY :用于对结果进行分组。例如:
SELECT age, COUNT(*) FROM students GROUP BY age;
- HAVING :用于在GROUP BY子句中设置过滤条件。例如:
SELECT age, COUNT(*) FROM students GROUP BY age HAVING COUNT(*) > 1;
- SELECT :用于从数据库中检索数据。例如:
-
数据控制语言(DCL):
- GRANT :用于授予用户特定权限。例如:
GRANT SELECT ON students TO user1;
- REVOKE :用于取消用户的特定权限。例如:
REVOKE SELECT ON students FROM user1;
- GRANT :用于授予用户特定权限。例如:
-
事务处理语言(TCL):
- BEGIN TRANSACTION:用于开始一个事务。
- COMMIT:用于提交事务并使更改永久生效。
- ROLLBACK:用于撤销尚未提交的更改,并且回滚到事务开始前的状态。
-
其他常用操作:
- 导入(mysqldump) :将外部文件中的数据导入到数据库中。例如:
mysqldump -u username -p database_name < file.sql
- 导出(source) :从数据库中导出数据到外部文件。例如:
source /path/to/file.sql
- 查看表结构(DESC) :查看数据库表的结构和元数据信息。例如:
DESC students;
- 导入(mysqldump) :将外部文件中的数据导入到数据库中。例如:
总结一下SQL SELECT语句的执行顺序:
-
FROM:这是SQL查询的起点,它决定数据源。可能是一个或多个表,并且可以包含JOIN操作。此时,SQL引擎开始处理数据源并创建初始数据集。
-
WHERE:在初始数据集的基础上,根据指定条件进行行的筛选。只有满足WHERE子句条件的行才会被保留。
-
GROUP BY:在筛选后的数据集上,对数据进行分组。此时可以将多条记录组合成一个组,便于后续的聚合计算。
-
聚合函数:在GROUP BY生成的组上执行聚合操作,如SUM、AVG、COUNT等。
-
HAVING:使用聚合结果对分组进行筛选。只有满足HAVING条件的组才会被保留在结果集中。
-
SELECT:选择要在结果集中显示的字段。在这一阶段,所有表达式和别名都会被计算。
-
ORDER BY:对结果集进行排序。可以按一个或多个字段进行升序或降序排序。
-
LIMIT/OFFSET:这通常是最后一步,用于限制结果集的行数或跳过某些行。
跨表连接是在多个表之间建立关联以检索相关数据的过程。在SQL中,有几种类型的跨表连接,包括内连接、外连接和交叉连接。
-
内连接(INNER JOIN):
- 内连接通过匹配两个表之间的关联列来检索数据,并返回两个表中满足连接条件的行。只有在连接条件成立时,才会将行从两个表中检索出来。
-
外连接(OUTER JOIN):
- 外连接允许检索某个表中没有匹配的行。常见的外连接类型包括左外连接(LEFT JOIN)和右外连接(RIGHT JOIN)。
- 左外连接返回左表中的所有行,以及与右表中匹配的行(如果没有匹配的行,则显示NULL值)。
- 右外连接则返回右表中的所有行,以及与左表中匹配的行(同样,如果没有匹配的行,则显示NULL值)。
-
交叉连接(CROSS JOIN):
- 交叉连接返回两个表的笛卡尔积,即将一个表的每一行与另一个表的每一行进行组合。结果集的行数等于两个表行数的乘积。
truncate/delete/drop区别?
-
DELETE (DML - Data Manipulation Language):
DELETE
用于从表中删除一个或多个记录,并且可以有条件地选择哪些记录需要删除(使用WHERE
子句)。- 它是一个 DML 操作,因此其操作是可以回滚的,即在事务中使用
DELETE
后可以通过ROLLBACK
命令撤销更改。 DELETE
操作会记录日志(每行数据的删除都会记录),因此相比TRUNCATE
,其执行效率较低。- 删除后,空间并不会立即返回给操作系统,而是依然被数据库保留,可用于将来该表中的新数据。
-
TRUNCATE (DDL - Data Definition Language):
TRUNCATE
用于快速清空一个表的所有行,效果等同于删除表中的所有数据,但速度更快。- 它是一个 DDL 操作,通常情况下这种操作不会记录详细的日志(只记录对对象的改变),并且不支持回滚(在某些数据库系统如 MySQL 中,
TRUNCATE
操作在隐式提交事务后不能回滚,而在 SQL Server 和 Oracle 中可以通过事务回滚)。 TRUNCATE
通常会重置表的身份计数(如果表有自动增长的主键或身份列的话)。- 此操作会释放表占用的空间回到操作系统(在某些数据库中行为可能略有不同)。
-
DROP (DDL - Data Definition Language):
DROP
用于完全删除表结构及其数据,这意味着一旦执行了DROP TABLE
命令,表的定义及其数据将完全消失。- 它也是一个 DDL 操作,删除后通常不能回滚(但在某些数据库管理系统中,如果
DROP
操作在事务中执行,可能可以回滚)。 - 使用
DROP
后,与表相关的所有东西都会被删除,包括与该表相关的依赖项如索引、触发器等。
这些操作应根据具体需要和对数据安全的要求来选择使用。例如,如果需要删除特定的几行数据,应使用 DELETE
。如果要快速清空表数据且不需要回滚,则可选用 TRUNCATE
。如果需要删除整个表结构及其数据,则使用 DROP
。
select *和select全部字段的区别?
-
查询效率:
SELECT *
在执行时需要额外的步骤来获取表的所有字段信息,因此可能比直接列出所有字段的SELECT
语句稍慢一些。- 直接列出字段的
SELECT
语句可以避免系统在解析时额外的字段信息获取步骤,因此可能稍微高效一些。
-
查询结果:
- 在表结构不变的情况下,两者的查询结果是相同的。
- 但如果表结构发生了变化,
SELECT *
可以动态适应新的表结构,而直接列出字段的SELECT
语句则需要手动修改以适应新的表结构。
-
应用场景:
SELECT *
适用于开发环境或者需要频繁调整表结构的情况,因为它能够自动适应表结构的变化。- 直接列出字段的
SELECT
语句更适合生产环境,因为它能够确保查询语句的语义清晰,且效率稍高。