数据库

1 .数据库的优势:
1.程序的稳定性:任意一台服务所在的机器崩溃了都不会影响数据的和另外的服务
2.数据一致性: 所有的数据都存储在一起,所有的程序操作的数据都是统一的
3.并发:数据库可以良好的支持并发
4.效率;使用数据对数据的进行增删改查的效率要高出我们自己处理文件很多

2 .数据库服务器,数据管理系统,数据库,表与记录的关系:
记录: 1 朱哥 123456789 22 (多个字段组成的一条记录,即文件的一行内容)
表: 即文件
数据库: database(文件夹)
数据库管理系统 : mysql (是一个软件)
数据库服务器: 相当于一台电脑
总结:
数据库服务器:运行数据库管理软件的机器
数据库管理软件: 管理数据库
数据库:即文件夹,用来组织文件/表
表:文件,用来存放多行记录/数据
3 .数据库的分类:关系型数据库 和非关系型数据库
关系型数据库:需要表结构
mysql ,oracle ,SQL server, db2
非关系型数据库:不需要表结构
redis ,mongodb,memcache
4 . mysql
mysql是一个关系型数据库管理系统,在wed应用方面是最好的RDBMS应用软件
体积小,速度快,成本低,开放源码,一般适合中小型网站的开发

5 .sql语句
关于用户,权限,远程登录
select user(); 查看当前用户
exit 退出 也可以用quit or q
mysql -uroot -p 使用管理员账户登录
set password = password('root') 给当前数据库设置密码

create user '用户名'@'ip地址' identified by '密码'
创建用户和密码 必须要包含ip地址
create user '用户'@'ip地址'
指定某个机器可以连上
create 'user'@'ip'%'
所有的机器都可以连接
show grants for '用户名'%'ip地址';
查看某个用户的权限
mysql -u用户名 -p密码 -hIP地址
远程登陆

grant all on *.* to '用户名'@'ip地址' 给账号授权
flush privileges; 刷新使授权立即生效
grant all on 数据库.表名 '用户名'@'ip地址' identified by '123'
创建账号 并给其授权
enum(选择1,选择2):必须二选一
set(选择1,选择2,选择3):多选

关于操作库的:
増:create database 库名 charset utf8;
查:show databases;
改:alter database 库名 charset utf8;
删: drop database 库名;

关于操作文件(表)的:
先切换到库中:use 库名;
増:create table 表名(id int,name char(15));
查:show tables;
删:drop table '表名';
改:alter table '表名' modify name char(3); 修改字段的数据类型
alter table '表名' change '旧字段' '新字段' char(5); 修改字段的名字

关于文件中的内容(记录):
増:insert into '表名' values (1,'alex1'),(2,'alex2'),(3,'alex3')
查:select 字段 from '表名';
改:undate 表名 set name = 'sb' where id = 2;
undate 表名 set name = 'sb' where id = 2;
删:delete from '表名' where id =1;

清空表:delete from '表名'

auto_increment 表示:自增
primary key 约束 (not null unique) 不能重复 不能为空 ;方便查找

6. mysql中的存储引擎
innodb myisam memory blackhole
innodb :支持事务,行级锁,外键
mysisam:支持表级锁
memory: 内存级别的存储引擎
具有缓存的作用
不能完成数据的持久化存储,mysql server重启后会失效(起到缓存的作用)
blackhole:黑洞 所有的数据都会写入,但是都不会记录到表中
事务:多个sql语句组成的一个完整的事件,要么一起成功,要么一起失败
行级锁:能够支持更多的修改数据的并发操作 当要修改的行数非常多的时候,效率也会受到影响
外键:在本表中有一个字段 关联外表中的另一个字段
表级锁:不能支持并发的修改同一张表的数据 不需要加很多细粒度的锁来浪费时间

查看当前默认的存储引擎:
show variables like 'default_storage_engine'
查看当前数据库支持的存储引擎:
show engines G;

7. 表操作
表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是一条记录有对应的标题,称为表的字段
查看表结构
desc 表名;
查看标的详细信息(编码和存储引擎)
show create table 表名 G;

