MySQL第二周学习

数据查询

排序查询

可以在根据某个字段来对结果的输出进行排序;

SELECT 需要显示的字段 FROM table_name ORDER BY 根据字段 DESC/ASC
#DESC为降序排序,默认不写或ASC则为升序排序
常用函数查询
# 1、字符函数
concat(str1,str2,str3,.....):拼接字符串
substr(str,firstindex,length):从起始位置index开始,截取长度为length的str的子字符串;
upper(str):将所有字母改为小写;
lower(str):将所有字母改为大写;
trim(str):将所有空格清除
ltrim(str):将左边的所有的空格清除
rtrim(str):将右边的所有的空格清除
replace(str,r_str,n_str):在str中出现的子字符串r_str替换为新的字符串n_str;
# 2、数学函数
round(number);四舍五入
rand();随机数
floor()向下取整
ceil()向上取整 
mod()取余 
truncate()截断
............
3、流程控制
4、聚合函数
5、日期函数
分组查询

关键词:group by

将查询的表结构根据所选字段进行分钟,字段值相同为一组,查询的字段结果为第一条数据;

在进行分组后,还可以链接排序,但不支持先排序后分组,即分组需在排序前面;

另外分组后的记过可以添加having进行进一步的筛选过滤;

# 语法结构
Select * from score  where stu_id >903 group by stu_id having score>60;
子查询

定义:将一个查询语句的结果当作另一个查询的条件使用;

子查询可以包含多个关键字,如group by、order by、函数等,

子查询的外层查询可以是select、insert、update,set或do;

# 例子
select * from score where grade > (select avg(grade) from score);

当子查询的返回值不是一个值时,需要添加关键字any、some和all;

分页查询

在多条查询结果中,可以在后加关键字limit来控制记录的数量;

# 语法结构
select * from student limit a,b;
# 其中a为起始记录坐标,在mysql中1为第一条;b为记录条数;
多表联查

查询多张表,得到精确的查询结果,可用多表联查;

关键字:inner/left/right join table on 连接条件;

主要有三类:

  • 内连接:inner join on;此时容易出现重复的列
  • 左连接:left join on;得到左边的全部记录,容易出现空值记录;
  • 右连接:right join on:此时右边的全部记录,容易出现空值记录;
联合查询

多表联查的另一种方式,与内连接查询不同的是,联合查询自动默认取出重复数据;

关键字:union ;

# 语法格式
select * from table1 union select * from table2 union .....
模糊查询

根据某些特殊条件得到关键字符的记录;关键字:like;

# 例子
select * from student where name like '%吴%';
# %表任意数量的字符,_表示一个字符
正则查询

模糊查询的另一种用法,将正则表达式作为查询条件得出结果;

SELECT * FROM student WHERE name REGEXP '^.{9}$';

事务

定义

通过一组逻辑操作单元(SQL语句),将数据从一种稳定状态切换到另外一种稳定状态;

例如银行资金的转账,A向B转账200,此时A的余额应减少200,B的余额增加200;

若此时发生故障导致b无法接受到消息,那么a的余额应该退回200以前的转态;

四大特点

  • 原子性:回滚的特性,操作无法正常进行,则回退到操作前的状态;
  • 一致性:保证数据的完整性,a和b互相转账,两人的余额总数不应该有变化;
  • 隔离性:数据库运行多个事务对
  • 持久性:对数据的修改是永久有效的,即使发生故障也不会改变;

语法结构

# 1.开启事务 
BEGIN 
#或  
SET AUTOCOMMIT=0 
#禁止自动提交 
START TRANSACTION 
#2.执行SQL语句 
SAVEPOINT identifier # 添加保存点 
ROLLBACK TO identifier # 
#3.提交或回滚事务 
ROLLBACK #事务回滚 
COMMIT #事务确认

设置隔离级别

设置隔离级别能够控制多个事务操作同一数据库,避免数据的损坏;

多个事务同时访问一个数据库容易发送数据的损坏如以下三种:

  • 脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚,

T1读取的内容就是临时且无效的.

  • 不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读

取同一个字段, 值就不同了.

  • 幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的

行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.

因此,需要设置隔离级别来控制多个事务:

#设置当前连接的会话级别 
set session transaction isolation level Serializable; 
set tx_isolation = 2; 
	READ-UNCOMMITTED : 0; 
	READ-COMMITTED : 1; 
	REPEATABLE-READ : 2;
	SERIALIZABLE : 3; 
#设置整个系统会话级别 
set @@global.tx_isolation = 3; 
#查看当前连接会话级别 
SELECT @@tx_isolation; 
#查看整个系统会话级别 
SELECT @@global.tx_isolation;

视图

定义

