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里面操作数据库的快捷键:

  1. control+q快速进入查询模式,就可以敲代码
  2. 运行的话可以直接点运行,默认运行全部代码

​ 如果想只运行某行代码,需要选中

  1. 下面窗口:信息窗口展示的是错误信息或者运行状态,结果窗口里面的时查询结构集
  2. 字体在工具里面设置格式
  3. 添加注释:## -- 单行注释 --后面需要加一个空格,才会被认为是注释,多行注释:/* */
  4. 查找查询语句可以在表下面的对象里面打开

数据库基本操作单元:表 表头的属性名不区分大小写。创建表格(名字一般都是按照【库名 _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 ‘占位符’ 。占位符:

  1. %:【表示零个或者多个不确定的】,张%【表示以张开头的值】
  2. _ :表示一个不确定的,李_表示姓李,并且名字长度为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);

索引:面试重点

按照物理索引来划分:

  1. 聚集索引:索引和实际数据的存储按照有序的存储,类似新华字典的拼音查询。每张表中只能有一个聚集索引,推荐给主键添加聚集索引
  2. 非聚集索引:索引和实际数据存储是无序的,类似新华字典的按照偏旁查询。

按照实际应用来划分:

  1. 单值索引:只能给单个列添加索引

create index ind_name on tab_name (column_name).

  1. 组合索引:给多个列联合添加索引

create index ind_name on tab_name (column1_name,column2_name).

  1. 唯一索引:唯一单值索引/唯一组合索引 确保唯一索引的值不重复

create unique index ind_name on tab_name (column1_name[,column2_name]).

  1. 主键索引:给主键添加索引

在没有添加索引之前,会检索全部的数据(次数可在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个特性:

  1. 原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
  2. 一致性:事务前后数据的完整性必须保持一致、
  3. 隔离性:n 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
  4. 持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

rollback:回滚到最初的地方。

posted @ 2022-12-12 09:12  Liku007  阅读(20)  评论(0编辑  收藏  举报