mysql
mysql
数据库DB
database:存储不同类型的数据
数据库的重要性:
web项目: 模拟用户注册
页面---> 页面 视图层--->服务器(tomcat)--->控制层controller(servlet/action)负责页面和后台交互--->service(业务逻辑处理层 权限管理/日志管理/事务管理)
--->dao(数据持久层jdbc/mybatis/hibernate)
--->DB(永久存储数据 mysql oracle sqlserver redis)
数据库分类:
1. 从存储位置上划分:
基于磁盘:mysql sqlserver oracle IO 效率偏慢 保证数据持久化
基于缓存:redis mogodb hbase 效率很快 可能会丢失数据
2. 从关系上划分:
关系型数据库:mysql sqlserver oracle 库与库之间 表与表之间 字段与字段之间有关系的
非关系型数据库:redis mogodb hbase 里面没有表 只有数据
DBMS 数据库管理系统
RDBMS:关系型数据库管理系统
目前讲的是mysql,属于RDBMS,学习的是mysql服务,安装的是mysql服务端程序,下载路径:
[MySQL :: Download MySQL Installer](https://dev.mysql.com/downloads/windows/installer/8.0.html)
dos命令启动和停止服务:
net start 服务名称
net stop 服务名称
2003错误一般都是因为数据库的服务没有打开
1045错误一般都是密码错误
如果要用命令提示符运行数据库,可以配置环境变量或者在bin目录下进行操作
在navicat里面操作数据库的快捷键:
- control+q快速进入查询模式,就可以敲代码
- 运行的话可以直接点运行,默认运行全部代码
如果想只运行某行代码,需要选中
- 下面窗口:信息窗口展示的是错误信息或者运行状态,结果窗口里面的时查询结构集
- 字体在工具里面设置格式
- 添加注释:## -- 单行注释 --后面需要加一个空格,才会被认为是注释,多行注释:/* */
- 查找查询语句可以在表下面的对象里面打开
数据库基本操作单元:表 表头的属性名不区分大小写。创建表格(名字一般都是按照【库名 _xxx】,表头名字一般都是【表 _xxx】)
数据库的数据类型:
整数
int:后面可以加小括号表示长度,默认11位因此可以省略
tinyint:代表布尔类型
小数
float:float(m,n)m表示数字的总长度,n表示精确度
double:跟float差不多
decimal:精确小数!存钱
字符串
char:固定长度字符串
varchar:可变长度字符串,在5.6之前用的是字节为单位,5.6之后是用字符来使用
text:存储长文本
时间:
time: 时间
date:日期
datetime:日期加时间
timestamp:当前时间戳
约束
primary key:主键约束
not null:非空约束
unique:唯一约束,保证该数据唯一
default 值:默认约束
alter table 外键表名 add constraint foreign key (外键表的列) reference 主表(主表列):外键约束,主表(先出现的表)与衍生表(外键表)之间唯一的联系,要注意数据类型
auto_increment:自动增长,一般主键才可以自动增长
属性后面加注释:comment ‘ ’/“ ”
添加数据
insert into table_name[列名] values(值);表示
只加一行里面对应列的数据;如果要加多行列值,values后面不用分号结束,用逗号隔开多行数据。
INSERT INTO db_employee
VALUES(null,3,'泰勒1',41,'女',1,DEFAULT,0),
(null,4,'liku',26,'女',3,'2019-01-01',0),
(null,2,'张三丰',28,'男',5,'2017-01-01',1),
(null,2,'张无忌',32,'男',7,'2015-01-01',0);
如果想给整个表的列添加数据,遇到自动增长的列,可以给value:null,它会跟着表自动增长。 遇到有默认值的,不想给值可以给值default
datetime给的只是日期的话,后面time默认00:00:00
删除数据
delete from table_name【where 条件】
但是外键约束的不能删除,如果要删除的话,必须要先删除外键的数据
DELETE FROM db_employee WHERE em_status=1;`
修改数据
update table_name set 列名【,set 第n列】 =值【where】
,修改数据
查询数据
select column_name[, column2_name] from [where conditions]
,如果想查询所有的数据可以用号*号
。
给列加别名:
如果展示列的时候想用别名展示可以用as
来作为别名:select column_name as show_name from table_name
,或者select column_name show_name from table_name
给表添加别名:
select e.emp_id as '编号',e.emp_age '年龄' from table_name e .
去重复:distinct
select distinct e.emp_id from table_name e .
等于和不等于:
等于:= 不等于<>或!=
比较大小:< > >= <=
或与非:or and not
区间判断:between... and…【小的范围要写在前面,包含两边值】
包含:in
in(值,值2,…)
判断是否为空:
is null is not null
模糊查询 like
like ‘占位符’ 。占位符:
- %:【表示零个或者多个不确定的】,张%【表示以张开头的值】
_
:表示一个不确定的,李_
表示姓李,并且名字长度为2的值
排序 order by
order by column 【desc/asc】【,column2 【desc/asc】】 .
按照列来排序【再按照column2来排序】
ORDER BY BINARY col_name
:BINARY强制执行区分大小写的分类功能
聚合函数
max(),min(),sum(),avg() ,count()
分组:group by
group by column_name
按照某列不同的值来分组
select column1,column2,max(column1) group by column1,column2 .
分组之后筛选having
having后面可以使用聚合函数来筛选,只能用
select column1,column2,max(column1) group by column1,column2 having max(column1)=条件 .
limit 提取数据 在分页查询中经常用到
limit m,n;提取第(m+1)开始提取数据,提取n条数据
分页查询:可以将m设为当前页面的页码值,n为页面显示的数据数量,将m设成分区,进行分页查询:
联表查询:
内连接:inner join … on
tab1 t1 inner join tab2 t2 on t1.tab1_id=t2.tab2_id .
多张表连接后面继续inner join … on:
-- 查询所有薪资大于5000的员工姓名、所属部门、工龄、薪资、薪资发放时间。
SELECT e.em_name,d.dep_name,e.em_exp,s.sa_value,s.sa_time
from db_employee e INNER JOIN db_department d on e.em_dep_id=d.dep_id
INNER JOIN db_salary s on s.sa_em_id=e.em_id WHERE s.sa_value>5000;
也可以用where来筛选,但是from 多张表用逗号隔开:
-- 查询员工的个人信息和部门信息
SELECT * from db_salary,db_employee,db_department
where em_dep_id=dep_id and em_id=sa_em_id ;
外联接:左联接 右联接
左联接:left join t1 on t2
以左边的表t1为主表,将左边全部的数据查询出来,如果t2不存在数据会填充null
右联接:left join t1 on t2
以右边的表t1为主表,将右边全部的数据查询出来,如果t2不存在数据会填充null
获取当前时间now(),如果只想得到当前年份用year(now()),
子查询
根据SELECT-FROM-WHERE查询块,嵌套子查询的位置不同。一般分为:
where子查询(当做查询条件使用)
from子查询 别名(当做临时表使用)
select子查询(当做临时列使用)
常用函数:
concat(str1,str2)拼接
insert(str1,pos,len,str2)在pos位置开始,插入len个字符长度的str2,如果str2长度大于len会全部插入,小于len则会直接替换
SELECT INSERT('hello',5,1,'world');##hellworld
SELECT INSERT('hello',5,6,'wor');##hellwor
SELECT INSERT('hello',2,2,'wor');##hworlo
SELECT INSERT('ongratulations',1,2,'c')##cgratulations
length(str)获得字符串的长度
lower(),upper():转大小写
左填充:lpad(str,len,newstr)len:填充之后的长度
右填充:rpad(str,len,newstr)len:填充之后的长度
SELECT LPAD('world',6,'hello');##hworld
SELECT rPAD('hello',6,'world');##hellow
repeat(str,count)计算字符串出现的次数
replace(str,newstr):替换
数值函数
abs(x):绝对值
cell(x):向上取整
floor(x):向下取整
mod(x,y):取余
round(x,y):四舍五入到y位
truncate(x,y):截取x后面y位小数
求两个日期相隔天数:datediff(日期1,日期2);
索引:面试重点
按照物理索引来划分:
- 聚集索引:索引和实际数据的存储按照有序的存储,类似新华字典的拼音查询。每张表中只能有一个聚集索引,推荐给主键添加聚集索引
- 非聚集索引:索引和实际数据存储是无序的,类似新华字典的按照偏旁查询。
按照实际应用来划分:
- 单值索引:只能给单个列添加索引
create index ind_name on tab_name (column_name).
- 组合索引:给多个列联合添加索引
create index ind_name on tab_name (column1_name,column2_name).
- 唯一索引:唯一单值索引/唯一组合索引 确保唯一索引的值不重复
create unique index ind_name on tab_name (column1_name[,column2_name]).
- 主键索引:给主键添加索引
在没有添加索引之前,会检索全部的数据(次数可在select之前添加explain来看),但是索引在某种情况下(占位符,比较范围)会失效。
删除索引:drop index ind_name on tab_name
查看索引:SHOW INDEX FROM 表名;
ALTER TABLE 表名 ADD PRIMARY KEY (列名):##该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名):##这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE 表名 ADD INDEX 索引名 (列名): ##添加普通索引,索引值可出现多次。
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名):##该语句指定了索引为 FULLTEXT ,用于全文索引。
事务:面试重点
用于维护数据的完整性,保证成批的sql语句要么全部执行,要么全部不执行。事务必须满足4个特性:
- 原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
- 一致性:事务前后数据的完整性必须保持一致、
- 隔离性:n 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
rollback:回滚到最初的地方。