Java旅程 Day09

今日学习

今天仍然处于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; --设置事务自动提交开启

总结一哈

今天的内容还是可以理解的,都是一些基本操作,就是自连接的地方有些理解问题。
明天尽量起早一点,十一点开始学学到下午然后去理个发回来接着学。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值