MySQL数据库的快速入门

  • 因为要学习nodejs所以这里简单的入门学习一下数据库,而为什么选择MySQL呢? 因为它是目前网上最火的数据库,同时页是免费开源的
  • 这里我并没有选择安装MySQL server,而是选择了使用wamp集成环境来开发,因为它相对于前者,里面已经集成了图形化处理,不再需要另外安装数据库图形化处理软件

创建数据库

image

SQL的基本语法

  • 插入数据
INSERT INTO `students`(`name`, `score`, `gender`) VALUES ('lam',100,1)
-- 可以不设置id,create_time
-- 这里省略了id的设置,因为id为我设置成了自增
  • 更新数据
UPDATE `students` SET `name`='张三',`score`=20 WHERE id=2;
//将students表格中id为2的行里面的name设置为张三,score设置为20
  • 删除数据
DELETE FROM `students` WHERE id=2;
-- 删除id为2的数据行
  • 查询数据
-- 查所有的数据所有的字段(*表示选取所有的列)
SELECT * FROM `students` WHERE 1;

-- 查所有的数据某个字段(*表示选取所有的列)
SELECT `id`, `name`, `score`, `gender` FROM `student` WHERE 1;

-- 条件查询(*表示选取所有的列)
SELECT * FROM `student` WHERE score>=80;
SELECT * FROM `student` where score>=80 AND gender=1

-- 模糊查询(*表示选取所有的列)
SELECT * FROM `student` where name like '%k%'-- 查询所有带k的字段
SELECT * FROM `student` where name like 'k%'-- 查询所有以k开头的字段
SELECT * FROM `student` where name like '%k'-- 查询所有以k结尾的字段

-- 排序
SELECT id, name, gender, score FROM student ORDER BY score;-- 正向排序
SELECT id, name, gender, score FROM student ORDER BY score DESC;-- 反向排序

-- 分页查询
SELECT id, name, gender, score FROM student LIMIT 50 OFFSET 0
-- 表示只取前面的50条数据

SELECT * FROM `student` ORDER BY score DESC LIMIT 2 OFFSET 2
-- 表示按分数的倒序排列,取两行数据,但是从第2个开始取

-- 记录条数
SELECT COUNT(*) FROM student;
SELECT COUNT(*) 数据名称 FROM student;

多表查询(不常用)

  • 多表查询又称笛卡尔查询,使用笛卡尔查询时要非常小心,由于结果集是目标表的行数乘积,对两个各自有100行记录的表进行笛卡尔查询将返回1万条记录,对两个各自有1万行记录的表进行笛卡尔查询将返回1亿条记录

代码展示:

SELECT * FROM student , class
-- 表示查询这两个表格中的所有数据

结果展示:

image

联表查询(重点常用开发)

  • 相较于上面的多表查询,联表查询就非常的重要了,它将多个表格通过on关键字连接起来,实现联合查询

联表查询重点分为以下三种情况:

image

join a是左表,b是右表
a inner join b 表中若至少一个字段匹配,就返回
a left join b 从左表中返回所有的值,即使右表中没匹配到
a right join b 从右表中返回所有的值,即使左表中没匹配到
  1. inner join(交集)查询两个表格中共有的
-- inner join(交集查询)
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score -- (将c.name设置为class_name)
FROM student s -- (左表,这里将student设置为s简写)
INNER JOIN class c -- (右表,这里将class设置为c简写)
ON s.class_id = c.id; -- (查询条件为:学生的班级id = 班级的id)
  • 结果展示:
    image
  1. left join(查询两个表格中共有的之外并包括上左表格中存在的)
-- left join(左并集查询)
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score -- (将c.name设置为class_name)
FROM student s -- (左表,这里将student设置为s简写)
LEFT JOIN class c -- (右表,这里将class设置为c简写)
ON s.class_id = c.id; -- (查询条件为:学生的班级id = 班级的id)
  • 结果展示
    image
  1. right join(查询两个表格中共有的之外并包括上坐标右表格中存在的)
-- right join(右并集查询)
SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score -- (将c.name设置为class_name)
FROM student s -- (左表,这里将student设置为s简写)
RIGHT JOIN class c -- (右表,这里将class设置为c简写)
ON s.class_id = c.id; -- (查询条件为:学生的班级id = 班级的id)
  • 结果展示:
    image
  1. full join(这就是上面多表查询)

外键约束(重点,结合连表查询)

什么是外键约束? 为什么需要外键约束

  • 外键约束(Foreign Key)即数据库中两个数据表之间的某个列建立的一种联系。这种联系通常是以实际场景中含义完全相同的字段所造成的。MySQL通过外键约束的引入,可以使得数据表中的数据完整性更强,也更符合显示情况。下面,我举一个例子来说明MySQL外键约束的作用。

  • 假如我们对大学学生成绩管理系统建立数据库,有两张表,一张表是学生表,存储了学生的学号、姓名、性别、院系等信息,还有一张表是成绩表,存储了学生学号、课程编号、考试成绩等信息。这样,这两张表之间就会通过学生学号建立外键约束。很自然的我们想到,成绩表的学生学号依赖于学生表的学生学号存在,如果一个学生毕业、或者退学,从学生表中删除时,那么他的相关成绩也就没有必要在成绩表中存在了。在没有创建外键关系之前,这两张表完全是独立存在的,我们可以强行在成绩表中插入一个不存在学生的相关成绩,也可以强行删除学生表中的一个学生,并且不管其成绩信息是否在成绩表中存在。但是,在建立外键关系后,MySQL数据库会约束上述两种行为,每次对数据进行插入或者删除时,都会检查数据完整性,使得我们的操作必须符合实际情况。

使用wamp设置表间的外键约束

  • 首先将关联的两个表格的存储引擎设置成InnoDB模式
    image

  • 随后跳转到机构页面进行属性的关联
    image

  • 关联的模式如下:

    • CASCADE: 在父表上update/delete记录时,同步update/delete掉子表的匹配记录
    • SET NULL: 在父表上update/delete记录时,将子表上匹配记录的列设为null (要注意子表的外键列不能为not null)
    • NO ACTION: 如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
    • RESTRICT: 同no action, 都是立即检查外键约束

使用RESTRICT(限制模式)

image

  • 我们无法给不存在的班级添加学生,也不能更改不存在班级的学生,两者是一一对应的

使用CASCADE

image

  • 这样我们在删除或更改班级的时候会连带班级里面的学生一起删掉或更改掉(3班的坤坤消失了,连同3版一起消失的)

使用SET NULL(无意义)

  • 改动过后该属性就会变成null