1.什么是数据库?
存储数据的仓库
2.提供数据库服务的软件有哪些?
关系型:mysql
非关系型:mongodb
mysql和mariaDB基本一模一样,一个团队做的。
3.生产环境中,如何选择使用哪个数据库?
1、是否开源(开源不等于免费)
1、开源:mysql、mariadb、 mongodb
2、商业软件:oracle、sql_server
2、是否跨平台
1、不跨平台:sql_server 只能用在windows
2、跨平台:mysql、mariadb、 mongodb、oracle
3、公司的类型
1、商业软件:政府部门、金融机构
2、开源软件:游戏网站、电商网站
4、mysql特点:
1、关系型数据库
1、关系型数据库特点:
1、数据是以行和列(表格)形式存储
2、表中行叫记录,表中列叫字段
3、表和表之间的逻辑关联叫关系
4、示例:
1、关系型数据库存储
表1 :学生信息表
姓名 年龄 班级
表2:班级信息表
班级 班主任
2、非关系型数据库存储
{
姓名:佩琦,
年龄:20,
班级:三班,
班主任:儒入修,
}
2、跨平台:支持unix、linux、windows上部署数据库服务
3、支持多种编程语言。
python java php ....
4、数据库软件、数据库、数据仓库概念:
1、数据库软件
一个软件,看得见,可操作。
2、数据库
逻辑概念,实现存储数据的功能。
3、数据仓库
数据量:比数据库庞大的多
侧重点:数据库侧重存储,数据仓库侧重于数据分析和数据挖掘。
5、mysql操作:
1.启动连接
1.mysql -h 主机地址(可选) -u 用户名 -p 密码
2.退出:exit | quit
3.sudo /etc/init.d/mysql restart 重启
2.基本sql命令
1.sql命令使用规则
1.每条命令必须以;结尾
2.sql命令不区分字母大小写
3.使用\c来终止当前命令执行
2.库的管理
1.mysql数据库结构
mysql数据库 >>> 多个库 >>> 多个表 >>> 多个行(元素)
2.库的基本操作
1.查看已有的库
show databases;
2.创建库
create database 库名;
指定创建库的字符编码
create database 库名 character set utf8;
3.查看创建库的语句
show create database 库名;
4.查看当前所在库
select database();
5.切换库
use 库名;
6.查看库中已有表
show tables;
7.删除库
drop database 库名;
8.库的命名规则
1.数字、字母、下划线,但不能使用纯数字;
2.库名区分字母大小写;
3.不能使用特殊字符和mysql关键字;
9.更改库的默认字符集
1.方法(更改配置文件)
1.步骤:
cd /etc/mysql/mysql.conf.d
cp mysqld.cnf mysqld.cnf.bak 备份配置文件
vi mysqld.cnf #配置文件
在mysqld下面添加一行character_set_sever = uft8
重启mysql
3.表的管理
1.表的基本操作
1.创建表
create table 表名(
字段名1 数据类型
字段名2 数据类型);
2.创建指定字符集的表
create table 表名(
字段名1 数据类型
字段名2 数据类型)character set utf8;
create table 表名(
字段名1 数据类型
字段名2 数据类型)charset utf8;
3.查看创建表的语句(字符集、存储引擎)
show create table 表名;
4.查看表结构
desc 表名;
5.删除表
drop table 表名;
6.删除表数据
delete from 表名 where 表达式; delete是在删除数据行的层面操作。
delete from 表名; delete 相当于用橡皮擦。
truncate 相当于删除表后再重建一个,全清空的话,效率比较高
4.注意:
1.当你创建完库和表之后,他就会以在数据库的目录下以目录和文件的形式存储。
2..frm是存放的表结构,.ibd存放的是表信息
3.数据库目录:/var/lib/mysql
5.表记录的管理
1.插入表记录(insert)
insert into 表名 (字段1,字段2,字段3) values (值1,值2,值3),(值1,值2,值3),(值1,值2,值3);
insert into 表名 (字段1,字段2,字段3) values (值1,值2,值3);
insert into 表名 values (值1,值2,值3);
2.查询表记录(select)
select * from 表名;
select * from 表名 where 条件;
select 字段1,字段2 from 表名 where 条件;
6.客户端把数据存储到数据库服务器上的过程
连接到数据库 >>> 选择库 >>> 修改表 >>> 断开与数据库的连接
7.数据类型
1.数值类型(分为有符号和无符号)
1.整型
1.int 大整型(一个int占4个字节空间)
(-2的31次方) ~ (+2的31次方)-1
0~(2的32次方)-1
2.tinyint 微小整型(一个tinyint占据1字节空间)
1.有符号(signed): -128 ~ +127
2.无符号(unsigned):0 ~ 255
age tinyint unsigned
3.smallint 小整型(一个smallint占据2字节)
-2的15次方~(+2的15次方)-1
(+2的16次方)-1
4.meiumint()
5.bigint极大整型(一个bigint占8个字节)
-2的63次方~(+2的63次方)-1
2的64次方
*zerofill 是当数字不足指定位数时在数字前面填充0
2.浮点型
1.float(浮点型 四个字节)
1.用法:
score float(m,n)
m不含小数点总位数
d小数点后位数
最多显示七个有效位
2.double(双精度 八个字节)
double(m,d)
15个有效位
3.decimal(m,n)定点型
decimal是把整数、小数分开存储,比float精确
规则:将9的倍数封装为4个字节
2.字符类型
1.char(定长,即固定的最大字符数,非字节。)
取值范围:1~255
浪费系统空间性能高,因为针对定长,无论够不够指定长度,时即都占据指定的长度(假设为n),如果不够n个长度,则会用空格在末尾补至N个长度。
2.varchar(变长)
取值范围:1~65535
节省系统空间,性能低,因为边长是在每组数据前有一个1~2字节的前缀,前缀里声明了字符长度,便于读取,所以变长不用空格补齐。
3.text/longtext
存储大文本内容,但搜索速度较慢,不需要加默认值或指定长度
4.blob/longblob
存储二进制信息,如图片,视频等,也可以存储文字,blob在于防止因为字符集问题而导致信息丢失,如oxff字节在acsii字符集中被认为非法,会被过滤掉,但是blob则不会出现此问题。
3.枚举类型
enim 选一个
set 选一个或多个
4.日期时间类型
1.date:'YYYY-MM-DD'
2.time:'HH:MM:SS'
3.datetime:'YYYY-MM-DD HH:MM:SS' 不给值默认返回null
4.timestamp:'YYYY-MM-DD HH:MM:SS' 不给值默认返回当前时间
5.日期时间函数:
1.now():返回系统当前时间,'YYYY-MM-DD HH:MM:SS'
2.curdate():返回当前日期,'YYYY-MM-DD'
3.curtime():返回当前时间,'HH:MM:SS'
4.year(date):取出年份
5.date(date):取出日期
6.time(date):取出时间
8.表字段操作
1.语法:alter table 表名 执行动作;
2.添加字段(add)
alter table 表名 add 字段名 数据类型; 默认添加到最后
alter table 表名 add 字段名 数据类型 first; 在最开始增加字段。
alter table 表名 add 字段名1 数据类型 after 字段名2; 在字段2后面增加字段1
3.删除字段(drop)
alter table 表名 drop 字段名;
4.修改数据类型(modify)
alter table 表名 mondify 字段名 新数据类型
5.字符类型宽度和字符类型宽度区别
1.数值类型的宽度为显示宽度,只用于select查询时显示,和存储无关,可用zerofill查看效果。
2.字符类型宽度超过之后无法存储。
9.表记录的管理
1.删除表记录(delete)
1.delete from 表名 where 条件; 不加where,删除全部表记录
2.更改表记录(update)
1.update 表名 set 字段1 = 值1,字段2 = 值2 where条件; 不加where,更改全部表记录
10.运算符操作
1.数值比较&&字符比较&&逻辑比较
1.数值比较: = != > >= < <=
2.字符比较: = !=
3.逻辑比较: and ;or ;between 值1 and 值2
where id between 100 and 200;
where id >= 100 and id <= 200
2.范围内比较
1.in:where 字段名 in (值1,值2)
2.not in:where 字段明 not in (值1,值2)
3.匹配空、非空
1.where 字段 is NULL
2.were 字段 is not NULL
4.注意:
1.NULL:空值,只能用is、is not 去匹配
2."":空字符串,用=、!=去匹配
11.模糊查询(like)
1.where 字段 like 表达式
2.表达式
%:匹配0到多个字符;select name from sanguo where name like "赵%"
_:匹配1个字符;select name from sanguo where name like "赵_"
12.sql查询
select ....聚合函数 from 表名 where ... group by ... having ... order by ... limit
1.聚合函数
1.分类
avg(字段):平均值
max(字段):最大值
min(字段):最小值
sum(字段):总和
count(字段):统计该字段记录的条数
2.where 跟条件表达式
3.group by 给查询的结果进行分组
select 字段1,avg(字段2) from 表名 group by 字段1
分组 聚合函数 去重
蜀国
蜀国 100 吴国
蜀国
吴国
吴国 101 吴国
吴国
*group by后字段名必须要为select后的字段
*如果查询字段和group by后字段不一致,则必须对该字段进行聚合处理(聚合函数)
4.having 对分组聚合后的结果进行进一步筛选,即having可以操作聚合语句
select 字段1,avg(字段2) from 表名 group by 字段1 having avg(字段2)>条件 order by avg(字段2) 排序 limit 显示数量;
*having 语句通常与group by联合使用
*having语句存在弥补了where关键字不能与聚合函数联合使用的不足,where只能操作表中实际存在的字段,having操作的是聚合函数生成的显示列
5.order by 给查询结果进行排序
1. order by 字段名 ASC(升序)/DESC(降序)
6.limit 永远放在sql语句的最后
1.limit n 显示n条记录
2.limit m,n 从第m+1条记录开始,显示n条
limit 2,3 显示第3、4、5三条记录
3.分页
每页显示m条记录,显示第n页的记录
limit (n-1)*m,m
7.distinct:不显示字段的重复值
select distinct 字段 from 表名;
select distinct 字段1,字段2 from 表名; 如果两个字段值都相同才去重
select count(distinct 字段) from 表名;
*distinct 和 from 之间所有字段值都相同才会去重。
8.查询表记录时做数学运算
运算符 +(加) -(减) *(乘) /(除) %(取余)
例:select 字段1,字段2*2 as 自定义字段名 from 表名;
13.嵌套查询(字查询)
1.定义:把内层的查询结果作为外层的查询条件
2.语法:
select ... from 表名 where 字段名 运算符 (select ....)
3.例:
select avg(age) from class ; + select name,age from class where age < 平均值; == select name,age from class where (select avg(age) from class)
*注意,where后的表达式中前面是什么运算符,后面一定要跟相对应的值
嵌套查询效率比较低
14.多表查询
1.两种方式
1.不加where条件(笛卡尔积)
select * from 表1,表2,表3;
select 表1.字段,表2.字段,表3.字段 from 表1,表2,表3;
2.加where条件
select 表1.字段1,表2.字段1 from 表1,表2 where 表1.字段2 运算符 表2.字段2
3.连接查询
1.内连接(inner join)
1.语法格式
select .... from 表1 inner join 表2 on 条件 inner join 表3 on 条件;
可以无限循环下去,以inner join 表4 on 条件为一段
2.外连接
1.左连接 (left join)
1.以左表为主显示查询结果
select .... from 表1 left join 表2 on 条件 inner join 表3 on 条件;
即左表全部显示,左表有而右表没有的则显示左表:null
2.右连接(right join)
1.以右表为主显示查询结果
select .... from 表1 right join 表2 on 条件 inner join 表3 on 条件;
即以右表
15.约束
1.非空约束(not null)
1.不允许该字段的值为null
## name varchar(20) not null ;
2.默认约束(default)
1.插入记录时,不给该字段赋值,则使用默认值
##sex enum ('M','F','S') not null default 'S';
16.索引
1.定义:对数据库表的一列或者多列的值进行排序的一种结构(BTree方式)
2.优点:加快数据的检索速度
3.缺点:
1.占用物理空间
2.当对表中数据更新时,索引需要动态维护,占用系统资源,降低数据维护速度
4.索引示例。
1.开启运行时间检测
show variables like 'profiling';
查看sql语句执行命令的时间检测是否打开
set profiling=1;在终端打开为临时,如果mysql退出,下次进入则需要再次启动。修改配置文件才能永久打开。
2.执行查询语句(没有索引)
select name from t1 where name = 'lucy8888';
3.在某一字段创建索引
create index 字段 on 表名(索引名(一般为字段名));
4.执行查询语句(有索引)
select name from t1 where name = 'lucy8888';
5.对比执行时间
show profiles;
5.索引分类
1.普通索引(index) && 唯一索引(unique)
1.使用规则
1.可设置多个字段
2.约束
普通索引:无约束 key标志 MUL
唯一索引:字段值不允许重复,可为null key标志 UNL
索引标志在desc中可以看到
3.把经常用来查询的字段设置为索引字段,不要将经常做写操作的字段设置为索引字段。
2.创建表创建
create table 表名(
字段名数据类型
index(字段1),
index(字段2),
unique(字段1)
unique(字段2)
);
3.已有表创建
create [unique] index 索引名 on 表名 (字段名)
4.查看索引
1.desc 表名; 查看key标志
2.show index from 表名;
3.show index from 表名/G;
Non_unique 1普通索引 0唯一索引
Key_name 索引名
Column_name 字段名
5.删除索引
drop index 索引名 on 表名;
2.主键(primary key) && 自增长(auto_increment)
1.使用规则:
1.主键只能有一个,但可以创建复合主键。
2.约束:字段值不允许重复,且不能为null
3.key标志:PRI
4.通常设置编号id为主键,能唯一锁定1条记录
2.创建表时创建
create table 表名(
id int primary key auto_increment,
.....................
);
3.在已有表创建
alter table 表名 add primary key(id);
4.复合主键
create table t1(
id int primary key auto_increment,
name varchar(20),
primary key(id,name)
);
复合主键同时不能为null,也同时不能重复。
5.删除
1.先删除自增长
alter table 表名 modify id int;
2.删除主键
alter table 表名 drop primary key;
3.外键(foreign key)
1.定义:让当前表字段的值在另一个表范围内选择。
2.语法
foreign key (参考字段名)
references 主表(被参考字段名)
on delete 级联动作
on update 级联动作
3.使用规则
1.主表、从表字段数据类型要一致
2.主表被参考字段:主键
4.示例
1.缴费信息表(财务)
id 姓名 班级 缴费
1 唐伯虎 AID08 300
2 点秋香 AID08 200
create table jftab(
id int primary key,
name varchar(20) not null,
class char(5) default 'AID',
money smallint
)charset = utf8;
insert into jftab values
(1,'唐伯虎','AID08',300),
(2,'点球','AID08',200);
2.学生信息表(班主任)
stu_id 姓名 缴费金额
create table bjtab(
stu_id int,
name varchar(15)
money smallint,
foreign key(stu_id) references jftab(id)
on delete cascade
on update cascade
);
5.删除
1.查看外键名
show create table bjtab;
2.删除外键
alter table 表名 drop foreign key 外键名;
6.在已有表中添加外键
alter table bjtab add foreign key(stu_id)
references jftab(id)
on delete set null
on update set null;
7.级联动作
1.cascade
数据级联删除、更新(参考字段)
2.set null
从表有相关联记录,字段值设置为null
3.restrict(默认)
从表有相关联记录,不让主表删除、更新