- 数据库
- 数据库的分类:
我们平时所使用的数据库一般为关系结构数据库,这其中有oracle,mysql,sql server,DB2,MariaDB,性价比最高的是mysql。
- mysql的启动方式:
- 命令行net start mysql
- 任务管理器点击服务找到mysql右键启动
- 一般开机自启
- 登录mysql:
- 输入win+r 然后cmd进入命令窗口输入 mysql -uroot -p密码
- 输入win+r 然后cmd进入命令窗口输入 mysql -uroot -p 然后等待提示password再输入密码
- sql语言
1,DDL数据库定义语言
(1)数据库
chow databases; |
显示存在的数据库 |
create database 库名; 注:数据库一旦创建不能修改名字 |
创建数据库 |
create database if not exists 库名; |
如果此数据库不存在则创建 |
create database库名character set gbk/utf8; |
创建数据库并且设置编码格式,默认utf8 |
alter database 库名 character set gbk/utf8; |
修改数据库编码格式 |
show create database 库名; |
显示创建数据库时的信息 |
drop database 库名; |
删除数据库 |
use 库名; |
使用数据库,不能忘记选择 |
select database(); |
查询当前使用的数据库 |
(2)数据表
show tables |
查询当前库下的表 |
create table 表名( 字段1, 字段2, ……… ); 例如 create table stu ( sid int, sname vachar(32), sex char(1) ); |
创建表 |
int整型 double浮点型 char定长字符型 varcahr可变长字符型 date日期型 datetime 日期时间 timstamp 时间戳 text 文本 |
数据类型 |
desc 表名 |
查看表结构 |
alter table 表名 add 字段; |
向表中添加列,需要添加数据类型 |
alter table 表名 drop 字段; |
向表中删除列 |
alter table 表名 change 修改前数据 修改后数据+数据类型; 例如 alter table stu change sname age int; |
修改列名 |
alter table 表名 rename 新表名; |
修改表名 |
drop table 表名; |
删除表 |
总结: 增加create 删除drop 更新alter 查询show
2,DML数据库操作语言
insert into 表名 (字段1,字段2,………) values (值1,值2,……) ; insert into 表名(字段1,字段2,……….) values (值1,值2……), (值1,值2……), (值1,值2……)……; 例如 insert into stu (sid,sname,sex) values (1,”藏三”,’男’),(2,”李四”,“女”); |
向表中插入数据,字段和值要一一对应,不管顺序如何,可以批量插入多个字段但是要用逗号隔开 |
update 表名 set 字段 = 值 where 条件; 例 update stu set sname = “张老三” where sname = 张三”; |
更新表中字段 |
delete from 表名; |
删除全表字段以及结构(不推荐) |
delete from 表名 where 条件; |
删除表中指定字段 |
truncate table 表名; 只删除表中值不删除字段 delete from 表名:删除全表的字段和值,玩完全销毁表 |
truncate 与 delete 的区别,面试会问 |
3,约束
通过给表添加约束可以对增删改操作进行限制
primary key 例 create table stu ( sid int parimary key, sname vachar(32) ); 或者 create table stu ( sid int, sname vachar(32), primary key(sid) ); |
主键约束,自带非空、唯一 |
auto_increment |
自增约束,通常用于primary key 之后,自增顺序不会回退会一直递增 |
unique |
唯一约束,列的值不可重复 |
not null |
非空约束,列的值不能为空 |
default |
默认值约束,列的值为空时会变为默认值 |
constraint 外键名 foreign key(本表中的列名) references 表(主键); 例 constraint fk_stu_class foreign key(cid) references class(cid); |
外键约束,是多个表之间一种关联关系的限制。被约束的表不能被直接删除,想要简便的删除可以使用级联操作。 |
on detele cascade |
级联删除 |
on update cascade |
级联更新,删除与更新都直接写到外键后即可一键删除。 |
- DQL数据库查询语言
select 字段1,字段2…… from 表名; select sid,sname from stu; |
基本查询 |
select 字段1,字段2…… from 表名 where条件; |
条件查询 |
select 字段1,字段2…… from 表名 where 字段 like %值% |
模糊查询,百分号前面和后面都可使用 |
select 字段1,字段2…… from 表名 order by desc/asc |
排序查询,默认排序方式为升序所以asc可以省略不写 |
select count(字段) from 表名; count可替换为max /min /avg /sum |
聚合函数,其他函数不能和聚合函数同时查询,除非有分组查询。 |
例如:select count(distinct age) from stu; |
去重函数 |
select 字段1,字段2,……from 表名 group by 字段 having 条件; 注:where是分组前筛选,having是分组后筛选,使用效果不同 |
分组查询,group by后的字段必须出现在select里面否则会报错,除非使用聚合函数括起来。 |
limit n ——限制输出n条默认从第一条开始 limit x,y——从x下标开始输出y条 |
限制查询,常用来分页 |
三,sql顺序
书写的顺序为:
select 》from 》where 》group by 》having 》order by 》limit
执行的顺序为:
from 》where 》group by 》having 》select 》order by 》limit
执行的顺序为关键,例如:
from 得到10条数据
where筛选成8条
group by分成4组
having筛选分组成3组
select选中这3组
order by进行排序
limit 最后进行一次限制筛选
四,多表联查
1,表与表的关系为:
左边看右边是一对一,右边看左边也是一对一 |
一对一 |
左边看右边是一对多,右边看左边是一对一 |
一对多 |
左边看右边是一对多,右边看左边也是一对多 |
多对多,多对多的表需要设置一张中间表来进行关联 |
2,合并结果集
两张表可以通过union/union all 进行纵向拼接,使用不多
3,连接查询
select 字段 from 表名1 inner join 表名2 on 表名1.字段 = 表名2.字段; 例如: select sid from stu inner join class on stu.cid = class. cid 也可通过起别名写成: select sid from stu s inner join class c on s.cid = c.cid |
内连接,内连接为主要使用的连接,可以通过(表名1 inner join 表名2 on 表名1.字段 = 表名2.字段)的方式多表联查 |
select 字段 from 表名1 left/right outer join 表名2 on 表名1.字段 = 表名2.字段; |
外连接,外连接会保留不符合条件的数据故不如内连接好用,左连接以左表为主,右连接以右表为主 |
select * from (select sid,sname,age from stu where sex = ‘男’) from stu where age > 10; select sid from stu where score > (select * from stu where sid = 1008); |
子查询(嵌套查询),嵌套的查询语句可以写在from后面把查询的结果当表,也可写在where后面把查询的结果当条件值。嵌套查询为最后迫不得已的手段 |
四,函数
- 字符串函数
select concat(字段1,字段2,……) from 表名; |
concat,连接函数,可以拼接字符串或者拼接字段里的值 |
select length(“java”); select length(score) from stu; |
length,字符串长度函数,英文一个字母1个字节,中文一个字3个字节 |
select replace(字段,要被替换的部分,替换后的部分); select replace (“mysql”,”my”,”your”); |
replace,替换函数 |
select substring(字段,从第几个截取,截取几个) ; select substring(sname,1,3) |
substring,截取函数可用于更新操作或者插入操作 |
select ltrim(“ java”); |
ltrim/rtrim,除空函数,可以去除左边或者右边的空格 |
2,数学函数
select ceiling(1.1); |
ceiling,小数向上取整 |
select floor(1.1); |
floor,小数向下取整 |
select format(小数,保留几位小数); select format(1.325,2) |
format,保留小数位数,会四舍五入 |
select rand(选择随机几次)*倍数 |
rand,给一个0-1之间的随机数,可以利用乘法扩大范围,括号内可不选就能一直随机 |
select round(小数,保留几位小数); |
round,与format效基本一样 |
select truncate(小数,保留几位小数); |
truncate,保留几位小数,不会四舍五入 |
select abs(-1) 结果为1 |
abs,绝对值函数 |
3,日期函数
日期为年月日,时间为时分秒
now() |
当前日期时间 |
sysdate() |
系统日期时间 |
current_date() |
当前日期 |
current_time() |
当前时间 |
current_timestamp |
当前时间戳 |
date() |
日期 |
time() |
时间 |
datetime() |
日期时间 |
datediff(date1,date2) |
时间差 |
year()/ month()/ date() |
年/月/日 |
4,日期字符串转换函数
date_format 例如: select date_format(now(),’%Y-%m-%d’) |
日期——》字符串 |
select str_to_date(‘2023年12月11日’,” ”%Y-%m-%d”) |
字符串——》日期 |
- 流程函数
非常重要
if(条件,结果为真,结果为假) 例如: select avg(if(score is null,0,score)) from stu; 算平均成绩,如果成绩为空就算作0分,如果成绩不为空就算作成绩本身 |
if函数,相当于三目运算符 |
ifnull(不为空,为空) |
ifnull函数,判断是否为空,不为空返回第一个,为空返回第二个 |
case when 字段1 then 结果1 字段2 then 结果2……. else (默认值) end; 例如: select sname,score,case when score < 60 then “不及格” when score <=70 then “及格” when score <=80 then “中等” when score <=90 then “良好” else “优秀” end from stu; |
case函数 |
五,事务
事务是一个原子操作,开启事务后所有命令都执行成功才能完成事务,有一个失败都会让整个事务失败。
1,mysql中事务
show variables like ‘autocommit’ |
查询当前事务的提交方式 |
set autocommit = off/ = 0 |
设置自动提交关闭 |
set autocommit = on/ = 1 |
设置自动提交开启 |
start/begin transaction |
开启事务 |
commit |
提交事务 |
rollback |
回滚事务 |
- 事务特性(必须背会)
(1)原子性:指数据库的整个操作是一个整体,要么都成功,要么都失败。
(2)一致性:事务必须使数据库从一个一致性的状态转换到另一个一致性的状态,转账 前后的总金额不能有变化。
(3)隔离性:事务的隔离性是指多个用户并发访问数据库时,数据库为每一个用户开启的事务不能被其他事务的操作数据所干扰,事务与事务之间相互隔离。
(4)持久性:指一个事务被提交后,它对数据库的影响就是永久的,即使数据库发生故障也不影响对其有任何影响,回滚不了的
- 事务的隔离机制
数据库有不同的隔离级别
- 读未提交:read uncommited 脏读、不可重复读、幻读都有可能发生
- 读已提交:read commited 避免脏读,但是不可重复读、幻读都有可能发生
- 可重复读:(mysql):repeatable read 避免脏读、不可重复读,但是幻读有可能发生
- 串行化:serializable 全都可以避免但是效率极低
脏读:一个事务读取了另一个事务未提交的数据。
不可能重复读:在一个事务内读取某一行数据,每次读取的结果不同。
幻读:一个事务读取到了另一个事务插入的数据,导致前后数据不一样。