视图,虚拟表,从一个表或多个表中导出来的表,作用和真实表一样,包含一系列带有行和列的数
据 视图中,用户可以使用SELECT语句查询数据,也可以使用INSERT,UPDATE,DELETE修改记
录,视图可以使用户操作方便,并保障数据库系统安全。

优点:

简单化,数据所见即所得

安全性,用户只能查询或修改他们所能见到得到的数据

逻辑独立性,可以屏蔽真实表结构变化带来的影响

缺点:

性能相对较差,简单的查询也会变得稍显复杂

修改不方便,特变是复杂的聚合视图基本无法修改

语法结构

# 创建视图
Create view view_name as 查询语句;
# 修改视图
1、create or replace view table_name as select ....
2、alter view view_name as select....;
# 删除视图
drop view view_name1,view_name2....;
# 查看视图结构
desc view_name;
show create view view_name;

变量

定义

有人定义,具有某些特殊功能或数值的;

主要分类有

  • 全局变量:针对于所有会话(连接)有效,但不能跨重启
  • 会话变量:针对于当前会话(连接)有效
# 查看所有全局/会话 变量
show global/session variables;
# 查看所有满足条件的部分全局变量或会话变量;
show global/session like '%char%';
# 查看指定的全局变量/会话变量的值
select @@global.autocommit/@@autocommit;//全局有global,会话无global和session
# 修改指定的全局变量/会话变量De值
set @@global.tx_isolation/@@tx_isolaiton='char';
//全局有global,会话无global和session
  • 局部变量、用户变量
# 声明并初始某个局部变量:
set @count = 0;
set @count : 0;
select @count:=0;
# 赋值
set @count=10;
set @count:10;
select @count:=10;
select money into count from tbalename;
# 使用变量
select @count;

存储过程

定义

存储过程(Procedure),是数据库操作语言SQL的可编程性实现,传统的SQL语句通常是在数据库服务器

中执行一条命令,命令在数据库引擎内部需要经过创建与分析的过程,因此在运行时间上开销较大;而

存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存

在系统表中的存储计划,这样,后期的使用只需通过命令调用即可,因此,在执行过程时便可节省此开

销。

语法结构

# 创建存储过程
create procedure 过程名(in 传入参数1 类型1... out 传出参数1 类型1,...)
Begin
declare 临时变量;
---过程执行体;
end
# 调用存储过程
call 过程名();
#[若有结果输出,则需定义参数接受]
set @count =1;
call 过程名(@count);
select @count;
# 删除存储过程
drop procedure 过程名

函数

语法结构

# 创建行数
CREATE FUNCTION 函数名(参数名 参数类型,...) RETURNS 返回类型 
BEGIN
	函数体 
END
# 函数的调用
select 函数名();
# 函数的删除
drop function 函数名;

# 函数体中的
if(条件,true值的返回结果,false的返回结果);
# case语句
# 情况1:类似于switch
case 表达式
when 值1 then 结果1;
when 值2 thne 结果2;
....
else 结果n;
end case;
# 情况2:类似于多重if
case 
when 条件1 then 结果1;
when 条件2 then 结果2;
...
else 结果n;
end case;
# if elseif语句
if 情况1 then 语句1;
elseif 情况2 then 语句2;
....
else 语句n;
end if;
# 循环
label:while
do
	循环内容
until 结束条件
end while lablel;//lablel为循环标记;
# itreate:跳出当前循环,类似于continue
# leave:跳出循环,类似于break;

触发器

定义

触发器(TRIGGER)是MySQL的数据库对象之一,从5.0.2版本开始支持。该对象与编程语言中的存储过程以及函数非常类似,都是SQL语句可编程性的实现,并且都需要编写、编译以及调用。但是触发器的执行不是由程序调用,也不是由手动启动,而是由事件来触发、激活以及执行。

语法结构

# 创建触发器
create trigger 触发器名 触发时间 触发事件 on 表名
FOR EACH ROW
begin;
	#触发内容
end;
# 触发时间有两种:关键字为before之前和after之后
# 触发事件有三种:关键字为insert插入、update修改和delete删除;
# 此外还有关键字old和new用于操作数据
# NEW在触发器为INSERT/UPDATE事件类型时有效,表示当前正在插入的数据;
# OLD在触发器类型为DELETE/UPDATE事件类型时有效,表示当前正在删除的数据。
# 用法
UPDATE student SET t_id = null WHERE t_id = OLD.id;

数据库mysql学习结束

因为专业需求,并不需要过多注重mysql,只需熟悉增删改查,了解触发器、函数等;

JDBC

定义:java连接数据库,j以为java,db为数据库,c为connect连接;即通过Java语言进行编写,达到对数据库的各种操作。

接下来进入jdbc的学习;