修改(Update)
在我们添加数据的过程中总会出现添加错误的情况,在这种情况下先删除,再添加显然不是最好的方法,于是就有了修改。
基本语法如下:
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
比如:
将张三的语数英都改为100 分:
等等,我就不一一举例了。
删除(Delete)
对于过时的数据,我们就需要执行删除操作:
基本语法如下:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
比如我们需要删除 jerry 的成绩:
上述都是对表中数据的简单操作,现在进入进阶部分,难度要大于以上内容。
数据库约束
约束的作用:
一般在创建表的时候需要给数据添加各种约束以保证添加到表中的数据是正确的,保证数据的有效性、完整性和正确性;若违反了约束,则无法添加进入表中;若是先添加数据再加约束,若其中有数据违反了约束则约束添加失败。
约束类型:
NOT NULL - 指示某列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值。
DEFAULT - 规定没有给列赋值时的默认值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句
NULL约束
我们重新创建一个学生表 设置id不为空:
UNIQUE:唯一约束
sn列为唯一的、不重复的
DEFAULT:默认值约束
指定插入数据时,name列为空,默认值unkown:
PRIMARY KEY:主键约束
指定id列为主键:
对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,使用最大值+1。
例如:
FOREIGN KEY:外键约束
外键用于关联其他表的主键或唯一键 , 基本语法如下:
foreign key (字段名) references 主表(列)
举例:
这就把两个表链接起来了。
check约束
了解即可:
MySQL使用时不报错,但忽略该约束:
表的设计
本章不涉及表的设计,对于刚刚入职的而言,在这方面压根不会让我们上,这玩意需要一段时间的累积,初学者其实没必要去掌握。等以后技术起来了再来了解。
查询
单表查询
顾名思义,单表查询就是对一个表进行查询。
聚合函数
聚合查询类似于Java中的API,系统给我们写好的函数,我们直接拿来用即可,常用的聚合函数如下:
函数 | 说明 |
COUNT([DISTINCT] expr) | 返回查询到的数据的 数量 |
SUM([DISTINCT] expr) | 返回查询到的数据的 总和,不是数字没有意义 |
AVG([DISTINCT] expr) | 返回查询到的数据的 平均值,不是数字没有意义 |
MAX([DISTINCT] expr) | 返回查询到的数据的 最大值,不是数字没有意义 |
MIN([DISTINCT] expr) | 返回查询到的数据的 最小值,不是数字没有意义 |
我们拿几个举例:
看看我之前写好的员工表:
假设我们要计算有多少个员工,就可以用count() 这个函数:
一个count(*)解决问题;
count()里面也可以是其他列名。
再比如,我想知道其中工资最高的男员工:
其他的用法类似,我就不一一举例了,可以自己一个个去试。
GROUP BY子句
SELECT 中使用 GROUP BY 子句可以对指定列进行分组查询。需要满足:使用 GROUP BY 进行分组查询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函数中;语法如下:
select column1, sum(column2), .. from table group by column1,column3;
就拿上面的例子:
找出每个部门中工资最高的的一个:
找出每个部门的最高工资,平均工资,最低工资:
HAVING
having 作用于group by 语句之后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用having。
例如:
找出每个部门的最高工资,平均工资,最低工资;并且平均工资高于11000 的部门情况:
多表查询
在了解多表查询之前我们得了解以下:笛卡尔积
笛卡尔积
简单的说就是两个集合相乘的结果;
我们可以百度查一下,下面是我搜索的:
现在,我们有两个集合A和B。
A = {0,1} B = {2,3,4}
集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式:
A×B = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)};
B×A = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)};
可以得出A×B和B×A的笛卡尔积,但总体思路为用
以上A×B和B×A的结果就可以叫做两个集合相乘的‘笛卡尔积’。
从以上的数据分析我们可以得出以下两点结论:
1,两个集合相乘,不满足交换率,既 A×B ≠ B×A;
2,A集合和B集合相乘,包含了集合A中元素和集合B中元素相结合的所有的可能性。既两个集合相乘得到的新集合的元素个数是 A集合的元素个数 × B集合的元素个数;
我们举个例子,来看看结果如何?
创建一个学生表和课程表:结果如下:
笛卡尔积就是将我们选中的两个表进行一个排列组合;
因此,需要注意的是:我们在进行多表查询的时候(计算笛卡尔积的过程),如果两个表数据很大,就会非常低效,甚至成为危险操作。
所以对其操作要小心!!!
Tip(多表情况):如果是三个表的话,那么就是先将两个表进行笛卡尔积运算,再用这个表与另外一个表进行笛卡尔积操作(以此类推)。
消除笛卡尔积
我们可以通过连接查询来消除笛卡尔积、连接查询分为:
内连接:
语法:
select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;
select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;
比如我想查询每个人的课程:
或者
注意:这里都有相同的记录名(classId),所以这里通过 表名.列名 的方法实现,如果不用则会报错:
外连接
左连接:左连接显示的结果为tb1中所有的内容,及tb2中满足条件的内容,若tb1中有的内容而tb2中没有,则显示tb2对应的内容时显示为null
select * from tb1 Left Join tb2 where tb1.ID = tb2.ID
右连接:右连接显示的结果为tb2中所有的内容,及tb1中满足条件的内容,若tb2中有的内容而tb1中没有,则显示tb1对应的内容时显示为null
select * from tb2 Right Join tb1 where tb2.ID = tb1.ID
我们再添加一个数据看看结果:
任然 查询每个人的课程
左连接就是以左边的表为准,即使右边的表中不存在某个数据,就为空。
右链接:
以右边的表为准右边表不存在的数据不出现。
全链接
全连接::MySQL现在不支持全连接,但可以通过union和union all实现,但是两个表的列数必须相同
-- union 可以过滤重复数据
select * from world.city union select * from world.country;
-- union all 不会过滤重复数据
select * from world.city union all select * from world.country;
这章节就到这,其他还有一些不是那么频繁的查询可以在查查资料!!