1.创建表:
CREATE TABLE student (
-- 学号,长度为8的字符型字段,主键
学号 CHAR(8) PRIMARY KEY,
-- 姓名,长度为8的变长字符型字段,不能为空
姓名 VARCHAR(8) NOT NULL,
-- 性别,长度为2的字符型字段,值只能为 '男' 或 '女'
性别 CHAR(2) CHECK (性别 = '男' OR 性别 = '女'),
-- 成绩,数值型字段,允许最多4位数字,其中1位小数,值必须在0到100之间
成绩 NUMERIC(4,1) CHECK (成绩 >= 0 AND 成绩 <= 100),
-- datetime: 这是数据类型,指定这列将存储日期和时间。
-- DEFAULT GETDATE(): 这是默认值设置。GETDATE() 是一个 SQL 函数,返回当前的系统日期和时间。DEFAULT 关键字表示如果在插入数据时没有提供该列的值,则自动使用 GETDATE() 函数的结果作为默认值。
日期 datetime DEFAULT GETDATE()
);
2.插入/新增
格式:insert into 表名(列名,列名……) values (元素,元素……)
注:表中的所有列名都要给它新增元素。后面的元素与前面的列名一一对应。
例子:
INSERT INTO student (学号, 姓名, 性别, 成绩) VALUES ('20102002', '张有来', '男', 58);
实现插入多条记录:
方法一:使用多个 VALUES 子句,用于插入明确的、固定的数据
你可以一次性插入多条记录,使用逗号分隔每条记录,如下所示:
INSERT INTO student (学号, 姓名, 性别, 成绩)
VALUES
('20102007', '张三', '女', 88),
('20102008', '李四', '男', 59),
('20102009', '王五', '男', 76);
方法二: 使用 INSERT INTO … SELECT 语句
如果你需要从一个或多个表中选择数据并插入到目标表中,正确的语法如下:
INSERT INTO student (学号, 姓名, 性别, 成绩)
SELECT '20102010', '小红', '女', 98
UNION ALL
SELECT '20102011', '小黄', '男', 96
UNION ALL
SELECT '20102012', '小猪', '男', 93;
注意:
1.UNION ALL 用于合并结果集而不会去重。如果你需要去重,可以使用 UNION。
2.VALUES 子句在 INSERT 语句中一次性插入多个值,而 SELECT 子句在 INSERT INTO … SELECT 语句中用于选择并插入记录。
上述select语句的例子中没有从其他表里拿数据,
这里举例如何使用 SELECT 子句从一个表中获取数据并插入到另一个表中:
假设有两个表:old_student 和 new_student,它们都有相同的结构。
表结构:
old_student :
学号 | 姓名 | 性别 | 成绩 |
---|---|---|---|
20102001 | 李四 | 男 | 85 |
20102002 | 王五 | 女 | 90 |
20102003 | 赵六 | 男 | 78 |
new_student:
学号 | 姓名 | 性别 | 成绩 |
---|
1.如果你想手动插入数据到 new_student 表中,你可以使用 VALUES 子句插入数据(静态数据)
2.如果你想将 old_student 表中的所有记录插入到 new_student 表中,你可以使用 SELECT 子句:
INSERT INTO new_student (学号, 姓名, 性别, 成绩)
SELECT 学号, 姓名, 性别, 成绩
FROM old_student;
执行这个 INSERT INTO … SELECT 语句后,new_student 表中的数据会是:
学号 | 姓名 | 性别 | 成绩 |
---|---|---|---|
20102001 | 李四 | 男 | 85 |
20102002 | 王五 | 女 | 90 |
20102003 | 赵六 | 男 | 78 |
这种方法的好处是你可以从一个表中动态地获取数据,而不需要手动输入每条记录。特别是在处理大量数据时,使用 SELECT 子句可以显著简化插入操作。
如果你需要将 old_student 表中的部分记录复制到 new_student 表,并且这部分记录满足某些条件,可以使用 SELECT 子句配合条件。例如,假设你只想复制成绩高于 80 的记录。
INSERT INTO new_student (学号, 姓名, 性别, 成绩)
SELECT 学号, 姓名, 性别, 成绩
FROM old_student
WHERE 成绩 > 80;
3.删除
关键字:delete
格式:delete from 表名 where 条件
(如果不加where条件则将整个表删除。)
-- 删除整张表
delete from student
-- 删除student表中姓名为“大猪”的人的信息
delete from student where 姓名='大猪'
4.更新/修改
关键字:update
格式:update 表名 set 列名=指定值,列名=指定值…… where 条件
如果后面不加where条件,则指定列的每一行都会更改。
--将student表中的所有成绩更改为“60”
update student set 成绩='60'
--将student表中小红的成绩改为“80”
update student set 成绩=80 where 姓名='小红'
5.查询
关键字:select
格式:select + 列名或者* + from + 表名 + where 条件
注:
1.*号表示查询所有
2.如果不加where条件则查询整个表的指定列或所有列
--查询整张表
select * from student
--查询某一列的数据(比如姓名)
select 姓名 from student
--查询姓名为张三的数据
select * from student where 姓名='张三'
distinct:去除重复项
--查询表中的成绩有哪些数值
select distinct 成绩 from student
使用 DISTINCT 时,有几个注意事项:
· 性能影响:DISTINCT 可能会影响查询性能,特别是当表数据量大时,因为它需要对结果进行去重。
· 多列使用:如果在多个列上使用 DISTINCT,查询结果将是所有列组合的唯一值。
· NULL 值处理:DISTINCT 会将所有 NULL 值视为相等,因此 NULL 值只会出现一次在结果中。
· 排序:DISTINCT 不保证结果的排序。如果需要特定的排序,需使用 ORDER BY 子句。
AS:为列指定别名
格式:表中的原列名在前,别名在后
select 姓名 AS name,成绩 AS scores from student
这个查询会返回 student 表中选择的两列的所有记录,但在结果中,姓名列会显示为name,成绩列会显示为scores。别名可以使结果更加易读和具有语义化。
在 SQL 中,为列指定别名时,AS 关键字是可选的,但并不是必须的。具体来说,AS 关键字用于明确表示某个列名的别名,但你可以省略 AS,直接使用空格来指定别名。
例如:
SELECT 姓名 name, 成绩 scores
FROM student;
在这两种写法中:
姓名 AS name 和 姓名 name 都表示将列 姓名 显示为 name。
注意事项
可读性:虽然省略 AS 可以减少代码的长度,但使用 AS 可以使 SQL 查询的意图更清晰和可读。
一致性:在复杂的查询中,为了提高代码的可维护性和一致性,通常推荐使用 AS 关键字。
兼容性:虽然大多数 SQL 数据库系统都支持省略 AS,在某些 SQL 方言中,AS 关键字可能更为标准或推荐使用。
因此,虽然不使用 AS 关键字也是有效的,但使用 AS 可以提高代码的可读性和一致性。
(省略AS有可能导致报错)
GROUP BY :用于将数据分组
GROUP BY 子句用于将查询结果按照一个或多个列进行分组。它通常与聚合函数(如 COUNT(), SUM(), AVG(), MAX(), MIN() 等)一起使用,以便对每个分组执行汇总操作。
示例:统计每个性别的学生人数
假设我们想要统计每个性别的学生人数,可以使用 GROUP BY 子句来实现:
SELECT 性别, COUNT(*) AS 学生人数
FROM student
GROUP BY 性别;
解释:
· 性别 列是我们用来分组的列。
· COUNT(*) 是一个聚合函数,用来计算每个性别分组中的学生数量。
· GROUP BY 性别 表示按照 性别 列进行分组。
结果示例(假设表中有以下数据):
性别 | 学生人数 |
---|---|
男 | 10 |
女 | 8 |
HAVING :用于在数据分组之后对分组结果进行过滤
通常与 GROUP BY 子句一起使用,以对按特定列分组的数据进行条件过滤。HAVING 允许基于聚合函数(如 COUNT(), SUM(), AVG(), MAX(), MIN() 等)的结果进行筛选。
用法说明:
· GROUP BY 子句将数据分组。
· HAVING 子句在数据分组和聚合操作后对结果进行过滤,通常用于筛选符合特定条件的分组结果。
示例:
假设你有一个学生表,想要找出每个性别的学生人数大于 5 的性别,可以使用以下 SQL 查询:
SELECT 性别, COUNT(*) AS 学生人数
FROM student
GROUP BY 性别
HAVING COUNT(*) > 5;
解释:
· GROUP BY 性别 将数据按性别分组。
· COUNT() 计算每个性别分组中的学生数量。
· HAVING COUNT() > 5 仅保留学生人数大于 5 的性别分组。
HAVING 子句在分组之后生效,允许你根据聚合结果设置筛选条件。
HAVING 子句用于在分组数据中执行过滤操作(用于过滤分组后的数据),而 WHERE 子句用于在分组之前对数据进行过滤(用于过滤原始数据)。
ORDER BY :用于对查询结果进行排序
可以按一个或多个列进行排序,并且可以指定排序的顺序(升序或降序)。
示例:按成绩升序排序学生
假设我们想按成绩升序排序学生,可以使用 ORDER BY 子句:
SELECT 学号, 姓名, 性别, 成绩
FROM student
ORDER BY 成绩 ASC;
解释:
· ORDER BY 成绩 ASC 表示按照 成绩 列升序排序。如果你希望降序排序,可以使用 DESC 替代 ASC。
· 默认排序方式是升序(ASC),所以可以省略 ASC。
结合使用 GROUP BY 和 ORDER BY
例如,如果你想统计每个性别的学生人数,并按人数降序排序,可以这样做:
SELECT 性别, COUNT(*) AS 学生人数
FROM student
GROUP BY 性别
ORDER BY 学生人数 DESC;
解释:
· GROUP BY 性别 用来按性别分组。
· ORDER BY 学生人数 DESC 用来按计算出的学生人数降序排序。