通过mysql学习和练习SQL的基本增删查改语句
随着应用程序的功能越来越复杂,数据量越来越大,如何管理这些数据就成了大问题。
数据库作为一种专门管理数据的软件就出现了。
我们要学习的数据库叫做关系数据库,假如从数学理论的角度来说,还蛮复杂。
大家在《离散数学》的后面,会学习到关系的定义,那时候就能更好的理解什么是关系了。
我这里就按照我自己的理解来讲述什么是关系数据库了。
关系数据库,就是在数据库中,数据是通过一张张表格来管理和存储的。
比如我们可以打开数据库 information_schema,里面就通过表格存储大量的数据,这就是一个关系数据库之后存储
现在我们来通过导入sql脚本来创建一个数据库和表
主键:
对于关系表,有个很重要的约束,就是任意两条记录不能重复。
不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。
比如我们创建一张学生信息表
学号 | 姓名 | 班级 |
---|---|---|
1120190001 | 张三 | 1班 |
1120190002 | 李四 | 2班 |
1120190003 | 张三 | 1班 |
这里,虽然1班有两个同名的同学,但我们可以通过学号把它们区分开来,学号就可以称之为主键
主键的选择非常重要,而且主键不能为空
比如我们之前通过SQL脚本创建的那张表,heroID就是主键
外键:
比如我们现在有三张表:学生信息表、课程信息表、选课表
学生信息表:
学号 | 姓名 | 班级 |
---|---|---|
1120190001 | 张三 | 1班 |
1120190002 | 李四 | 2班 |
课程信息表:
课程编号 | 课程名字 | 教师 |
---|---|---|
C001 | 数值分析 | 牛顿 |
C002 | 离散数学 | 高斯 |
选课表
学号 | 课程编号 |
---|---|
1120190001 | C001 |
1120190002 | C002 |
选课表中,出现的学号必须已经出现在学生信息表中,学号受到了其他表的约束,它是外键
课程编号中,出现的课程编号也必须已经出现在课程信息表中,课程编号受到了其他表的越是,它是外键
这是youtubu上一个5分钟左右的视频,先帮助大家对SQL语言有一个直观的认识。
当我们需要向数据库表中插入一条新记录时,就必须使用INSERT
语句。
INSERT
语句的基本语法是:
INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...);
比如我们现在往数据库中的heros表格中插入:108将的最后一名的信息,
108|天狗星|段景住|金毛犬|160|100|盗取玉狮子马
插入语句可以是:
INSERT INTO `heros`(`heroID`, `stars`, `name`, `nickname`, `height`, `weight`, `age`, `gender`, `detail`) VALUES (108, '天狗星', '段景住', '金毛犬', 160, 110, 50, TRUE, '盗取玉狮子马');
然后我们可以通过
SELECT * FROM `heros`;
来查看刚才的那一条记录是否已经被添加到数据库中。
现在往表格中添加下面几条记录:
heroID | stars | name | nickname | height | weight | age | gender | detail |
---|---|---|---|---|---|---|---|---|
59 | 地彗星 | 扈三娘 | 一丈青 | 170 | 110 | 28 | FALSE | 单捉王英 |
101 | 地阴星 | 顾大嫂 | 母大虫 | 160 | 100 | 35 | FALSE | 劫牢落草 |
103 | 地壮星 | 孙二娘 | 母夜叉 | 165 | 100 | 35 | FALSE | 三山聚义 |
语法:
INSERT INTO <表名> (字段1, 字段2, ...)VALUES
(值1.1, 值1.2, ...),
(值2.1, 值2.2, ...),
(值3.1, 值3.1, ...);
比如我要添加排名20,21,22的好汉
INSERT INTO `heros`(`heroID`, `stars`, `name`, `nickname`, `height`, `weight`, `age`, `gender`, `detail`) VALUES
(20, '天空星', '索超', '急先锋', 170, 130, 40, TRUE, '大战杨志'),
(21, '天异星', '刘唐', '赤发鬼', 175, 130, 40, TRUE, '七星聚义'),
(22, '天杀星', '李逵', '黑旋风', 170, 200, 35, TRUE, '江州劫法场');
现在往表格中添加下面几条记录:
heroID | stars | name | nickname | height | weight | age | gender | detail |
---|---|---|---|---|---|---|---|---|
23 | 天微星 | 史进 | 九纹龙 | 175 | 130 | 28 | TRUE | 大闹史家庄 |
24 | 天究星 | 穆弘 | 没遮拦 | 170 | 100 | 35 | TRUE | 结识宋江 |
25 | 地壮星 | 雷横 | 插翅虎 | 175 | 150 | 40 | TRUE | 恶斗刘唐 |
DELETE
语句的基本语法是:
DELETE FROM <表名> WHERE ...;
比如我们现在删除宋江的数据:
DELETE FROM `heros` WHERE `name` = '宋江';
删除卢俊义的数据:
DELETE FROM `heros` WHERE `heroID` = 2;
比如我们删除身高为170的所有人
DELETE FROM `heros` WHERE `height` = 170;
DELETE FROM `heros`;
删除第108名,段景住,金毛犬,
UPDATE
语句的基本语法是:
UPDATE <表名> SET 字段1=值1, 字段2=值2, ... WHERE ...;
比如我们现在更改宋江,把它的年纪改为50虽
UPDATE `heros` SET `age` = 50 WHERE `heroID` = 1;
或者
UPDATE `heros` SET `age` = 50 WHERE `name` = '宋江';
把
(4, ‘天闲星’, ‘公孙胜’, ‘入云龙’, 178, 150, 35, TRUE, ‘智取生辰纲’)
改为
(4, ‘天闲星’, ‘公孙胜’, ‘入云龙’, 180, 140, 37, TRUE, ‘七星聚义’)
比如我们把heroID 从10到13号的英雄的身高都改为180、
UPDATE `heros` SET `height` = 180 WHERE `heroID` >= 10 AND `heroID` <= 13;
UPDATE
语句可以没有WHERE
条件,例如:
UPDATE `heros` SET `age` = 40;
这时,整个表的所有记录都会被更新。所以,在执行UPDATE
语句时要非常小心,
最好先用SELECT
语句来测试WHERE
条件是否筛选出了期望的记录集,然后再用UPDATE
更新。
要查询数据库表的数据,我们使用如下的SQL语句:
SELECT * FROM <表名>
比如我们想查询身高超过180的梁山好汉的记录
SELECT * FROM `heros` WHERE `height` > 180;
请查出年龄大于30岁,小于40岁的梁山好汉的记录
有的时候我们不需要全部列的记录,只希望知道某几列的记录,就可以通过投影查询
比如我们想查询身高超过180的梁山好汉的姓名和绰号
SELECT `name`, `nickname` FROM `heros` WHERE `height` > 180;
查出所有是女性的梁山好汉的姓名
我们使用SELECT查询时,查询结果集通常是按照id
排序的,也就是根据主键排序。这也是大部分数据库的做法。如果我们要根据其他条件排序怎么办?可以加上ORDER BY
子句。
例如把梁山好汉按照身高从低到高进行排序:(默认是从低到高)
SELECT * FROM `heros` ORDER BY `height`;
如果从高到底进行排序,我们可以加上DESC
表示“倒序”:
SELECT * FROM `heros` ORDER BY `height` DESC;
按照梁山好汉的姓名和年龄两列,并按照年龄从大到小排序