入门SQL一篇文章就够了
SQL(Structured Query Language)即结构化查询语言,是用于管理关系型数据库的标准语言。
一、基础环境搭建
-
安装数据库管理系统(DBMS)
- 常见的有MySQL、Oracle、SQL Server等。以MySQL为例,你可以从官方网站下载适合你操作系统的安装包进行安装。在安装过程中,需要注意设置好用户名、密码等相关参数。
- 安装完成后,启动数据库服务,这样就可以开始使用SQL来操作数据库了。
-
选择SQL客户端工具
- 有命令行工具和图形化工具。命令行工具如MySQL自带的mysql命令行客户端,通过在终端中输入命令来操作数据库。图形化工具像Navicat、SQLyog等,它们提供了更直观的界面,方便初学者操作。以Navicat为例,在安装并连接到你的数据库服务器后,就可以通过简单的界面操作来执行SQL语句。
二、SQL基础语法学习
-
数据定义语言(DDL)
- 创建数据库(CREATE DATABASE)
- 例如,在MySQL中创建一个名为
testdb
的数据库的语句是:CREATE DATABASE testdb;
。这行语句告诉数据库管理系统创建一个新的数据库,名称为testdb
。
- 例如,在MySQL中创建一个名为
- 创建表(CREATE TABLE)
- 假设要创建一个学生表
students
,包含学生ID(student_id
)、姓名(student_name
)和年龄(student_age
)三个字段。语句可以是:CREATE TABLE students ( student_id INT PRIMARY KEY AUTO_INCREMENT, student_name VARCHAR(50), student_age INT );
- 这里
INT
表示整数类型,VARCHAR(50)
表示最大长度为50的可变长字符串类型。PRIMARY KEY
指定student_id
为表的主键,AUTO_INCREMENT
表示该字段的值会自动递增。
- 假设要创建一个学生表
- 修改表(ALTER TABLE)
- 如果要在
students
表中添加一个新的字段student_gender
,类型为CHAR(1)
(表示长度为1的定长字符串),可以使用以下语句:ALTER TABLE students ADD COLUMN student_gender CHAR(1);
。
- 如果要在
- 删除表(DROP TABLE)
- 要删除
students
表,可以使用DROP TABLE students;
。这个操作会永久删除表及其所有数据,所以要谨慎使用。
- 要删除
- 创建数据库(CREATE DATABASE)
-
数据操作语言(DML)
- 插入数据(INSERT INTO)
- 向
students
表中插入一条学生记录,例如插入一个名为“张三”,年龄为20岁的学生(假设性别字段暂不考虑):INSERT INTO students (student_name, student_age) VALUES ('张三', 20);
- 向
- 更新数据(UPDATE)
- 如果要将名为“张三”的学生年龄更新为21岁,可以使用以下语句:
UPDATE students SET student_age = 21 WHERE student_name = '张三';
- 这里
WHERE
子句用于指定要更新的记录条件,只有满足student_name = '张三'
这个条件的记录才会被更新。
- 如果要将名为“张三”的学生年龄更新为21岁,可以使用以下语句:
- 删除数据(DELETE FROM)
- 要删除名为“张三”的学生记录,可以使用:
DELETE FROM students WHERE student_name = '张三';
- 要删除名为“张三”的学生记录,可以使用:
- 插入数据(INSERT INTO)
-
数据查询语言(DQL)
- 简单查询(SELECT)
- 查询
students
表中的所有记录:SELECT * FROM students;
- 这里
*
表示选择所有列。如果只想查询学生姓名和年龄,可以使用:SELECT student_name, student_age FROM students;
- 查询
- 条件查询(WHERE)
- 查询年龄大于20岁的学生记录:
SELECT * FROM students WHERE student_age > 20;
- 查询年龄大于20岁的学生记录:
- 排序查询(ORDER BY)
- 按照学生年龄升序查询学生记录:
SELECT * FROM students ORDER BY student_age ASC;
- 如果要降序查询,可以将
ASC
(升序)改为DESC
(降序)。
- 按照学生年龄升序查询学生记录:
- 聚合函数查询(SUM、AVG、COUNT等)
- 计算学生的平均年龄:
SELECT AVG(student_age) FROM students;
- 统计学生的人数:
SELECT COUNT(*) FROM students;
- 计算学生的平均年龄:
- 简单查询(SELECT)
-
数据控制语言(DCL)
- 授权(GRANT)
- 例如,授予用户
user1
对testdb
数据库中的students
表的查询权限:GRANT SELECT ON testdb.students TO user1;
- 例如,授予用户
- 收回权限(REVOKE)
- 收回用户
user1
对testdb
数据库中的students
表的查询权限:REVOKE SELECT ON testdb.students FROM user1;
- 收回用户
- 授权(GRANT)
三、高级主题学习
-
连接查询(JOIN)
- 内连接(INNER JOIN)
- 假设有两个表,
students
表(包含学生ID和姓名)和scores
表(包含学生ID和成绩)。要查询学生姓名和对应的成绩,可以使用内连接:SELECT students.student_name, scores.score FROM students INNER JOIN scores ON students.student_id = scores.student_id;
- 内连接会返回两个表中满足连接条件(
students.student_id = scores.student_id
)的记录组合。
- 假设有两个表,
- 左连接(LEFT JOIN)
- 如果想查询所有学生的姓名以及他们对应的成绩(即使有些学生没有成绩记录),可以使用左连接:
SELECT students.student_name, scores.score FROM students LEFT JOIN scores ON students.student_id = scores.student_id;
- 左连接会返回左表(
students
表)中的所有记录,以及右表(scores
表)中满足连接条件的记录。如果右表中没有匹配的记录,则对应的列值为NULL
。
- 如果想查询所有学生的姓名以及他们对应的成绩(即使有些学生没有成绩记录),可以使用左连接:
- 右连接(RIGHT JOIN)和全连接(FULL JOIN)
- 右连接与左连接类似,只是返回右表中的所有记录以及左表中满足连接条件的记录。全连接会返回两个表中的所有记录组合,只要其中一个表中有匹配的记录。不过全连接在某些数据库(如MySQL)中的实现方式可能略有不同,需要注意。
- 内连接(INNER JOIN)
-
子查询
- 子查询是嵌套在其他查询中的查询。例如,要查询成绩高于平均成绩的学生姓名。首先计算平均成绩:
SELECT AVG(score) FROM scores;
- 然后将这个查询作为子查询,嵌入到主查询中:
SELECT students.student_name FROM students INNER JOIN scores ON students.student_id = scores.student_id WHERE scores.score > (SELECT AVG(score) FROM scores);
- 然后将这个查询作为子查询,嵌入到主查询中:
- 子查询可以出现在
WHERE
子句、FROM
子句等多个位置,为复杂的查询提供了灵活的解决方案。
- 子查询是嵌套在其他查询中的查询。例如,要查询成绩高于平均成绩的学生姓名。首先计算平均成绩:
-
视图(VIEW)
- 视图是一种虚拟表,它是基于一个或多个表(或视图)的查询结果。例如,创建一个视图来显示学生姓名和成绩:
CREATE VIEW student_scores_view AS SELECT students.student_name, scores.score FROM students INNER JOIN scores ON students.student_id = scores.student_id;
- 之后可以像查询普通表一样查询这个视图:
SELECT * FROM student_scores_view;
- 视图可以简化复杂的查询操作,并且可以根据不同的需求创建多个视图,方便用户使用。
- 之后可以像查询普通表一样查询这个视图:
- 视图是一种虚拟表,它是基于一个或多个表(或视图)的查询结果。例如,创建一个视图来显示学生姓名和成绩:
-
存储过程(Stored Procedure)和函数(Function)
- 存储过程
- 存储过程是一组预编译的SQL语句,存储在数据库中,可以被调用执行。例如,创建一个存储过程来插入一条学生记录:
DELIMITER // CREATE PROCEDURE insert_student(IN p_name VARCHAR(50), IN p_age INT) BEGIN INSERT INTO students (student_name, student_age) VALUES (p_name, p_age); END // DELIMITER ;
- 可以使用
CALL
命令来调用这个存储过程:CALL insert_student('李四', 22);
。存储过程可以包含复杂的逻辑,如条件判断、循环等,并且可以提高数据库的性能,因为它是预编译的。
- 存储过程是一组预编译的SQL语句,存储在数据库中,可以被调用执行。例如,创建一个存储过程来插入一条学生记录:
- 函数
- 函数与存储过程类似,但函数有返回值。例如,创建一个函数来计算两个数的和:
DELIMITER // CREATE FUNCTION add_numbers(a INT, b INT) RETURNS INT BEGIN DECLARE result INT; SET result = a + b; RETURN result; END // DELIMITER ;
- 可以在查询中调用这个函数:
SELECT add_numbers(3, 5);
。函数在需要返回一个计算结果的场景中非常有用。
- 函数与存储过程类似,但函数有返回值。例如,创建一个函数来计算两个数的和:
- 存储过程
四、实践与项目锻炼
- 数据库设计项目
- 可以自己设计一个小型数据库,如一个图书馆管理系统数据库。确定数据库中的表结构,包括图书表(包含图书ID、书名、作者等字段)、读者表(包含读者ID、姓名等字段)、借阅记录表(包含借阅记录ID、图书ID、读者ID、借阅日期等字段)。然后使用SQL创建这些表,插入一些初始数据,并实现基本的查询和更新操作,如查询某本书的借阅情况、更新读者信息等。
- 数据分析项目
- 从网上下载一些公开数据集,如气象数据、销售数据等。将数据导入到数据库中,然后使用SQL进行数据分析。例如,计算某个地区的平均气温、分析销售数据中的热门产品等。通过这些项目实践,可以加深对SQL的理解和应用能力。