数据库基础
- DB:专门存储和维护信息的容器(软件)
- 数据库管理系统:管理数据库的软件。具有存储、安全、一致性、并发 、恢复和访问功能。
- 数据字典:系统目录(表头)存放各种对象的定义信息和其他一些辅助管理信息(元数据)。
- 数据库特征:数据结构化、数据共享、减少数据冗余、数据独立。
- 关系型数据库:用表进行存储,表与表之间存在特定关系。
- 字段:列名,列需要定义数据类型。
- 记录:行
- 字段值: 格
- 字符:最小的表义符号;
- 字符集:所有字符和编码对组成的集合就是字符集。
- 约束:非空、唯一、主键、外键、检查性约束。
- 复合主键:由多个字段构成表的主键,每个字段不能为空。
数据类型:
- 数字类型:
小数类型:精确小数类型、浮点数类型
整数类型- 字符串类型:
定长字符串类型char、变长字符串类型varchar(长度)、text- 日期类型
常见数据类型
bit:位字段类型,1-64,默认为1。
bool(boolean):布尔类型,zero值为假,非zero为真。
int:整型。
float,double:浮点类型。
set:集合类型,存放多选数据。
date:日期,年月日。
datetime:日期和时间,年月日时分秒。
timestamp:时间戳类型,用于记录修改操作的日期和时间。
time:时间类型。
year:两位或四位年份类型,默认四位。
char(m):定长字符串,m为存储长度。
varchar(m):可变长字符串,m为最大存储长度。
blob:二进制大对象。
text:大文本类型。
enum:枚举类型。
常见约束类型:
primary key:主键。
auto_increment:指定字段为自动增加字段。
index:为字段创建索引。
not null:字段值不允许为空。
null:允许为空。
comment:设置字段的注释信息。
default:设置字段的默认值。
事务处理:
- 概念:
也叫做工作单元,由一个或多个sql语句组成的操作序列,该序列作为一个完成的工作单元,全部执行成功或全部失败,保证了数据的一致性。
- 事务处理语言:tpl
对组成事务的dml语句的操作结果进行确认,成功commit; 失败rollback;
- 事务组成:
一组dml(insert/update/delete)或select语句,加上
一个tpl语句组成 或者
一个ddl(create/alter/drop/truncate)语句 或者
一个dcl(grant/revoke)语句 组成。
- 事务特征:ACID
原子性:不能分割。
一致性:数据一直,不论成功或失败。
隔离性:不会被其他事务干扰。
持久性:数据一旦提交不能回滚。
- 事务处理主要方法:
1.begin、rollback、commit
2.用set改变MYSQL的自动提交模式,默认是自动提交的。
set autocommit = 0; 禁止自动提交
set autocommit = 1; 开启自动提交
- 事务的隐式结束:
隐式提交:
执行一个ddl(create/alter/drop/truncate/rename)语句 或者
一个dcl(grant/revoke)语句 组成。
隐式回滚:
1.客户端强行退出;
2.客户端连接到服务器端异常中断;
3.系统崩溃。
- 保存点:
savepoint 保存点名;定义一个保存点语句。
rollback to 保存点名; 回滚到指定保存点。
不结束事务的执行。
SQL语句:
- 数据库:
create database [if not exists] 数据库名;
使用if not exists,会在数据库已存在的情况下不进行创建;不使用则会产生错误。
show create database 数据库名;
查看数据库的相关信息。
drop database 数据库名;
删除数据库。
- ddl:对表结构操作:
create table 表名(
字段名 数据类型 [约束条件],
.
.
[其他约束条件],
[其他约束条件]
)其他选项(例如存储引擎,字符集选项)
create table 新表名 like 源表;
复制源表的表结构到新表中,无数据。
create table 新表名 select * from 源表;
复制源表的表结构和数据到新表中。
drop table 表名;
删除表。
alter table 表名 add column 列名 数据类型和长度 列属性;
alter table 表名 modify column 列名 数据类型和长度 新列属性;
alter table 表名 drop column 列名;
修改表。如果此时有数据怎么办?数据类型不符合会报错。
alter table 表名 add constraint 约束名 约束类型(字段名);
alter table 表名 drop primary key;
alter table 表名 drop foreign key 约束名;
alter table 表名 drop index 索引名; 删除唯一性约束
修改约束
alter table 表名 engine=新的存储引擎类型
alter table 表名 default charset=新的字符集
alter table 表名 auto_increment=新的初始值
alter table 表名 pack_keys=新的压缩类型
rename table 旧表名 to 新表名 = alter table 旧表名 rename 新表名
desc[ribe] 表名;
显示表的结构。
- dml:对表内容操作:
insert into 表名 [列名[,列名...]]
values (value[,value...]);
插入数据,一次一条数据,没有列名的就按顺序插入,其顺序可以用sql语句:desc 表名; 查看。有列名需要保持列名列表和值列表在个数和数据类型上保持一致。字符和日期型数据需要用单引号括起来。插入空值时,可以在列名列表中忽略该列或者指定 null关键字或'' 。
insert into 表名 [列名列表]
values (值列表1),(值列表2)...(值列表n);
批量插入数据。
insert into 表名 [列名列表] 子查询;
不用写values子句,将通过子查询找到的记录直接插入到表中,需要保持列名列表和子查询返回的各个字段在个数和数据类型上保持一致。
update 表名 set 列名=值[,列名=值..] [where 条件];
按照指定条件修改表中某些行的列数据。
delete from 表名 [where 条件];
删除记录。如果数据行的主键作为外键被其他表引用,不能删除该记录。
truncate table 表名;
截断表,
与delete区别:
truncate是ddl语句,删除表中所有记录,释放存储空间,使用rollback不可以回滚。
delete是dml语句,删除表中指定记录,不释放存储空间,使用rollback可以回滚。
- dql:查询语句:
select [distinct]{*|列名|表达式 [[as] 列别名]} from 表名 [where 条件] [group by 列名] [having] [order by {列名|表达式|列别名|结果集的列序号} [asc(默认升序)|desc],...] [limit];
select语句执行过程:
from>where>group by>having>select>order by
- 单行函数:
形式:
函数名[(参数1,参数2...)] 参数可以是变量 、 列名 、 表达式
特征:
对单行操作
每行返回一个结果
返回值与原参的数据类型可能不一致
可以写在select 、 where 、 order by 子句中。
函数可以嵌套
参数个数不一定。
- 常用函数:
- 数字函数:
abs(x)
sqrt(x) 返回非负数x的平方根
pi()
mod(x,y)或% 返回x除以y的余数
ceil(x)
floor(x)
round(x,y) 返回保留y位小数,四舍五入后的数。
truncate(x,y) 返回保留y位小数,截取后的数字。
rand()
sign(x) 返回值为1,-1,0。
pow(x,y) 返回x的y次方的结果值
exp(x) 返回e的x次方的结果值
log(x)
log10(x)
- 字符串函数:
char_length(str) 返回包含字符的长度
length(str) 返回字节长度
concat(s1,s2,..) 连接 如果有参数为null 则返回null
concat(x,s1,s2,..) 以x作为分隔符连接
insert(s1,x,len,s2) 返回字符串s1,在位置x起始的子串且len个字符长的子串由字符串s2代替,如果子串超过s1长度返回原串,若有参数为null,则返回null。ppt第五章22页?
lower(str)
upper(str)
left(s,n) 返回左边指定长度的字符串
lpad(s1,len,s2) 返回s1,其左边由s2填充到指定长度
trim(s)
repeat(s,n) 返回n个s组成的新字符串,n<=0,返回空字符串,s或n为null,返回null。
space(n) 返回n个空格组成的字符串。
replace(s,s1,s2) 将s中的s1替换成s2
strcmp(s1,s2) 比较字符串大小,若相同返回0,s1小于s2,返回-1,其他情况返回1.
substring(s,n,len) 从s的n位置截取len长度的子串。
locate(str1,str) position(str1 in str) instr(str,str1) 返回str1在str中的开始位置。
reverse(s) 反转
elt(n,s1,s2,s3...) 返回第n个字符串,若n小于1或大于参数个数返回null。
- 日期和时间函数:
curdate() 获取当前日期 返回格式根据数据类型而定“yyyy-mm-dd”,“yyyymmdd”
now() 返回服务器当前日期和时间 “yyyy-mm-dd hh:mm:ss”,“yyyymmddhhmmss”
curtime() 返回时间,时分秒
utc_date() 返回世界标准时间日期
utc_time() 返回世界标准时间
timediff(e1,e2) 返回两个时间相减e1-e2相差的时间数 参数的类型必须相同
datediff(e1,e2) 返回相差的天数
date_add(date,interval expr unit) 日期加上一个时间间隔 interval是关键字,expr是表达式,unit是间隔单位。
date_sub(date,interval expr unit) 日期减去一个时间间隔
date(date)/time(date)/year(date) 选取日期时间的各个部分
extract(unit from date) 从日期中抽取某个单独的部分或组合。
dayofweek(date)/dayofmonth(date)/dayofyear(date)
dayname/ monthname 返回值是中文或英文由lc_time_names控制,默认是en_US, sql: show variables like 'lc_time_names'; set lc_time_names='zh_CN'; set names gbk;
date_formate(date,format) 格式 '%Y-%m-%d %H:%i:%s'
time_formate(time,format)
- 流程控制函数:
case
case value when [compare-value] then result [when [compare-value] then result...] [else result] end
case when [condition] then result [when [condition] then result...] [else result] end
第二种方式没有else返回null
if
if(e1,e2,e3) 类似(?:)
ifnull、nullif
ifnull(s1,s2) 加入s1不为null,则返回s1,否则返回s2,返回值数据类型取决使用的语境。
- 其他函数:
database() 返回使用utf8字符集默认(当前)数据库名
version() 返回指示mysql服务器版本的字符串
user() 返回当前mysql用户名和机主名
inet_aton(ip) 根据网络地址,返回一个表示该地点的整数
inet_ntoa(num) 上面取反。
password(str) 根据str计算并返回密码字符串,参数为null时返回null。
md5()
- 多行函数
概述
对一组记录进行操作,返回一个结果,分组时可能是整个表分为一组,也可能是根据条件分为多组。
常用函数
min、
max、
sum、
avg、
count 计算非空记录的个数,其他函数会忽略空值。
- 子查询
概述
括号内的查询叫做子查询,也叫内部查询,先于主查询执行
使用位置
where、having、from
使用指导
子查询要用括号括起来
将子查询放在比较运算符的右边
对于单行子查询要使用单行运算符(<、>、<=、>=、=、!=)
对于多行子查询要使用多行运算符(in、any、all)
分类
单行 返回一条记录,比如具体条件和多行函数
多行 使用多行操作符in、any(>any:大于最小 <any:小于最大)、all(>all:大于最大 <all:小于最小)
多列
- 多表连接:
等值连接、非等值连接
外部链接,内部链接
标准连接语法:
cross join 代替 多表连接的“,”,会产生笛卡尔积。
natural join
直接进行等值连接。用所有名称和数据类型相匹配的列作为连接条件。如果两个表之间相同名称的列的数据类型不同,则会产生错误,应使用using子句避免错误。
using子句
指定相同名字和数据类型的列作为连接条件。 select * from emp join dept using (deptno) where deptno=20; NATURAL JOIN子句和USING子句是相互排斥的,不能同时使用
on
select * from emp e join emp m on (e.mgr=m.empno);
left/right outer join
没有员工的部门也要显示出来:select * from emp right outer join dept on (emp.deptno=dept.deptno);
基于左/右边表为基表查询,无论右/左是否有与之匹配的,都按照左/右显示。
- 运算优先级:
算术运算符*/-+ , ||(连接运算符) , 比较运算符 , 特殊比较运算(like ,in ) , not , and , or
- 函数及部分运算符:
between...and...
in (集合列表)
like : %任意 一个
is null
escape 转译字符:使用方式:
例 select * from emp where ename like 'MAN@%' escape '@';
查找名字以“MAN_”开头的员工信息,将“@”作为声明标志。
and、or、not
sysdate() 函数记录当前日期和时间。
coalesce(,分隔) 返回列表中第一个非null的值。
greatest(,分隔) 返回其中最大的值。
least(,分隔) 返回其中最小的值
- 视图
- 概述
逻辑上,来自一个或多个表的集合。- 作用
限制其他用户对表的访问,因为视图可以有选择性的显示表的一部分,对于相同数据可以产生不同的视图。
分类:根据能否进行dml操作- 简单视图:基表数量 只能一个,包含函数 无,包含数据组 无,通过视图实现dml操作 可以
- 复杂视图:基表数量 一或多个,包含函数 有,包含数据组 有,通过视图实现dml操作 不可
- 创建视图语法
create [or replace] [algorithm={merge|temptable|undefined}]
view 视图名 [(列别名...)]
as select语句
[with [cascaded|local]约束条件];
or replace:如果所创建的视图已经存在,该选项表示修改原视图的定义;
algorithm表示使用何种算法来处理视图,是MySQL对标准SQL进行的功能扩展,默认为undefined
create view子句中别名的顺序必须和内部查询中的列的顺序一一对应
在“简单视图”上进行dml操作的条件
删除
无Group 函数;
无GROUP BY 子句;
无DISTINCT 关键字;
修改
无Group 函数;
无GROUP BY 子句;
无DISTINCT 关键字;
使用表达式定义的列
插入
无Group 函数;
无GROUP BY 子句;
无DISTINCT 关键字;
使用表达式定义的列
基表中未在视图中选择的其它列定义为非空并且没有默认值??
WITH CHECK OPTION子句
CREATE OR REPLACE VIEW empvu20 AS SELECT * FROM emp WHERE deptno = 20 WITH CHECK OPTION;
任何修改部门编号的操作都会失败,因为这违反了 WITH CHECK OPTION约束。
删除视图
删除视图并不会删除数据,因为视图是基于数据库中的基表产生的虚表
索引
- 概述
由数据库表中一列或多列组合而成,其作用是提高对表中数据的查询速度。创建在表上,是对数据库表中一列或多列的值进行排序的一种结构。索引可以提高查询的速度。通过索引,查询数据时可以不必读完记录的所有信息,而只是查询索引列。
小细节
1.数据库中长度指的是字符长度,中文每个字占两个字符。
2.create table 最后一个字段不写“,”;
3.日期格式: '2018-12-12'
4.任何包含空值的算术表达式运算后的结果都为空值。
5.当遇到以下3种情况需要在列别名两侧添加双引号:包含空格;要求区分大小写;包含特殊字符。
6.where 子句中,字符型数据和日期型数据作为被比较的值时,必须用单引号引起来,字符型数值区分大小写。
7.order by :升序:数字:小的在前;日期:早的在前;字符:A-Z排列;中文:字典顺序;空值:最前。
8.limit [n,]m :从第n行开始,m条记录,第一条记录的n为0。当偏移量(n)很大时效率不高,可通过语句改善
9.distinct 消除重复行之后再使用分组函数。
10.在SELECT列表中除了分组函数那些项,所有列都必须包含在group by 子句中。
11.不能在 WHERE子句中限制组,可以通过 HAVING 子句限制组
12.注意多行子查询前的运算符是否匹配!!!
13.所有的条件和空值比较结果都是空值,无论什么时候只要空值有可能成为子查询结果集合中的一部分,就不能使用NOT IN 运算符