数据库
1、数据库
2、数据的种类
关系型数据库:oracle、mysql,sql server等
非关系型数据库:redis、mongodb等
3、数据库关系
数据库的存储地址
RDBMS和数据库的关系
Relational Datebase Management System
一个数据库由多张表组成
多个数据库存储在数据库服务器上
4、SQL结构化数据查询语言
当前的关系型数据库,都支持SQL语言进行操作
4.1 DQL
数据查询语言,select
查看当前选择的数据库
SELECT DATABASE();
使用当前的数据库
USE pai0805;
查看当前数据库的表
SHOW TABLES;
查看数据表的结构
DESC classes;
查询当前表中的数据 *代表查询当前表中的所有字段
SELECT * FROM classes;
查询当前表中的数据,展示班级的名字
SELECT classes.classname FROM classes;
SELECT classname FROM classes;
SELECT classname AS ‘班级的名字’ FROM classes;
查询的语法结构
select 字段的名字 [as 别的名字] from 表名;
4.2 DML
数据操作语言,对数据进行增(insert)删(delete)改(update)操作
在数据库中,在表里面插入新数据
注意点:
自增字段,在插入数据的时候,需要用数据进行占位这个数据可以使(0,null,default)
全列插入的语法模式:
insert into 表名 values(字段1的值,字段2的值,字段3的值)
部分列插入
insert into 表名(列1,列2) values(字段1的值,字段2的值)
插入多行数据
部分列插入多行数据
insert into 表名(列1,列2) values(字段1的值,字段2的值),(字段1的值,字段2的值)…
全列插入多行数据
insert into 表名 values(字段1的值,字段2的值,字段3的值),(字段1的值,字段2的值,字段3的值)。。。
修改数据
update 表名 set 列2=列2的值,列3=列3的值 where id=xx
where条件(方便定位到我们需要的数据)
4.3 DCL
数据控制语言,进行权限的回收和授权
4.4 DDL
数据定义语言,进行数据库表的管理,create,drop,
4.4.1 创建数据库
CREATE DATABASE pai0805;
CREATE DATABASE pai0805 CHARSET=utf8;(使用这个版本)
4.4.2 删除数据库
删除指定的数据库
DROP DATABASE if exists xxxxx;(推荐,保证表不存在的时候不会报错)
删除一张表
DROP TABLE if exists xxxxx;(推荐,保证表不存在的时候不会报错)
4.4.3 修改数据库
修改数据库的名字
rename database oldname to newname(新版本无法使用)
修改数据库字符集
alter database 数据库名 character set gbk
4.4.5 数据库常见的约束类型
not null 非空约束,保证当前的字段不能为空
default 默认值约束,如果当前的字段没有输入数据,使用默认值填充,保证该字段存在默认值
primary key 主键,表示我们物理上的存储顺序,这个字段不可能为空,保证数据的唯一性
foreign key 外键,限制两张表之间的关系,用来约束当前表与另外一张表之间的关系
unique 唯一值,表示该字段在当前的主句表中不重复
注意点:
我们创建外键的步骤:
FOREIGN KEY(本表中字段名) REFERENCES 关联表(字段名)(默认约束名)
CONSTRAINT 约束名 FOREIGN KEY(本表中的字段名) REFERENCES 关联表(字段名)(自定义约束名)
1、定义外键的字段名已经字段的类型,注意和关联表的字段要求一致
2、建立外键之间的连接foreign key(当前表的外键字段)reference 产生关联那张表的表名(外键连接字段)
3、班级和对应的学生表 班级(主表)学生表是从表,外键写在从表身上
外键
外键的作用:1、可以有效避免无效数据插入
2、可以使表相互关联
外键的不足:1、增加时间成本
2、容易出现插入错误
3、删除时需要将子表数据先删除
4.4.6 约束
4.4.6.1 添加字段约束
4.4.6.2 添加表级约束
4.4.7 主键与唯一约束的区别
4.4.7.1 组合主键
4.4.7.2 区别
4.4.8 修改数据库表
4.4.8.1 删除字段
alter table 表名 drop 字段名;
删除外键
1、解除约束alter table users drop foreign key 外键名
2、然后才能删除外键字段
alter table 表名 drop 字段名;
删除xxx的外键(创建表的过程中并没有设置索引名)
1、查看索引名 show create table 表名 或 show index table 表名
2、alter table 表名 drop foreign key 外键名;
3、alter table 表名 drop 字段名;
4.4.8.2 删除数据库表
drop table if exists xxxxx;(推荐,保证表不存在的时候不会报错)
drop table xxxxx;
4.4.8.3 创建数据库表
create table 表名
CREATE TABLE student1(
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
stuname VARCHAR(20),
age SMALLINT UNSIGNED DEFAULT 18,
gender ENUM('女','男'),
height DECIMAL(3,2),
weight DECIMAL(5,2),
class_id INT UNSIGNED DEFAULT 0
);
CONSTRAINT uid PRIMARY KEY(id),#主键
CONSTRAINT uqkey UNIQUE(phone),#唯一值
4.4.8.4 修改数据库表
修改表名:
alter table 旧表名 rename to 新表名
修改字段的名字:
alter table 表名 change column 旧字段名 新字段名 数据类型 (后面还可以加上约束);
alter table 表名 modify column 字段名 数据类型 约束;(添加数据类型和约束)
综合
alter table 表名 change|modify 字段名 字段类型 字段约束;
注意单:
change需要修改的是字段的名字、数据类型、字段的约束。
modify需要修改的是字段的类型、字段的约束。
修改字段约束:
alter table 表名 drop index 字段名;(删除唯一值索引)
alter table 表名 drop PRIMARY KEY;(删除主键)
增加字段:
alter table 表名 add 字段名 字段类型 字段的约束;
删除字段:
alter table 表名 drop 字段名;
总结:
alter table 表名 add|drop|change|modify 字段名 字段的类型 字段的约束;
全列插入的语法模式:
insert into 表名 values(字段1的值,字段2的值,字段3的值)
部分列插入
insert into 表名(列1,列2) values(字段1的值,字段2的值)
插入多行数据
部分列插入多行数据
insert into 表名(列1,列2) values(字段1的值,字段2的值),(字段1的值,字段2的值)…
全列插入多行数据
insert into 表名 values(字段1的值,字段2的值,字段3的值),(字段1的值,字段2的值,字段3的值)。。。
修改数据
update 表名 set 列2=列2的值,列3=列3的值 where id=xx
where条件(方便定位到我们需要的数据)
4.4.8.5 复制表结构
仅仅复制表结构,数据是不复制的
create table 表名 like 被复制的表名;
4.4.8.6 复制表
不仅复制表结构,也复制数据
create table 表名 select * from 被复制表名;
部分复制
create table 表名 select 字段一,字段二,… from 被复制表名;
内容检索复制
create table 表名 select 字段一,字段二,… from 被复制表名 where 引导条件;
4.4.9 总结
1、查看外键约束的约束名
show create table 表名;
2、解除外键字段的外键约束
alter table 表名 drop foreign key 外键名;
3、删除外键字段的外键名
alter table 表名 drop 字段名;
4.5 CCL
指针控制语言,通过控制指针来完成表的操作,declare cursor
4.6 TPL
事务管理语言,对事务进行管理 begin transaction、commit、rollback
CRUD(增删改查):DQL,DML,DDL
数据库语言不区分大小写
5、具体操作
5.1 创建一个数据库
create database xxxx; 创建一个数据库
create database xxxx charset=utf8(可以使用中文)
查看当前选择的数据库
select database();
删除指定的数据库
drop database xxxxx;
使用当前的数据库、
use xxxxxx;
查看当前数据库的表
show tables;
创建一张表
create table if not exists xxxx;(推荐,保证表存在的时候不会报错)
create table xxxx;
5.2 创建数据库表
5.3 数据库的数据类型
5.3.1 整数
注意点:
使用zerofill 会使用0填充,但是会将数据的类型改成无符号数
并且int(7)写在此处,只是确定显示的位数,不是规定数值的长度
总结:
1、如果不设置有符号还是无符号,默认有符号,如果向设置无符号,unsigned关键字
2、如果插入的数值超出范围,会警告out of range value for column 字段名,插入的是临界值
3、如果不设置长度,会有默认长度
4、长度代表显示的最大宽度,如果不够会用0填充,搭配zerofill使用,可以看出效果
5.3.2 小数
decimal
特点:
1、M=小数位数+整数位数
D=小数位数
如果超出范围,则插入临界值
2、M、D都可以省略,但是
如果是decimal,则M为10,D为0
如果是float和double,根据插入的数值决定精度
3、定点型的精度较高
如果要求插入的数据的精确度较高,入货币运算
5.3.3 字符串
char()表示的是固定长度的字符串char(4),“asd“补充成”asd “
varchar()表示的可变长,varchar(4),写入的是“asd”,写入的就是“asd”不会进行补充
TEXT表示的是大文本数据。字符数大于4000可以使用
创建一个表
create table classes(
id int primary key auto_increment not null
classname varchar(10) not null
num int not null default 0
);
5.3.4 日期
date
time
timestamp
6、标识列(自增长)
6.1 定义
可以不用手动增加值,系统自动提供
目的:不需要手动增加值,让系统可以自动增长,系统提供的
6.2 创建表的时候设置标识列
CREATE TABLE classes(
id INT PRIMARY KEY AUTO_INCREMENT NOT NULL ,
classname VARCHAR(10) NOT NULL,
num INT NOT NULL DEFAULT 0
);
6.3 设置自增长的标识
AUTO_INCREMENT自增长,表示该值会自动增加
查看相关属性:
SHOW VARIABLES LIKE "%auto_increment%"
设置相关属性
设置步长
SET auto_increment_increment=3;
设置初始值
SET auto_increment_offset=3;
6.4 特点
1、auto_increment不一定要和主键搭配,但是一定要和一个key(约束)搭配
2、一个表最多有一个自增长字段
3、auto_increment标识列的类型只能是数值型(int double等)
4、步长与初始值是系统的全局变量,所以一旦修改之后,全局都生效,全局都受影响注意初始值不能大于步长,所以要想修改初始值必须先修改步长
7、数据库的备份与恢复
7.1 导出数据库
mysqldump -uroot -p 数据库的名字 > 自己起的名字.sql
7.2恢复数据库
mysql -uroot -p 新数据库的名字 < 自己起的名字
7.3 注意点
退出当前的数据库
新数据库的名字需要提前设置好
8、数据库的查询
8.1
分组
SELECT 分组依据1,2…,GROUP_CONCAT(需要展示的字段名1,2…) FROM 表名 GROUP BY 分组依据1,2…;
分组依据:一个字段或者多个字段
如果需要展示其他字段的内容,需要使用GROUP_CONCAT这个方法进行连接
起别名
SELECT 分组依据1,2…,GROUP_CONCAT(需要展示的字段名1,2…) as(写不写都可以) 别名 FROM 表名 GROUP BY 分组依据1,2…;
SELECT * FROM goods GROUP BY cate_id;
SELECT cate_id FROM goods GROUP BY cate_id;
SELECT cate_id,brande_id,GROUP_CONCAT(NAME,price) '产品与价格' FROM goods GROUP BY cate_id,brande_id;
SELECT cate_id,GROUP_CONCAT(price) '产品与价格' FROM goods GROUP BY cate_id;
SELECT cate_id,AVG(price) '价格均值' FROM goods GROUP BY cate_id;
SELECT cate_id,SUM(price) '价格总和' FROM goods GROUP BY cate_id;
SELECT cate_id,COUNT(price) '数据个数总和' FROM goods GROUP BY cate_id;
SELECT brande_id,GROUP_CONCAT(price) '数据个数总和' FROM goods WHERE price>3 GROUP BY brande_id ;
SELECT brande_id,GROUP_CONCAT(price) '数据个数总和' FROM goods WHERE price>3 GROUP BY brande_id HAVING COUNT(*)>2;
SELECT brande_id,GROUP_CONCAT(NAME) '带火的物品名',ROUND(AVG(price),3) '带火的平均价格' FROM goods WHERE NAME LIKE '%火%' GROUP BY brande_id;
其中round是代表小数的位数
SELECT
分组字段名,出现数据条件 改变之后的列名
FROM 表名
WHERE 筛选条件
GROUP BY 分组的列名
HAVING 分组之后的筛选条件;
where 引导的筛选条件在原始表中已经可以实现
having 引导的筛选条件是已经分组完成之后才可以做的
order by 排序条件 desc(降序)|asc(升序)
综合注意点:
分组查询中的筛选条件分为两类
数据源 位置
分组前筛选 原始表 group by 的前面 where
分组后筛选 分组后的结果集 group by的后面 having
聚合函数做筛选条件,放在having 的后面
能用 where 做条件筛选的,就不用having ,因为会有性能问题
分组支持单个字段或者多个字段的分组,多个字段之间用,分开,或者使用表达式
可以使用排序函数