今日学习
今天仍然处于MYSQL学习之中。从联表查询开始,学到了事务相关内容。
联表查询
操作 | 描述 |
---|---|
inner join | 如果表中至少有一个匹配,就返回行 |
left join | 会从左表返回所有的值,即使右表没有匹配 |
right join | 会从右表返回所有的值,即使左表没有匹配 |
语句格式:
select `字段1`,`字段2`,.....
from 左表名 (左表昵称)
进行的操作(inner join/left join/right join) 右表名 (右表昵称)
on 匹配条件
嵌套:
进行的操作(inner join/left join/right join) 表名 (表昵称)
on 匹配条件
........
自连接
自己的表和自己的表连接,核心:一张表拆为两张一样的表即可
SELECT a.category_name
AS ‘父栏目’,b.category_name
AS ‘子栏目’
FROM category
AS a, category
AS b
WHERE a.category_id
=b.pid
分页和排序
分页:limit
为什么要分页:缓解数据库压力,给人的体验更好
若不分页则为瀑布流,参考百度图片搜索
例:limit 0,5
语法:limit 起始值,页面大小此处0为起始值,5为页面大小pageSize设n为页数
公式:求第N页
limit (n-1)*pageSize,pageSize
排序:order by
语法:order by 字段名 (ASC(升序)/DESC(降序))
子查询
子查询where
理解例:
SELECT `studentno`,`studentname`
FROM `student`
WHERE `studentno`
IN(
SELECT `studentno`
FROM `result`
WHERE `studentresult`>=80
AND `subjectno`
IN(
SELECT `subjectno`
FROM`subject`
WHERE `subjectname`='数据结构'
)
)
MYSQL函数
常用函数
select + 函数名() 查询
abs() -- 绝对值
ceiling() --向上取整 ceiling(9.4)=10
floor() --向下取整 ceiling(9.4)=9
rand() --随机数 (返回一个0~1之间的随机数)
sign(0) --判断一个数的符号 (负数返回-1 正数返回1)
--字符串函数
char_length() --返回字符串长度
concat() --拼接字符串
insert() --查询,从某个位置替换某个长度 insert('源字符串',起始位置,替换长度,'替换字符串') 替换长度为0则为插入
lower() --转小写
upper() --转大写
instr() --返回第一次出现子串的索引 instr('123456','5') 返回5
replace() --替换出现的指定字符串 replace('源字符串','要替换的子串','替换的子串')
substr() --截取子字符串 substr('源字符串',起始位置,截取长度)
reverse() --反转字符串
--其他函数
current_date() --查询当前日期 = curdate()
now() --查询当前日期+时间
localtime() --本地时间
sysdate() --系统时间
--函数使用例
select replace(studentname,'周','邹')
from student
where studentname like '周%'
聚合函数(常用)
count() --计数,查询一个表中有多少个技术
能统计表中的数据
使用例:
count(studentname) --count(字段) 只包括列名那一行,在统计结果时会忽略所有的 null 值
count(*) --包括了所有列,相当于行数,在统计结果时不会忽略 null 值。本质:计算行数
count(1) --包括了忽略所有列,用1代表代码行,在统计结果时不会忽略 null 值。本质:计算行数
执行效率上:
列名为主键,count(字段)会比count(1)快
列名不为主键,count(1)会比count(字段)快
如果表多个列且没有主键,则count(1)的执行效率优于count(*)
如果有主键,则select count(主键)的执行效率是最优的
如果表只有一个字段,则count(*)最优
sum() --总和,总和一个字段所有的值
avg() --求一个字段总和的平均数
max() --最大值
min() --最小值
分组和过滤
分组group by
分组例:根据不同的课程分组
select subjectname,avg(studentresult) as 平均分,max(studentresult) as 最大值,min(studentresult) as 最小值
from result r
inner join subject s
on s.subjectno=r.subjectno
group by r.subjectno --通过什么字段来分组
having 平均分>80
过滤
having (过滤分组后的信息,条件和where相同,位置不同)
数据库级别的MD5加密
MD5() --MD5加密函数
SELECT总结
select完整语法:
顺序很重要!
select 去重(distinct) (要查询的字段) from 表 (表和字段可以取别名)
xxx join (要连接的表)
on (等值判断)
where (具体的值 子查询语句)
group by (通过哪个字段来分组)
having (过滤分组后的信息,条件和where相同,位置不同)
order by (要参考排序的字段) (ASC升序/DESC降序 关键词)
limit (分页操作)
事务原则 ACID原则(经典)
原子性
要么都成功,要么都失败
一致性
事务前后的数据完整性要保持一致
隔离性
多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰
事务之间要互相隔离
持久性
事务一旦提交就不可逆
事务测试
事务例:转账
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
USE shop
CREATE TABLE account(
`id` INT(3) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`money` INT(3) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO account(`name`,`money`)
VALUES('A',2000),('B',10000)
SET autocommit = 0; --设置事务自动提交关闭
START TRANSACTION --开启一个事务
UPDATE account SET money=money-500 --操作转账
WHERE `id`='1'
UPDATE account SET money=money+500--操作转账
WHERE `id`='2'
COMMIT --提交
ROLLBACK --若没有提交,执行rollback,回滚到初始状态
SET autocommit = 1; --设置事务自动提交开启
总结一哈
今天的内容还是可以理解的,都是一些基本操作,就是自连接的地方有些理解问题。
明天尽量起早一点,十一点开始学学到下午然后去理个发回来接着学。