Mysql基础
介绍
数据库分为关系型数据库和非关系型数据库(重点学习redis)
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
DB : DataBase 数据库 DBMS : 数据库管理系统 SQL : 一种语言
然而DBMS负责执行SQL语句同时来操作DB当中的数据
分类
DQL (数据查询)查询语句 凡是select语句都是DQL
DML (数据操作)insert delete update 对表的中的数据进行增加删改
DDL (数据定义)create drop alter 对表的结构进行增删改
TCL (事务控制)commit 提交事务 roolllback 回滚事务
DCL (数据控制) grant授权 revoke撤销权限等
数据库的使用
数据库的安装
数据库的基本使用
查看数据 show databases;
创建数据库 create database huihui;
使用数据库 user huihui; show tables;
删除数据库 drop database 数据库;
步骤
一、登录 打开dos命令窗口
mysql -uroot -p(密码是隐藏的)
二、查看有那些数据库
show databases;
三、创建数据库
create database huihui;
四、使用数据库
show tables;
五、查看当前使用的数据
show tables;
六、创建一个表的结构
create table category(cid varchar(20) primary key,cname varchar(100));
七、其他基本操作
查看表结构
desc category;
删除表的结构
drop tables;
删除库
drop detabase;
查看现在使用哪个数据库
select database();
修改表添加列
alter table 表名 add列名
类型(长度)约束;使用反引号
修改表的列名
alter table change 旧列名 新列名 类型(长度);
修改表删除列
alter table 表名 drop 列名;
修改表的名字
rename table 表名 to 新表名;八、插入表记录 insert into 表(字段1 ,字段2,字段3)values(值1 值2 值3); insert into 表 value(值1 ,值2 ,值3) 九、更新记录 update 表名 set 字段名 = 值 , 字段名 = 值; update category set cname = '家电'; 将所有行cname改为家电 update category set cname = '水果' where cid = 'coo1' 将c001改为水果 十、删除表格 delete from category;
查询
表格前期的准备
create table product(
pid int primary key,
pname varchar(20),
price double,
category_id varchar(32)
);
insert into product(pid,pname,price,category_id) values(1,’联想’,5000,’c001’);
insert into product(pid,pname,price,category_id) values(2,’海尔’,3000,’c001’);
insert into product(pid,pname,price,category_id) values(3,’雷神’,5000,’c001’);
insert into product(pid,pname,price,category_id) values(4,’杰克琼斯’,800,’c002’);
insert into product(pid,pname,price,category_id) values(5,’真维斯’,200,’c002’);
insert into product(pid,pname,price,category_id) values(6,’花花公子’,440,’c002’);
insert into product(pid,pname,price,category_id) values(7,’劲霸’,2000,’c002’);
insert into product(pid,pname,price,category_id) values(8,’香奈儿’,800,’c003’);
insert into product(pid,pname,price,category_id) values(9,’相一本草’,200,’c003’);
insert into product(pid,pname,price,category_id) values(10,’面霸’,5,’c003’);
insert into product(pid,pname,price,category_id) values(11,’好想你枣’,56,’c004’);
insert into product(pid,pname,price,category_id) values(12,’香飘飘奶茶’,2,’c005’);
insert into product(pid,pname,price,category_id) values(13,’海澜之家’,1,’c002’);
insert into product(pid,pname,price,category_id) values(14,’辉辉’,5000,’c005’);
select pname,price from product; 查询价格和产品名称
+————+——-+
pname | price |
---|---|
+————+——-+ | |
联想 | 5000 |
—- | —- |
海尔 | 3000 |
—- | —- |
雷神 | 5000 |
—- | —- |
杰克琼斯 | 800 |
——– | —- |
真维斯 | 200 |
—— | —- |
花花公子 | 440 |
——– | —- |
劲霸 | 2000 |
—- | —- |
香奈儿 | 800 |
—— | —- |
相一本草 | 200 |
——– | —- |
面霸 | 5 |
—- | —- |
好想你枣 | 56 |
——– | —- |
香飘飘奶茶 | 2 |
———- | —- |
海澜之家 | 1 |
——– | —- |
辉辉 | 5000 |
—- | —- |
+————+——-+ |
select pname from product as p; 给表起别名
select pname as 商品名 from product as p; 给列起别名
select pname as pn from product;
select distinct price from product; 取重复
select pname,price+10 from product; 查询结果是表达式 将所用商品的价格+10进行显示
分组查询 分页查询
删除语句 加条件
delect from product where pid > 13;
分组查询
统计各类商品的个数
select category_id,count(*) from product group by category_id;
sql语句执行顺序
from > where > group by > 聚合函数 > having > select > order by > limit
分组以后 select 的后面只能跟分组字段和聚合函数
select category_id,count() from product group by category_id having count() >1;
having 是在分组后对数据进行过滤 where是在分组前对数据进行过滤
分页查询:
select from limit M,N;
M 是下标 下标从0开始 N 是显示的条数 limit M,N;
每页显示多少条记录每页显示5条
第一页 limit 0,5
insert into select 语句从一个表中复制数据 然后把数据插入到另一个表中;
insert into product2 select pid,pname,price from product where category_id = ‘c001’;
条件查询
比较运算符
1支持如下运算
逻辑运算符
select * from product where pname = ‘花花公子’; 商品查询
select * from product where price = 800;
select * from product where price != 800; 价格不等于800
select * from product where price <> 800; 价格不等于800
select * from product where price not(price = 800); 价格不等于800
select * from product where pname like ‘花%’; 查询以 花 开头的商品
select * from product where pname like ‘%花%’; 查询所有含 花 的商品
select * from product where pname like ‘_想%’; 查询第二个字为想的商品
select * from product where category_id is null;
排序
select * from 表名 order by 排序字段 asc 默认是升序
select *from product order by price asc; 升序
select *from product order by price desc; 降序
表与表的关系
表与表的关系
一对一的关系
一对多的关系
多对多的关系
主键列 控制 外键列
alter table product 修改表
add constraint product_fk 添加
foreign key(category_id) references category(cid);
内连接查询 (两张表的交集)
1 隐藏式内连接查询 select * from A, B where 条件
2 查询哪个分类下面有那些商品
select * from category a,products b where a,cid = b.category_id;
select a,cname,b pname from category1 a,product1 b where a,cid = b.category_id;
显示连接 select * from A inner join B on 条件
select * from category a inner product1 b on a.cid = b.category_id;
外连接
查询 (关键字 outer join outer join B on 条件
外连接 left outer join
select * from A left outer join B on 条件
右连接 right outer join
select * from A right outer join B on 条件
select * from category1 a left outer join product b on a.cid = b.category_id;
多表查询
子查询1
其实就是 select 的嵌套 select * from (select * from (select * from))
select * from
product1 p
where
p.category_id = (select cid category1 where cname =’化妆品’);
让商品表里查询价格 等于 最高价格
mysql> select * from product1 where price = (select max(price) from producr1);
字查询可以 作为一个临时表
se
select* from product1 p,
常用函数
select abs (-8) – 绝对值
select ceiling(9.4) –向上去整
select floor(9.4) –向下取整数
select rand() –返回一个0 ~ 1 直接的随机数
select sign(10) – 判断一个数的符号 负数返回—1 正数返回1
字符串函数
select char_length(‘即使再小的帆也能远航’) 字符串长度
select concat (‘wo’,’ai’,’nimen’) –拼接字符串
开窗函数
用来直接排序等等
create table employee1 (empid int,ename varchar(20),deptid int,salary decimal(10,2));
insert into employee1 values(1,’刘备’,10,5500.00);
insert into employee1 values(2,’赵云’,10,4500.00);
insert into employee1 values(3,’张飞’,10,4500.00);
insert into employee1 values(4,’关羽’,10,3500.00);
insert into employee1 values(5,’曹操’,10,6500.00);
insert into employee1 values(6,’许褚’,10,5600.00);
insert into employee1 values(7,’张辽’,10,5400.00);
insert into employee1 values(8,’徐晃’,10,4500.00);
事务
原子性
要么都成功 要么都失败
一致性
事务前后的数据都保持一致
持久性
事务一旦提交 表示事务结束后的数据不随着外界原因导致数据丢失
隔离性
事务的隔离是多个用户并发访问数据库时 数据库为每一个用户的事务 不被其他事务所干扰,
多个并发的事务之间要相互隔离
–mysql 是默认开启事务自动提交的
set autocommit = 0 关闭
set autocommit = 1 开启
–手动处理事务
set autocommit = 0 – 关闭自动提交
–事务开启
start transaction – 标记一个事务的开始 , 从这个之后的sql都在同一个事务内
insert xx
insert xx
–提交 持久话
commit
–回滚 回到原来的样子
rollback
–事务结束
set autocommit = 1 –开启自动提交
–了解
sevepoint 保存点名 设置一个事务的保存点
pollback to savepoint 保存点名 回滚到保存点
release savepoint 保存点名 –
数据库备份
权限管理 用户管理
MySQL 数据库备份的方式
1.直接拷贝物理文件
2.直接设置数据库的设计
良好的数据库
节省内存空间
保证数据库的完整行
方便我们开发系统
设计数据库步骤
收集信息 分析需求
用户表(用户登录注销 用户的个人信息 写博客 创建分类
分类表
文章表
友链表
自定义表
标识体
三大范式
信息重复
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,
就说明该数据库表满足了第一范式。
第二范式(确保表中的每列都和主键相关)
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关 ,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立
相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。
如下面这两个表所示的设计就是一个满足第三范式的数据库表。
规范性和性能的问题
关联的表不得超过三张表
考虑商业化的需求和目标 (成本,用户体验) 数据库的性能更加重要
在规范性能的问题的时候 需要适当的考虑一下规范性
故意给某些表增加一下字段 (从多表查询标为单表查询)
索引
索引的分类
1 树索引
2 哈希索引
创建索引
create i ndex price_indexN-
amei ON mytable(username([length]);
create index price_index on product1(price);
方式2 修改表的结构
alter table product1 sdd index pname_index(pname);
方式3 创建表的时候指定
create table myable(
id int not null,
username varchar(16) notnull,
index username_index(username);
查看索引
show index from product1;
查看表的索引
select * from mysql.inndb_index_statsa where a,
database_name `=’数据库’;
查看某一表的索引
select * from mysql.inndb_index_statsa where a,
database_name ='数据库'and a.table_name like'%表名%'; select * from mysql.inndb_index_stats
a where a,database_name
=’bigdata_db’and a.table_name like’%product1%’;
删除索引
drop index [名字] on product1;