Mysql入门

一:建库建表
首先先建立一个数据库,在该数据库种建立三个表,一个学生表,一个课程表,还有一个学习表。
1 | CREATE DATABASES 练习库; |
二:基本表的修改和删除
1.修改基本表
例一:将student表中的sbirthday的类型修改为date类型
1 | -- 这里使用的是alter table 表名 modify 属性 数据类型 约束条件(比如:主键、唯一、非空、默认等等) |
例二:将student表中增加年龄”sage”属性,类型为int类型,没有约束条件
1 | -- 语法:alter table 表名 add 属性 数据类型 约束条件 |
例三:将student表中的sage删除
1 | -- 语法:alter table 表名 drop 属性/约束条件 |
2.基本表的删除
例四:将某某表删除(这里就不拿这几个表演示了哈)
1 | DROP TABLE 表名; |
如果你在这里想要删除student表是不会成功的,你知道为什么吗?
因为student表中的sid作为了learn表中的外键,你要想删除成功,就必须先把learn表给删除掉后再删student表就可以啦。
三:CRUD
1.插入数据
例五:将一个新学生记录插入到学生表中
1 | -- 语法:insert into 表名(属性1,属性2....) values (要插入的数据) |
insert语法要注意,表名后面跟的属性列可写可不写,但是建议大家写上。若是插入所有的属性可以省略不写,但是values后插入必须要写全部的属性常量,若有的根本就没值,那就写null,但千万不能漏掉任何一个属性。
例六:插入多条数据
1 | INSERT |
2.删除数据
语法:delete from 表名 条件
例七:删除学号为100000的学生
1 | DELETE |
例八:删除姓名为春幕的学生
1 | DELETE |
例九:删除专业为物联网而且学号是100001的学生
1 | DELETE |
3.修改数据
语法:update 表名 set 列名=? where 条件
例10:把春幕的性别修改为女
1 | UPDATE student |
例11:把春幕的籍贯改成江苏
1 | UPDATE student |
4.查询数据
语法:
1 | select <属性列表> |
在进行查询前,我们先插入几条数据
1 | -- student表数据 |
<1>单表查询
(1)选择表中的若干列
例12:查询学生表所有学生的姓名和籍贯
1 | SELECT sname,sorigin |
例13:查询学生表中所有学生的籍贯(要求去重)
1 | -- distinct去重关键字 |
例14:查出学生表的所有信息
1 | SELECT *FROM student; |
(2)给列定义别名
使用AS来定义别名,其中AS可以省略
例15:查询学生的姓名和性别
1 | SELECT sname 姓名,ssex 性别 |
(3)选择查询
使用where子句实现
例16:查询有不及格课程的学生的学号、课程号以及成绩
1 | SELECT sid,cid,score |
例17:查询有不及格课程的学生的学号
1 | SELECT DISTINCT sid |
例18:在student表中找出信电学院2000年后出生的学生记录
1 | SELECT * |
(4)确定范围
确定范围使用了一个关键字:属性 between xx and xx(包含xx,相当于 大于等于xx and 小于等于xx)
例19:查询学号在091503~091505的学生的姓名、性别、学院和出生日期。
1 | SELECT sname,ssex,scollege,sbirthday |
(5)确定集合
确定集合使用IN关键字
例20:查询信电学院、物联网学院和计算机学院的学生的学号、姓名和学院
1 | SELECT sid,sname,scollege |
(6)字符匹配
字符匹配关键词like
例21:查询所有姓王的学生的姓名、学号和性别
1 | SELECT sname,sid,ssex |
例22:查找名字中第二个字为“小”字的学生的姓名和学号
1 | SELECT sname,sid |
例23:查找课程名是DB_Design课程的课程号、课程性质
1 | SELECT cid,cproperties |
(7)空值
查询空值的关键字is null
例24:查询缺少成绩的学生的学号和相应的课程号
1 | SELECT sid,score |
(8)对查询结果进行分组
分组的关键词:group by
例25:查询各个课程号相应的选课人数
1 | SELECT cid,COUNT(sid) |
例26:查询学号在091501~091506至少选修了三门课程的学生的学号和选修课程的课程数
having短语用来指定筛选条件
1 | SELECT sid,COUNT(cid) |
(9)使用集函数
例27:查询学生总人数
1 | SELECT COUNT(sid) AS 总人数 |
例28:查询学习180101课程学生的平均成绩
1 | SELECT AVG(score) |
例29:查询学习180101号课程的学生的最高分数
1 | SELECT MAX(score) |
例30:查询选修了180102的课程的学生学号和成绩,查询结果按成绩从高到低排列
1 | SELECT sid,score |
例31:查询全体学生情况,查询结果按所在学院的名称升序排列,对同一个学院的学生按学号降序排列
1 | SELECT * |
<2>连接查询
连接查询就慢慢的变难了,连接查询必须要掌握透彻!连接查询就是指,一个数据库中的多个表之间一般都存在某种内在联系,他们共同提供有用的信息,若查询同时涉及两个或多个表就是连接查询。前面的查询都是针对一个表进行的,较为简单。这后面的都是针对多表进行的,加油呀!
(1)ANSI方式
该方式可通过“表1 [inner] join 表2 on 连接条件”来实现两个表的连接。
例32:查询每个学生及其选修课程的情况
1 | SELECT learn.sid,course.cname |
(2)theta方式
该方式通过where子句指定条件进行连接
例33:查询每个学生及其选修课程的情况
1 | SELECT l.sid 学号,c.cname 课程 |
(3)等值与非等值连接查询
1)什么是等值查询?
用来连接两个表的条件称为连接条件或连接谓词
一般形式:表名1.列名 比较运算符 表名2.列名
其中比较运算符主要有:=,>,<,>=,<=,!=
当比较运算符为=时,为等值连接,否则为非等值连接
注意:连接条件中的各连接字段类型必须是可比的,类型需要相同。
例:查询学生的姓名以及他们选的课程号,和课程名称
1 | SELECT s.sname,l.cid,c.cname |
2)什么是自然连接?
自然连接是等值连接运算的一种特殊情况,即按照两个表中的相同属性进行等值连接,且目标列中去掉了重复的属性列,但保留了所有不重复的属性列。
例34:自然连接student和learn表
1 | SELECT s.sid,sname,ssex,sbirthday,sorigin,scollege,cid,score |
(4)自身连接查询
例35:求一门课程的间接先选修
1 | 难题:遗留问题 |
(5)外连接查询
1)左外连接
左外连接什么时候用呢?
当规定所有记录都应该从连接语句左侧的表中返回。当右侧表中并没有匹配的记录时,左表中该记录依然会返回,而对应的右侧表中的列值将自动填充null值
例36:查询所有学生的姓名以及他们选修课程的课程号和成绩
1 | SELECT s.sname,l.cid,l.score |
2)右外连接
右外连接什么时候使用呢?
当规定所有的记录都应该从连接语句右侧的表中返回。当左侧表中没有匹配的记录时,右表中的值依然返回,而对应的左表中的列值将自动填充null值
例37:查询所有的课程信息及选修该课程的学生的学号及成绩
1 | SELECT course.cid,learn.sid,score |
(6)复合条件连接查询
例38:查询选修180101号课程且成绩在80分以上的学生的学号、姓名和成绩
1 | SELECT s.sid,sname,l.score |
例39:查询每个学生及其选修的课程名及其成绩
1 | SELECT s.sname,c.cname,l.score |
(7)集合运算连接查询
SQL查询可以利用关系代数中的集合运算来组合关系,union代表了并集,intersect代表了交集,except代表了差集。但,注意:mysql中只支持union(∪)
例40:查询选修了180101号或180102号课程或二者都选修了的学生的学号、课程号和成绩
1 | (SELECT s.sid,l.cid,l.score |
例41:查询同时选修了180101和180102号课程的学生的学号、课程号和成绩
mysql不支持,你可以试试
1 |
例42:查询选修了180101号课程的学生中没有选修180102号课程的学生学号、课程号和成绩
mysql不支持
1 |
<3>嵌套查询
在SQL中,一个select…from…where语句称为一个查询块,将一个查询块嵌套在另一个查询块的where子句或having条件中的查询成为嵌套查询。
使用方法:由里向外一层层的处理,根据子查询是否独立于父查询,可分为两类:
- 不相关子查询,该类中的子查询独立于上层的父查询,每个子查询在夫查询处理之前就可以完成求解,子查询的结果作为父查询的查找条件。
- 相关子查询,该类中的子查询依赖于父查询,最内层的子查询的执行需要用到父查询中的某些属性值。
例43:查询选修了180101号课程的学生姓名
1 | -- 1.采用连接查询 |
(1)带有IN谓词的子查询
带有in谓词的子查询是指父查询与子查询之间用in进行连接,判断某个属性列值是否在子查询的结果中。
例44:查询与王英在同一个学院学习的学生学号和姓名
1 | SELECT sid,sname |
例45:查询选修了“数据库原理”课程的学生学号和姓名
1 | -- 嵌套查询 |
(2)带有比较运算符的子查询
子查询返回单值的时候可以使用比较运算符,可以使用ALL或ANY谓词来实现比较操作。
例46:查询其他学院中比计算机学院某个学生学号小的学生名单
1 | 难题:遗留问题 |
(3)带有exists谓词的子查询
exists代表存在量词,带有exists的子查询不返回任何数据,只产生逻辑真值“true”或者逻辑值“false”
例47:查询选修了180102号课程的学生学号和姓名
1 | -- 第一种嵌套查询 |
例48:查询没有选修180102号课程的学生学号和姓名
1 | select sname,sid |
四:索引
<1>什么是索引?索引是干什么的?
索引是一个单独的、存储在磁盘上的数据库结构,它们包含着对数据表里所有记录的引用指针。使用索引用于快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。比如我们在查字典的时候,前面都有检索的拼音和偏旁、笔画等,然后找到对应字典页码,这样然后就打开字典的页数就可以知道我们要搜索的某一个key的全部值的信息了。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件),而不是在select的字段中,实际上,索引也是一张“表”,该表保存了主键与索引字段,并指向实体表的记录,虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件,建立索引会占用磁盘空间的索引文件。说白了索引就是用来提高速度的,但是就需要维护索引造成资源的浪费,所以合理的创建索引是必要的。
<2>索引的分类
MYSQL的索引主要分为主键索引(PRIMARY KEY),唯一索引(UNIQUE) ,普通索引(INDEX)和全文索引(FULLTEXT) 。
主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候指定了主键,就会创建主键索引, CREATE INDEX不能用来创建主键索引,使用 ALTER TABLE来代替。
唯一索引:与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须一。
普通索引:这是最基本的索引,它没有任何限制。
全文索引:FULLTEXT索引用于全文搜索。只有InnoDB和 MyISAM存储引擎支持 FULLTEXT索引和仅适用于 CHAR, VARCHAR和 TEXT列。
<3>索引的创建
1)普通索引的创建
1 | #创建一个普通索引 |
如下图:

2)唯一索引的创建
1 | -- 唯一索引的创建 |

3)主键索引
主键索引就是添加主键约束即可
<4>查询索引
1)查询表中所有的索引
1 | show index from 表名; |

2)查询数据库中的所有索引
1 | select *from mysql.innodb_index_stats as a where a.database_name='数据库名'; |

<5>删除索引
1 | -- 删除索引 |
