关系型数据库
MySQL(文件型数据库) Oracle SQL Server
非关系型数据库
Redis(缓存型数据库,基于内存)
MongoDB
H2
登录
mysql [-h 主机ip] [-P 端口号] -u 用户名 -p
输入密码
服务开启与关闭 (windows上默认开启)
service mysqld start
service mysqld stop
SQL 分类
DDL(create drop alter) 数据定义语言,维护存储数据的结构
DML(insert delete update) 数据操纵语言,用来对数据进行操作
DQL(查询语言) select
DCL(grant revoke commit) 数据控制语言,用于管理权限与事务
授予权限 回收权限 提交数据
创建表
create table test(
username varchar(10),
password varchar(20)
);
插入数据
insert into test (username, password) values('zs', '123456'); //字符串用单引号括起来
数据库的操作
a.创建数据库 (推荐把if not exists加上)
create database [if not exists] db_name
[charset 数据库字符集] [collate 数据库校验规则] 默认是utf8编码
字符编码
gbk(GBK):中文编码,包含简体和繁体中文
gb2312:简体中文编码
latin:拉丁文,不支持中文
utf8:国际通用编码,支持世界上所有语言 (下面两种语言的综合体,推荐使用)
ISO-8859-1:浏览器默认编码,只支持英文
UNICODE:Java提供的16进制编码,支持所有语言
乱码产生:编码与解码不一致(常见的???)
1.查看数据库编码
2.查看链接库的编码
3.查看html编码
查看当前数据库默认字符编码与校验规则 my.cnf(linux:/etc/my.cnf)
my.ini(ProgramData/MySQL Server/my.ini)
b.操作数据库
1.查看当前服务器下所有的数据库
show databases;
2.查看数据库创建语句
show create database db_name;
3.修改数据库(只能修改字符编码和校验规则)
alter database db_name;
[charset=新的字符编码]
[collate 新的校验规则]
4.删除数据库
drop database db_name;
5.备份与恢复数据库
备份(OS命令行)
mysqldump -u root -p -B 数据库名1 数据库名2 ... > 存储数据库的文件路径
恢复(mysql控制台)
source 文件路径(数据库备份文件)
show variables like '%character%'; 查看字符集
show variables like 'collation_database'; 查看校验规则
c.表的操作
1.创建表
create table table_name(
字段名称 字段类型,
字段名称 字段类型
)[charset=字符集名称 collate 校验规则 engine 存储引擎]; .ibd是InnoDB独有的
2.查看表结构(查看当前表有哪些字段以及是否有索引)
desc table_name;
3.修改表
向现有数据表添加字段
alter table 表名 add 字段 字段类型 [after 已有字段名称];
修改已有字段类型
alter table 数据表名 modify 已有字段名称 新字段的类型
删除现有列(删除需谨慎,一旦删除该列,该列所有数据将被清空)
alter table 数据表名 drop 要删除的列名;
修改表名称
alter table 数据表名 rename to 新表名;
修改表的字符集
alter table 数据表名 charset=新的字符集;
修改列名称(有坑) 新字段名称需要完整定义,即就是需要定义类型
alter table 数据表名 change 要修改的列名 修改后的列名 修改后的类型;
d.数据类型
数值型
tinyint -128~127
tinyint unsigned 0~255
整数
int bigint(2的64次方)
浮点数
float[(m, d)] [unsigned]
m指定显示长度,d指定小数位数,占用空间4个字节
float(4,2) -99.99~99.99
float(4,2) unsigned 0~99.99 主要是由长度决定的
区别decimal(m,n)
float和decimal表示的精度不一样 float表示的精度大约是7位(存在精度缺失)
decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。
文本类型
char(M) 固定长度字符串,M是可以存储的长度,单位为字符,最大长度值可以为255
中文与英文的一个字符都表示一个字符
char(2) 最大能插入2个字符,英文字母与中文汉字相同,各占一个字符。
当插入'a'时,存储时也按照2个字符存储。
varchar(M) 可变长度字符串,M表示字符长度,最大长度65535个字节
varchar长度可以指定为0到65535之间的值,但是mysql规定1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
varchar(2) 最大能插入2个字符,当插入'a'时,存储时也按照1个字符存储。
定长字符串检索效率高,空间利用率低;
边长字符串检索效率低,空间利用率高。
如身份证号、手机号、银行卡号等字段,由于长度不变,使用定长字符串;
如姓名、地址等字段,由于长度不定,使用变长字符串节省空间。
text(了解) 大文本
时间类型
DATETIME(日期时间类型)
TIMESTAMP(时间戳)
datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从1000到9999,占用八字节
date:日期 'yyyy-mm-dd',占用三字节
timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss格式和datetime完全一致,占用四字节
数据行每当有数据的插入或者更新时,自动填充当前修改时间,无须用户插入。
集合
ENUM
枚举,其实就是“单选”类型,对应界面或表单中的“单选项”的数据值。
enum('选项1','选项2','选项3',...);
最终之存储其中具体某一项。
SET
set就是“多选”类型,对应于界面或表单的“多选项”的数据值。
set('选项值1','选项值2','选项值3', ...);
最终可以存储多个可选项。
要检索出set集合中指定的选项
find_in_set('要查询的选项', set集合) 只能查询单个字段
eg:
select * from tt5 where find_in_set('a', 'abc');
5.表的约束:保证数据合法性
a.空属性 null
1+null 都是null
尽量保证定义表时,字段不为空(null),数据为空无法参与运算。
定义字段后,not null
b.默认值 default
某一列经常出现某个具体的值,可以在定义表结构时就指定默认值。
默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值 (null依然可以写进去)
给出dafault的时候一般加上not null
c.列描述 不是注释 mysql中的注释信息是-- (注释信息不会被保存)
comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。
通过desc查看不到注释信息 通过show可以看到注释信息
--mysql_test
d.zerofill 自动补零 (银行数据库中用的多)
如果宽度小于设定的宽度(这里设置的是5),自动填充0
e.主键约束 自动加上not null 一般为整型
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键,主键
所在的列通常是整数类型。
单主键
创建表的时候直接在字段上指定主键
复合主键
primary key(id, course)
在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。
只要组合的值不重复,就可以,单列重复是可以的。
当表创建好以后,可以再次追加主键
alter table 表名 add primary key(字段列表);
删除主键
alter table 表名 drop primary key;
f.自增长 auto_increment
当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得
到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。(订单id)
这里的当前最大值指的出现过的最大值,即使被删除掉,也会被认为是最大值。
自增长的特点:
任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
自增长字段必须是整数
一张表最多只能有一个自增长
g.唯一键 unique
在一张表中可以有多个字段设置唯一键。
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有
多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
h.外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定
义外键后,要求外键列数据必须在主表的主键列存在或为null。
foreign key (字段名) references 主表(列)
eg:
插入一个班级号为30的学生,因为没有这个班级,所以插入不成功
插入班级id为null,比如来了一个学生,目前还没有分配班级
6.增删改查(CURD)
a.增加 insert into
insert into table_name[(column[,column...])] values (value [,value...]); //多插入数据,用逗号隔开
b.更新 update
update tbl_name set col_name1=expr1, [, col_name2=expr2 ...] [where conditon] [limit n];
update使用细节:
update 语法可以用新值更新原有表中的各列值
set子句指示要修改哪些列和要给予哪些值
where子句指定应更新哪些行。如果没有where子句,则更新所有行
where子句后面指定limit,更新限制数量的符合条件的行
c.删除 delete
delete from tbl_name [where condition];
delete from goods; --删除整个表的数据,但是表的结构还存在 一行一行的去删除
truncate table goods; --这个指令也把整个表记录删除 一次性删除
delete和truncate两种删除整表的区别
效果一样,truncate速度快
delete返回被删除的记录数,而truncate返回0
清空表数据,建议使用truncate
delete使用细节:
配合where子句,可以灵活的删除满足条件的记录
delete语句不能删除某一列的值(可以用update置null)
使用delete语句仅删除记录,不删除表本身(drop table)
d.查询 select 尽量select *查找 因为效率太低
select [distinct] *| {column1,column2,...} from tbl_name;
distinct 如果结果中有完全相同的行,就去除重复行
在select语句中可以使用表达式对查询的列进行运算
select语句中可以使用as起别名
select column as 别名 from 表;
select的where子句
在select中使用where子句,进行查询过滤。
where子句不能使用select中起的别名。
select id, name, math+english+chinese as 'total' //3
from student //1 执行顺序
where math+english+chinese >200; //2
order by子句 可以使用别名 (先查出来再排序的)
使用order by子句排序查询结果 并且order by子句位于最后面,前面可以加where子句
select column1,column2,... from table order by column asc|desc,...;
order by 指定排序的列,排序的列可以使表中的列名,也可以是select语句后指定的别名
asc升序(默认),desc降序
order by 子句应该位于select语句的结尾
limit分页查询 从第0页开始
select 字段 from 表名 where 条件 limit 起始位置 ,记录条数
select 字段 from 表名 where 条件 limit 记录条数 offset 起始位置
聚合函数
a.count函数
select count(*)|count(列名) from tbl_name where condition
count(*)会统计所有的记录数,count(列名)会排除为null的情况
b.sum函数
group by子句 可以对指定列进行分组查询
select column1, column2, .. from table group by column;
having和group by配合使用,对group by结果进行过滤
select avg(sal) as myavg
from EMP
group by deptno having myavg<2000;
多表查询
实际开发中往往数据来自不同的表,所以需要多表查询。
笛卡尔积查询(第一张表的第一行与第二张表的所有行的数据比较,然后第二行依次比较,这样会有重复)
公有属性的值必须指明哪个表
子查询
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。
索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的
create index,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高是以插入、更新、删
除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。
常见索引分为:主键索引(primary key),唯一索引(unique),普通索引(index),全文索引(fulltext)--解决中子文索引问题。
索引:以空间换时间
效率:主键索引>唯一索引>普通索引
创建索引的原则
1.比较频繁作为查询条件的字段应该创建索引
2.唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件 比如sex属性
3.更新非常频繁的字段不适合作创建索引
4.不会出现在where子句中的字段不该创建索引
事务
如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是还没有提交)
如果一个事务被提交了(commit),则不可以回退(rollback)
可以选择回退到哪个保存点
InnoDB支持事务,MyISAM不支持事务
开始事务可以使 start transaction
eg:银行转账
start transaction;
A -100 updata A set sal=sal-100;
B +100 updata B set sal=sal+100;
commit;
事务的ACID特性
原子性(Atomicity):
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency):
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的
时间并发事务有多少。
隔离性(Isolation):
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干
扰,多个并发事务之间要相互隔离。
持久性(Durability):
持久性是指一个事务一旦被提交,它对数据库中的数据的修改就是永久性的,接下来即使数据库发生故障也不应该
对其有任何影响。