8 . 基础数据类型
整数 int
整型的长度约束 实际上没有效果
小数 float
float(n,m) 这个数据的总长度n,小数位m
时间格式
now()
year
data
time
datetime 允许为空,没有默认值,能够在标识的时间范围大
timestamp 不允许为空 默认值是当前时间,能够表示的时间范围小,超出范围后表示为
0000-00-00 00:00:00
若同一个表中有两个该字段,只有第一个字段会被表示为当前默认当前时间
字符串格式
char 定长 存储相对浪费空间,存储速度快,不管存储什么样的数据都会把数据的空格在显示的时候去掉
varchar 变长 相对节省空间.存储效率相对慢

9 . 完整性约束
not null :非空约束 指定某列不能为空
unique:唯一约束 指定某列或者几列的组合不能重复
primary key:主键,指定该列的值可以唯一的标识该列数据
foreign key:外键,指定该行记录从属主表中的一条记录,主要用于参照完整性
default:默认值
指定unique的几种方式:
create table t1(id int unique);
create table t1(id int,unique(id));
not null 和 unique连用相当于设置主键
联合唯一:
create table t1(id int,name char(5),age int(3),unique(id,name)
primary key:主键
单字段主键
1.not null +unique
2.在某一字段后加primary key
3.在所有字段后加上primary key(字段)
4.给已经建成的字段设置主键
alter table t1 modify id int primary key
多字段主键:
1.在每个字段后设置 primary key
2.在所有字段后设置primary key(字段1,字段2)
auto_increament:约束字段自动增长 被约束的字段必须同时被key约束

foreikey:外键
设置外键的前提,必须是innodb存储引擎,且被关联的字段必须是唯一的
一张表只能有一个主键,所有的其它非空+唯一都不会成为主键还是维持他原来的约束

10. 修改表结构:
修改表名:
alter table 表名 rename 新表名;
增加字段:
alter table 表名 add 字段名 数据类型;
删除字段:
alter table 表名 drop 字段名;
修改字段:
alter table 表名 modify 字段名 数据类型;modify 修改字段的类型和数据类型
alter table 表名 change 字段名 新的字段名 旧的数据类型
alter table 表名 change 字段名 新的字段名 新的数据类型
11. 查数据
select 字段 from 表名
单表查询:
distinct关键字 去重
select distinct 字段名 from 表;
select可以进行四则运算
select 字段*12 from 表;
可以给字段重新命名
select 字段 as 新字段名 from 表;
格式化函数:concat concat_ws()
concat('自己想拼的内容','字段','其他内容) #相当于python中的format
concat_ws('_',字段1,字段2) #等同于python中的join
条件判断:
case
when 条件1 then 字段的操作
when 条件2 then 字段的操作
else 字段的操作
end
where 条件
对表中的数据进行一个数据筛选
对一个值进行判断
= < > != >= <=
对一个范围的判断
between 小的值 and 大的值
in (值1,值2,值3)
模糊匹配: like 'a%' 'a_'
%是通配符 匹配任意长度的任意内容
'a_'匹配以a开头的字符 _代表一个任意字符
多个条件的拼接
逻辑运算符
and 两个条件必须都要成立
or 其中一个条件成立即可
not 非
group by分组
select 字段名 from 表 where 条件 group by 字段名
group by +聚合函数
聚合函数算出来的结果 只是代表分组的一组的结果
order by 排序 默认升序 后加上desc就是降序
linit(n,m)从n开始到到去m个值


select distinct 要筛选的字段 from 表
where 条件
group by 分组
having 过滤
order by 排序
limit 取从m开始的前n个
12. 多表查询
连表查询
表的笛卡尔积
内连接(inner join) :只有两张表中条件互相匹配的项才能被显示出来
select 字段 from 表1 inner join 表2 on 表1的关联键和表2的关联键
外链接:
左外链接:
select * from 表1 left join 表2 on 表1的字段 关联 表2的字段
右外连接:
select * from 表1 right join 表2 on 表1的字段 关联 表2的字段
全外连接:
select * from 表1 inner join 表2 on 表1的字段 关联 表2的字段
13. 子查询(效率比连表查询低)
将条件分开逐步去分析

原文地址:https://www.cnblogs.com/shicongcong0910/p/10504552.html