sql初学见解
学习sql,我选用的是MySQL。那么现在我会总结一下我最近学到的内容及练习情况。
数据库(Database)
理解为“文件夹”,里面可以装很多张表。作业中要求先建一个名字叫 mydb6_product 的数据库。表(Table)
理解为“Excel 工作表”,由“列(字段)”和“行(记录)”组成。列(Column / Field)
表中的一竖条数据,每列都有:
• 数据类型(整型、字符串、浮点型、日期型)
• 约束(主键、非空、默认值、外键等)主键(Primary Key)
一列或多列的组合,用来唯一标识一行。相当于“身份证号码”,不能重复,不能为 NULL。外键(Foreign Key)
一张表里的某列引用另一张表的主键。作用:让两张表产生“关联”。
例:involces 表的 order_id 是外键 → 指向 orders 表的 id。自增长(AUTO_INCREMENT)
整型主键专用,每插入一行自动 +1,省得手写编号。非空(NOT NULL)
该列必须有值,不能留空。默认值(DEFAULT)
插入数据时如果不给值,系统就自动用默认值填充。浮点型(FLOAT / DOUBLE)
存小数,如价格、工资、金额。日期型(DATE)
存年月日,如订单日期。SQL 语言
用来“说话”让数据库干活的语言。核心就 4 类:
• DDL(数据定义):CREATE / DROP / ALTER
• DML(数据操作):INSERT / UPDATE / DELETE / SELECT
• DCL(权限控制):GRANT / REVOKE(本次作业暂时用不到)数据类型再认识
• INT(11) —— 整数,括号里的 11 只是“显示宽度”,跟真正存储大小无关。
• FLOAT(8,2) —— 最多 8 位,其中小数占 2 位(例如 999999.99)。
• DATE —— 只存年月日,格式 ‘YYYY-MM-DD’。
• VARCHAR(20) —— 可变长度字符串,最多 20 个字符。列级约束/说明
• NOT NULL —— 这一列必须填值。
• DEFAULT —— 不给值时的默认值。
• PRIMARY KEY —— 主键,不能重复。
• COMMENT —— 给列写中文注释,方便以后看。插入数据 INSERT INTO … VALUES …
把一行行真实数据塞进表里。查询 SELECT(本次重点)
• 基本查询:SELECT * FROM 表名;
• 去重:SELECT DISTINCT 列名 …
• 聚合:COUNT()、MAX()、MIN()、AVG()、SUM()
• 排序:ORDER BY 列名 [ASC|DESC]
• 条件:WHERE 列名 BETWEEN … AND …、LIKE、IN、AND/OR 等
• 分组:GROUP BY 列名
• 分组后再过滤:HAVING 条件
• 限制返回行数:LIMIT n建“新表”并复制数据
CREATE TABLE 新表名 AS SELECT …;
| 名词/关键字 | 含义 & 用途(一句话记忆) |
| --------------- | ------------------- |
| INT | 整型,存整数 |
| VARCHAR(n) | 变长字符串,最多 n 个字符 |
| FLOAT | 浮点型,存小数 |
| DATE | 日期型,格式 'YYYY-MM-DD' |
| PRIMARY KEY | 主键,唯一且非空 |
| FOREIGN KEY | 外键,建立两表关联 |
| NOT NULL | 该列必填 |
| DEFAULT | 默认值 |
| AUTO\_INCREMENT | 主键自增 |
| REFERENCES | 外键指向的表和列 |
| 名词/关键字 | 一句话解释 |
| --------------- | --------------------- |
| INT(11) | 整数,括号里的 11 只是显示宽度,可忽略 |
| FLOAT(M,D) | 浮点数,M 总位数,D 小数位 |
| DATE | 年月日 |
| VARCHAR(n) | 可变长字符串,省空间 |
| PRIMARY KEY | 主键,唯一标识一行 |
| NOT NULL | 该列必填 |
| DEFAULT | 默认值 |
| COMMENT | 给列或表写注释 |
| DISTINCT | 去重 |
| COUNT() | 统计行数 |
| MAX() | 最大值 |
| MIN() | 最小值 |
| AVG() | 平均值 |
| SUM() | 求和 |
| BETWEEN … AND … | 范围查询 |
| LIKE | 模糊查询(% 通配符) |
| GROUP BY | 按列分组 |
| HAVING | 分组后再筛选 |
| ORDER BY | 排序 |
| LIMIT n | 只取前 n 行 |
知识点如此,那么进入练习。
为了做好这一份作业。那么就要进行以下步骤。
创建数据库
CREATE DATABASE mydb6_product;
USE mydb6_product;
按顺序建 3张表
employees 员工表
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
gender VARCHAR(10) NOT NULL DEFAULT 'unknown',
salary FLOAT
);
1-1 员工表如图
orders 订单表
CREATE TABLE orders (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price FLOAT,
quantity INT,
category VARCHAR(50)
);
1-2订单图
involces 发票表(注意拼写是 involces,作业原图如此)
CREATE TABLE involces (
number INT PRIMARY KEY AUTO_INCREMENT,
order_id INT,
in_date DATE,
totalamount FLOAT CHECK (totalamount > 0),
FOREIGN KEY (order_id) REFERENCES orders(id)
);
1-3发票图
完成!
做好之后可以使用SHOW TABLES;
查看库里的表,用 DESC 表名;
查看表结构,确认无误后就可以插入数据做后续练习了。
好,现在我们来复习下一个内容。
好长的题目啊,脖子都看断了。咱慢慢来。
(1)显示所有职工的基本信息。
SELECT * FROM t_worker;
(2)查询所有职工所属部门的部门号,不显示重复的部门号。
SELECT DISTINCT department_id FROM t_worker;
(3)求出所有职工的人数。
SELECT COUNT(*) AS 总人数 FROM t_worker;
(4)列出最高工和最低工资。
思路:聚合 MAX、MIN。
SELECT MAX(wages) AS 最高工资, MIN(wages) AS 最低工资 FROM t_worker;
列出职工的平均工资和总工资。
思路:聚合 AVG、SUM,保留 2 位小数。
SELECT ROUND(AVG(wages),2) AS 平均工资, ROUND(SUM(wages),2) AS 总工资 FROM t_worker;
(6)创建一个只有职工号、姓名和参加工作的新表,名为工作日期表。
思路:建表并复制三列数据。
CREATE TABLE 工作日期表 AS
SELECT worker_id, name, worker_date FROM t_worker;
(7)显示所有党员的年龄。思路:先算年龄 = 今年 - 出生年;筛选 politics='党员'。
SELECT name, YEAR(CURDATE())-YEAR(borth_date) AS 年龄
FROM t_worker
WHERE politics='党员';
(8)列出工资在 4000–8000 之间的所有职工姓名。
SELECT name FROM t_worker WHERE wages BETWEEN 4000 AND 8000;
(9)列出所有孙姓和李姓的职工姓名。
SELECT name FROM t_worker
WHERE name LIKE '孙%' OR name LIKE '李%';
(10)列出所有部门号为 102 和 103 且不是党员的职工号、姓名。
思路:多条件 AND + IN。
SELECT worker_id, name
FROM t_worker
WHERE department_id IN (102,103) AND politics != '党员';
(11)将职工表 t_worker 中的职工按出生的先后顺序排序。
SELECT * FROM t_worker ORDER BY borth_date;
(12)显示工资最高的前 3 名职工的职工号和姓名。
SELECT worker_id, name
FROM t_worker
ORDER BY wages DESC
LIMIT 3;
(13)求出各部门党员的人数。
SELECT department_id, COUNT(*) AS 党员人数
FROM t_worker
WHERE politics='党员'
GROUP BY department_id;
(14)统计各部门的工资和平均工资并保留 2 位小数。
思路:GROUP BY + SUM/AVG + ROUND。
SELECT department_id,
ROUND(SUM(wages),2) AS 部门总工资,
ROUND(AVG(wages),2) AS 部门平均工资
FROM t_worker
GROUP BY department_id;
(15)列出总人数大于等于 3 的部门号和总人数。
思路:分组后统计人数,再用 HAVING 过滤。
SELECT department_id, COUNT(*) AS 总人数
FROM t_worker
GROUP BY department_id
HAVING 总人数 >= 3;
终于打完了,恕我太懒忘记截屏了(),不过主播相信直接把文章中的命令复制上去都能运行(maybe)。
以上便是对sql一些简单只是的复习及练习思考。感谢大家能看到最后!欢迎批评指正!