Mysql介绍
Mysql 实际上并不是一种数据库,而是一种关联式数据库管理系统,是数据库和使用数据的软件之间的中介,相当于一个数据库管理员
而与之对应的就有非关联式数据库,和非关联式数据库管理系统
什么叫关联式?
关联式的意思就是将数据整理成一张张表格,通过表格之间的关联来管理数据
SQL
这里的SQL就是 Structured Query Language,也就是结构化查询语言,说简单点就是 资料库管理系统 能听懂的语言
Mysql 主要使用语句
关于数据库
创建数据库
1 | CREATE DATABASE `sql_begin`; |
创建一个名为 sql_begin
的数据库
使用数据库
1 | USE `sql_begin` |
使用sql_begin
,后续的所有操作都会在该数据库中进行操作
删除数据库
1 | DROP DATABASE `sql_begin` |
删除sql_begin
数据库
展示数据库
1 | SHOW DATABASES |
展示你的所有的数据库
关于表格
创建表格
1 | CREATE TABLE `student`( |
这里的 PRIMARY KEY
代表主键,相当于一个唯一的id,不可重复,就像身份证号一样
也可以不直接写在一起,而是在后面进行补充
1 | CREATE TABLE `student`( |
约束
我们可以在各个属性后面加上约束,比如有些属性我们不允许为空,有些属性会随着插入而增加必须序号,我们可以这样写
1 | CREATE TABLE `student`( |
在上面的属性设置中,我们就让 student_id
自增,让 name
禁止为空,让major
唯一,且默认为历史
,这里我们也可以看到可以给一个属性添加多个约束
删除表格
1 | DROP TABLE `student` |
删除 student
表格
表格属性操作
添加属性
1 | ALTER TABLE `student` ADD `gpa` DECIMAL(3,2); |
对student
表格进行操作,添加一个属性 gpa
,类型为 DECIMAL(3,2)
删除属性
1 | ALTER TABLE `student` DROP COLUMN `gpa` |
对 student
表格操作,删除列 gpa
表格元素操作
添加元素
1 | INSERT INTO `student` VALUES(3, '小绿', NULL, 2.2) |
向student
表格中插入元素,注意这里元素的属性需要按照表格中定义的属性顺序进行填写,为空则用 NULL
当然我们也可以自定义顺序
1 | INSERT INTO `student`(`name`, `major`) VALUES(`小红`, `语文`) |
这里我们自定义中没有写入的属性会自动设置为NULL
或者default
出来的值,而如果你设置了AUTO_INCREAMENT
,则会自动自增
修改元素
1 | UPDATE `student` |
我们指定更新表 student
中 major
为英语
的元素,使其major
设为英语文学
同样我们这里做出的更改和条件都可以是多个
比如
1 | UPDATE `student` |
这里我们将 student_id
为 1 的元素的name
和major
都做了更改
1 | UPDATE `student` |
这里通过逻辑连接将major
为生物
或化学
的元素的major
更改为了生化
而如果我们不通过WHERE
来进行条件约束的话,则会更改所有的元素
删除元素
1 | DELETE FROM `student` WHERE `student_id` = 4; |
这样删除了student_id
为4 的元素
同样的在这里也可以通过逻辑词来连接多个条件,当然,如果不用WHERE
来进行限定,也会删除所有的元素
获取元素
1 | SELECT * FROM `student` |
这句话表明获取所有的属性,注意这里 *
表示的是所有的属性
也可以改成你想要的属性:
1 | SELECT `name`,`major` FROM `student`; |
也可以将属性进行排序
1 | SELECT * FROM `student` ORDER BY `score` DESC; |
这里就将所有的属性按照score
进行降序排序,DESC
即descent
如果不写DESC
就默认是ASC
也就是ascend升序
也可以限制我们想要的元素数量
1 | SELECT * FROM `student` ORDER BY `score` DESC LIMIT 3; |
再加上一个LIMIT
就限制了返回的元素数量
同样的也是可以通过WHERE
进行条件约束
1 | SELECT * FROM `student` WHERE `major` = '英语'; |
这样就获取了所有major
为英语
的元素
如果OR
的条件很多,可以用IN
来代替
1 | SELECT * FROM `student` WHERE `major` IN ('历史', '英语', '语文') |
如果我们想知道所有元素的某个属性有哪几种,比如说有几种岗位,我们当然需要查询所有的元素,但是不要这些元素属性发生重复,我们可以使用DISTINCT
1 | SELECT DISTINCT `sex` FROM `employee` |
这样得到的sex
属性就不会出现重复了
聚合函数 aggregate functions
COUNT
比如我们想要取得所有员工的数量
1 | SELECT COUNT(*) FROM `employee`; |
如果我们想要取得出生于 1970-01-01 之后的女性的数量,我们可以写
1 | SELECT COUNT(*) FROM `employee` WHERE `birth_date` > '1970-01-01' AND `sex` = 'F'; |
AVG
我们想取得所有员工的平均薪水
1 | SELECT AVG(`salary`) FROM `employee` |
SUM
我们想取得所有员工薪水的总和
1 | SELECT SUM(`salary`) FROM `employee` |
MAX & MIN
我们想知道薪水最高的员工
1 | SELECT MAX(`salary`) FROM |
薪水最低的对应的就是
1 | SELECT MIN(`salary`) FROM |
通配符
%
表示多个字元,_
表示单个字元
我们想取得号码尾数为 335 的客户
1 | SELECT * FROM `client` WHERE `phone` LIKE '%335'; |
同样的如果是开头为 335 的话,将'%335'
改为'335%'
即可
想取得生日在 12 月的员工
1 | SELECT * FROM `employee` WHERE `birth_day` LIKE '_____12%'; |
这样我们用五个_
表示了前面类似1970-
的五个字符,这样我们就筛选了所有12月份出生的员工
并集 Union
比如我们想同时返回员工和客户的名字
1 | SELECT `name` FROM `employee` |
要注意的是,我们使用 UNION
时,获取的属性数目一定要是一样的,比如我们这里就不可以在employee
中同时搜寻name
和sex
,同时属性的数据类新也需要是一样的
如果我们想要 员工id + 员工名字 UNION 客户id + 客户名字
1 | SELECT `emp_id`, `name FROM `employee` |
这里返回的属性名称是emp_id
和name
,那么我们可以做修改
1 | SELECT `emp_id` AS `total_id`, `name` AS `total_name` FROM `employee` |
这样我们就对属性名进行了修改
连接 JOIN
JOIN 可以帮助我们把两个表格连接在一起
如果我们想取得所有部门经理的名字
1 | SELECT * FROM `employee` JOIN `branch` ON `emp_id` = `manager_id` |
这样返回的表格就是employee
和branch
按照 emp_id = manager_id
进行拼接的表格
但是如果我们不需要完整的表格,我们只需要emp_id
,name
,branch_name
这几个属性呢,我们就可以把*
做修改
1 | SELECT `emp_id`,`name`,`branch_name` FROM `employee` JOIN `branch` ON `emp_id` = `manager_id` |
那如果两个表格做匹配的属性名是一样的,我们可以这样:
1 | SELECT `employee`.`emp_id`,`employee`.`name`,`branch`.`branch_name` FROM `employee` JOIN `branch` ON `employee`.`emp_id` = `branch`.`manager_id` |
而我们如果想要保留employee
表格,同时返回条件成立的属性
我们可以写LEFT JOIN
1 | SELECT `employee`.`emp_id`,`employee`.`name`,`branch`.`branch_name` FROM `employee` LEFT JOIN `branch` ON `employee`.`emp_id` = `branch`.`manager_id` |
这样的话employee
的所有元素不论条件是否成立都会被返回,而没有匹配成功的属性则填为NULL
反之如果想要保留branch
表格就写RIGHT JOIN
,根据位置写即可
1 | SELECT * FROM `employee`; |
子查询 subquery
我们可以在一个查询语句里面使用另外一个查询语句的结果
如果我们要找出研发部门的经理名字
我们可以先在branch
中找到研发部门的 manager_id
再到employee
中找到manager_id
对应的emp_id
1 | SELECT `name` FROM `employee` WHERE `emp_id` = ( |
1 | SELECT `name` FROM `employee` WHERE `emp_id` IN ( |
ON DELETE
ON DELETE 也是一种对表格属性的附加,主要用于 FOREIGN KEY 中,简单来说,ON DELETE 就是用于外键对应的属性被删除时(此时外键失去了对应的属性,无法进行对应),该外键应该如何操作
ON DELETE NULL
1 | CREATE TABLE `branch`( |
这里我们的外键 manager_id
对应到表格employee
的emp_id
上,而ON DELETE SET NULL
表示,如果对应到的这个 emp_id
被删除了,我们这个manager_id
就设置为NULL
ON DELETE CASCADE
1 | CREATE TABLE `works_with` ( |
这里的 ON DELETE CASCADE
就表示如果works_with
表格中的emp_id
和client_id
在失去对应的表格中的属性时,也进行删除
总结
当然这些只是非常基础的 sql 操作,一般项目中肯定不是直接手敲,而是通过各种自动化操作来完成非常频繁的数据操作,任重而道远