本文目录导读:
《关系数据库标准语言SQL笔记总结》
图片来源于网络,如有侵权联系删除
SQL概述
SQL(Structured Query Language),即结构化查询语言,是用于管理关系数据库的标准语言,它具有功能强大、简单易学等特点,通过SQL,可以实现对数据库中数据的定义、操作、控制等多方面的管理。
(一)SQL的发展历程
SQL的发展经历了多个阶段,早期为满足关系数据库管理的需求而产生,随着数据库技术的不断发展,SQL的标准也在不断更新完善,从最初的基本功能到如今支持复杂的数据分析、事务处理等高级功能。
(二)SQL的优点
1、非过程化语言
- 使用者不需要指出“怎么做”,只需说明“做什么”,在查询学生表中所有成绩大于80分的学生记录时,只需要编写一个简单的SELECT
语句,而不需要详细描述数据库管理系统如何去查找这些记录的具体步骤。
2、统一的语法结构
- 无论是对哪种关系数据库管理系统(如MySQL、Oracle、SQL Server等),SQL的基本语法都是相似的,这使得数据库开发人员能够很容易地在不同的数据库系统之间切换,创建一个表的CREATE TABLE
语句在大多数关系数据库中都遵循类似的语法规则,只是在数据类型等细节上可能存在一些差异。
数据定义语言(DDL)
(一)创建表(CREATE TABLE)
1、基本语法
CREATE TABLE
语句用于创建新的表,创建一个名为students
的表,包含id
(学号,为主键)、name
(姓名)、age
(年龄)和grade
(年级)等字段:
```sql
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
grade VARCHAR(20)
);
```
- INT
和VARCHAR
是数据类型,PRIMARY KEY
用于指定主键约束,确保id
字段的值在表中是唯一且非空的。
2、表约束
- 除了主键约束,还可以有其他约束,如NOT NULL
(非空约束)、UNIQUE
(唯一约束)、FOREIGN KEY
(外键约束)等,要确保name
字段非空,可以修改name
字段的定义为name VARCHAR(50) NOT NULL
。
(二)修改表(ALTER TABLE)
1、添加列
- 使用ALTER TABLE
语句可以对已存在的表进行修改,要给students
表添加一个major
(专业)字段,可以使用以下语句:
```sql
ALTER TABLE students ADD major VARCHAR(30);
```
2、修改列的数据类型或约束
- 如果要修改age
字段的数据类型为SMALLINT
,可以使用:
```sql
ALTER TABLE students MODIFY age SMALLINT;
```
3、删除列
- 要删除刚刚添加的major
列,可以使用:
```sql
ALTER TABLE students DROP COLUMN major;
```
(三)删除表(DROP TABLE)
- 当不再需要某个表时,可以使用DROP TABLE
语句将其删除,要删除students
表,可以使用:
DROP TABLE students;
数据操作语言(DML)
(一)插入数据(INSERT)
1、基本插入
- 向students
表中插入一条记录的示例:
```sql
INSERT INTO students (id, name, age, grade) VALUES (1, 'John', 18, 'Freshman');
```
- 这里按照表中字段的顺序提供了要插入的值,如果要插入所有列的值,并且按照表定义的列顺序,可以省略列名,
```sql
INSERT INTO students VALUES (2, 'Alice', 19, 'Sophomore');
```
2、批量插入
- 可以一次性插入多条记录。
```sql
INSERT INTO students (id, name, age, grade) VALUES
(3, 'Bob', 20, 'Junior'),
(4, 'Ella', 18, 'Freshman');
```
(二)更新数据(UPDATE)
1、基本更新
- 如果要将students
表中id
为1的学生的年龄更新为19岁,可以使用:
```sql
UPDATE students SET age = 19 WHERE id = 1;
```
WHERE
子句用于指定更新的条件,如果省略WHERE
子句,则会更新表中的所有记录。
2、多列更新
- 要同时更新name
和grade
字段,可以使用:
```sql
UPDATE students SET name = 'Jack', grade = 'Senior' WHERE id = 2;
```
图片来源于网络,如有侵权联系删除
(三)删除数据(DELETE)
1、基本删除
- 要删除students
表中id
为3的学生记录,可以使用:
```sql
DELETE FROM students WHERE id = 3;
```
- 同样,如果省略WHERE
子句,将删除表中的所有记录,所以在执行DELETE
操作时要特别小心。
数据查询语言(DQL)
(一)基本查询(SELECT)
1、简单查询
- 查询students
表中的所有记录:
```sql
SELECT * FROM students;
```
- 查询students
表中的name
和grade
字段:
```sql
SELECT name, grade FROM students;
```
2、条件查询
- 查询age
大于18岁的学生的name
和age
:
```sql
SELECT name, age FROM students WHERE age > 18;
```
3、排序查询(ORDER BY)
- 按照age
字段对查询结果进行升序排列:
```sql
SELECT * FROM students ORDER BY age;
```
- 如果要进行降序排列,可以使用ORDER BY age DESC
。
(二)多表查询
1、内连接(INNER JOIN)
- 假设有一个courses
表,包含course_id
(课程号)、course_name
(课程名)和teacher
(教师)字段,还有一个student_courses
表,包含student_id
(学生号)、course_id
(课程号)和score
(成绩)字段,要查询学生的姓名、所选课程名和成绩,可以使用内连接:
```sql
SELECT students.name, courses.course_name, student_courses.score
FROM students
INNER JOIN student_courses ON students.id = student_courses.student_id
INNER JOIN courses ON student_courses.course_id = courses.course_id;
```
2、外连接(LEFT JOIN、RIGHT JOIN)
- 左外连接(LEFT JOIN
)会返回左表中的所有记录以及与右表匹配的记录,要查询所有学生以及他们所选的课程(即使有些学生没有选课):
```sql
SELECT students.name, courses.course_name
FROM students
LEFT JOIN student_courses ON students.id = student_courses.student_id
LEFT JOIN courses ON student_courses.course_id = courses.course_id;
```
- 右外连接(RIGHT JOIN
)则相反,会返回右表中的所有记录以及与左表匹配的记录。
(三)聚合函数
1、常用聚合函数
COUNT
:用于计算记录的数量,查询students
表中的学生数量:
```sql
SELECT COUNT(*) FROM students;
```
SUM
:用于计算数值字段的总和,如果student_courses
表中有score
字段,要计算所有学生的总成绩,可以使用:
```sql
SELECT SUM(score) FROM student_courses;
```
AVG
:计算平均值,计算所有学生的平均成绩:
```sql
SELECT AVG(score) FROM student_courses;
```
MAX
和MIN
:分别用于获取最大值和最小值,查询students
表中年龄最大和最小的学生年龄:
```sql
SELECT MAX(age), MIN(age) FROM students;
```
2、分组查询(GROUP BY)
- 要按照年级统计学生数量,可以使用:
```sql
SELECT grade, COUNT(*) FROM students GROUP BY grade;
```
图片来源于网络,如有侵权联系删除
- 在使用GROUP BY
时,SELECT
子句中只能出现分组字段和聚合函数,如果要对分组结果进行筛选,可以使用HAVING
子句,
```sql
SELECT grade, COUNT(*)
FROM students
GROUP BY grade
HAVING COUNT(*) > 10;
```
数据控制语言(DCL)
(一)用户权限管理
1、创建用户
- 在不同的数据库管理系统中,创建用户的语法有所不同,以MySQL为例,创建一个名为user1
的用户:
```sql
CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password1';
```
- 这里指定了用户名为user1
,只能从localhost
连接,密码为password1
。
2、授予权限(GRANT)
- 授予user1
对students
表的SELECT
权限:
```sql
GRANT SELECT ON students TO 'user1'@'localhost';
```
- 可以授予多种权限,如INSERT
、UPDATE
、DELETE
等,也可以授予对整个数据库的权限。
3、收回权限(REVOKE)
- 如果要收回user1
对students
表的SELECT
权限,可以使用:
```sql
REVOKE SELECT ON students FROM 'user1'@'localhost';
```
视图(VIEW)
1、创建视图
- 视图是一个虚拟的表,它是基于一个或多个实际表的查询结果,创建一个视图young_students
,显示年龄小于20岁的学生:
```sql
CREATE VIEW young_students AS
SELECT * FROM students WHERE age < 20;
```
2、使用视图
- 可以像使用普通表一样使用视图,查询young_students
视图中的所有记录:
```sql
SELECT * FROM young_students;
```
3、视图的优点
- 简化复杂查询:对于一些复杂的多表连接和条件查询,可以创建视图来简化后续的查询操作。
- 提高数据安全性:可以通过视图只暴露部分数据给用户,隐藏敏感信息,创建一个视图只显示学生的姓名和年级,而不显示年龄等其他信息。
存储过程(PROCEDURE)
1、创建存储过程
- 存储过程是一组预编译的SQL语句,创建一个存储过程get_student_count
,用于获取学生的数量:
```sql
DELIMITER //
CREATE PROCEDURE get_student_count()
BEGIN
SELECT COUNT(*) FROM students;
END //
DELIMITER ;
```
- 在MySQL中,使用DELIMITER
来改变语句结束符,因为存储过程中包含多条SQL语句,需要用不同的结束符来区分。
2、调用存储过程
- 调用get_student_count
存储过程:
```sql
CALL get_student_count();
```
3、存储过程的优点
- 提高性能:存储过程在数据库中预编译,执行时不需要再次编译,提高了执行效率。
- 可维护性:将一些复杂的业务逻辑封装在存储过程中,便于维护和修改,如果查询学生数量的逻辑发生变化,只需要修改存储过程中的SQL语句即可,而不需要在多个应用程序代码中进行修改。
索引(INDEX)
1、创建索引
- 索引可以提高查询的速度,在students
表的name
字段上创建索引:
```sql
CREATE INDEX name_index ON students (name);
```
2、索引的类型
- 常见的索引类型有普通索引、唯一索引、主键索引等,主键索引是一种特殊的唯一索引,用于标识表中的每一行记录,唯一索引确保索引列的值是唯一的。
3、索引的使用原则
- 虽然索引可以提高查询速度,但过多的索引也会增加数据库的维护成本,降低数据插入、更新和删除的速度,应该根据实际的查询需求有选择地创建索引,对于经常在WHERE
子句中使用的字段创建索引。
关系数据库标准语言SQL在数据库管理中起着至关重要的作用,通过掌握SQL的各个方面,包括数据定义、操作、查询、控制以及高级特性如视图、存储过程和索引等,可以有效地管理关系数据库,满足各种应用场景下的数据管理和处理需求,无论是开发数据库应用程序还是进行数据分析等工作,SQL都是不可或缺的工具。
评论列表