目录
前言
数据库是储存数据的仓库,数据是有组织的进行存储,意思就是有规律的,不是瞎堆进去的
英文:DataBase,简称DB
数据库管理系统:管理数据库的大型软件
英文:DBMS
SQL:结构化查询语言,操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准
MySQL概述
MySQL数据模型
关系型数据库
关系型数据库是建立在关系模型基础上的数据库,简单说,关系型数库是由多张能相互连接的二维表组成的数据库
不是表类型的数据库就不是关系型数据库
优点:
1.都是使用表结构,格式一致,易于维护
2.使用通用的SQL语言操作系统,使用方便,可用于复杂查询
SQL简介
对于同一个需求,每一种数据库操作的方式可能会存在一些不一样的地方,称为“方言”
SQL:一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准
SQL通用语法
1.SQL语句可以单行或多行书写
2.MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
3.注释
单行注释:-- 注释内容 (两个横杠)或 #注释内容(MySQL特有)
多行注释:/* 注释 */
以分号结尾
4.sql语句通过空格和缩进来增强语句的可读性
SQL分类
DDL:操作数据库,表等
DML:对表中的数据进行增删改
DQL:对表中的数据进行查询
DCL:对数据库进行权限控制
DDL(数据库设计)
数据库
上述语句的database也可以换成schema
表
查询表
查询前要进到数据库中,使用use数据库名称语句
查询表结构
创建表
最后一行末尾不能加逗号,其中方括号中的表示可加可不加
数据类型可以是多种的
操作表数据类型
定长的意思是,不管存多少都是10,储存性能高,浪费空间
变长就是实际长度储存性能低,节省空间
操作表删除&修改
操作数据,数据添加,修改,删除
这个where后面的语句可以作为区分与其他语句的不同之处
若没有加where条件,那么所有的数据都会被改变
DQL查询操作
基础查询
条件查询
select * from new where score >= 60 and score <=100; select * from new where age between 20 and 30; 两种都可以 select * from new where age = 18; //这个里面没有== !=还有<>都是不等于号 select * from new where age in(10,20,30);//三选一
查询英语成绩为null的学员信息
null不可以直接用=,!=来比较,只能用is,不是的话用is not null
select * from new where english is null;
模糊查询
1.查询姓马的学员
select * from new where name like '马%';
2.查询第二个字是马的学员
select * from new where name like '_马%';
3.查询名字中包含德的学生信息
select * from new where name like '德';
排序查询
升序排序
select * from new order by math asc;
降序排序
select * from new order by english desc;
两种顺序排序
select * from new order by math asc,english desc;
当有多个排序时,左边的排序执行完之后,才能执行右边的排序
聚合函数
1.概念:
将一列数据作为一个整体,进行纵向计算
//1.统计班级有多少人
select count(*) from new ;
//2.查询数学最高分
select max(math) from new;
当有null时不参与排序
分组查询
//1.查询男女同学的数学平均成绩
select sex, avg(math),from new group by sex;
//2.查询男女同学数学平均分成绩及人数
select sex, avg(math),count(*),from new group by sex;
//3.查询~低于70不参与分组
select sex,avg(math),count(*),from new where score > 70 group by sex;
//4.查询~分组之后人数大于2
select sex,avr(math),count(*),from new where score > 70
group by sex having count(*) > 2;
分页查询
每页显示三条数据,查询第二页
select * from new limit 3 , 3;
约束
约束的概念和分类
1.约束是作用于表中列上的规则,就是对数据及及进行规范
约束是为了保证数据的正确性与准确性
2.约束的分类
非空约束:保证数值不可以为null 关键字 NOT NULL
唯一约束:保证数据不重复 关键字 UNIQUE
主键约束:是一行数据的为一标识,要求非空且唯一 关键字 PRIMARY FEY
检查约束:保证列中的值满足某一条件 关键字 CHECK
比如说让数值在某一范围
默认约束:保存数值时,未指定值,则采用默认值 关键字 DEFAULT
外键约束:让两个表的数值之间建立链接,保证数值的一致性和完整性
关键字 FOREIGN KEY
MySQL不接受检查约束
约束演示
自动增长
auto_increment当列是数字的时候从小到大依次增长
DROP TABLE IF EXISTS new1;
CREATE TABLE new1 (
id INT PRIMARY KEY auto_increment,
ename VARCHAR(50) NOT NULL UNIQUE ,
birthday DATE NOT NULL,
salary DOUBLE(7,2) NOT NULL,
bonus DOUBLE(7,2) DEFAULT 0
);
SELECT * FROM new1;
INSERT INTO new1 (id,ename,birthday,salary,bonus) VALUES (1,'李宇航','2004-11-15',10000,5000);
INSERT INTO new1 (id,ename,birthday,salary,bonus) VALUES (3,'张梓豪','2004-11-16',9000,4000);
INSERT INTO new1 (id,ename,birthday,salary,bonus) VALUES (2,'王明杰','2004-11-17',8000,3000);
外键约束
除了外键约束之外,主表和附表之间若是要有联系,那么不光数据类型要一致,其余约束条件也要一致,除此之外,主表关联的数目也要大于等于附表,否则在添加数据时,就会添加不进去,还有创建表的时候要先创建主表,再创建附表,添加数据时也要先添加主表数据,再添加副标数据
DROP table IF EXISTS new2;
CREATE TABLE new2(
id2 INT PRIMARY KEY auto_increment,
group1 VARCHAR(50)
);
SELECT * FROM new2;
INSERT INTO new2(id2,group1) VALUES(1,'第一组');
INSERT INTO new2(id2,group1) VALUES(2,'第二组');
INSERT INTO new2(id2,group1) VALUES(3,'第三组');
DROP TABLE IF EXISTS new1;
SELECT * FROM new1;
CREATE TABLE new1 (
id INT PRIMARY KEY auto_increment,
ename VARCHAR(50) NOT NULL UNIQUE,
birthday DATE NOT NULL,
salary DOUBLE(7,2) NOT NULL,
bonus DOUBLE(7,2) DEFAULT 0 ,
CONSTRAINT fk_new1_new2 FOREIGN KEY (id) REFERENCES new2(id2)
);
INSERT INTO new1 (id,ename,birthday,salary,bonus) VALUES (1,'李宇航','2004-11-15',10000,5000);
INSERT INTO new1 (id,ename,birthday,salary,bonus) VALUES (2,'张梓豪','2004-11-16',9000,4000);
INSERT INTO new1 (id,ename,birthday,salary,bonus) VALUES (3,'王明杰','2004-11-17',8000,3000);
--在外部添加
--断开连接
ALTER TABLE new1 DROP FOREIGN KEY fk_new1_new2;
--添加链接
ALTER TABLE new1 ADD CONSTRAINT fk_new1_new2 FOREIGN KEY(id) REFERENCES new2(id2);
数据库设计
数据库设计简介
数据库多表实现关系
在多对多时要想实现联系,那么就要借助于第三张表
DROP table IF EXISTS biao1;
CREATE TABLE biao1(
index1 INT,
eNAME VARCHAR(50) NOT NULL UNIQUE,
biao1_index INT PRIMARY KEY auto_increment
);
SELECT * FROM biao1;
DROP table IF EXISTS biao2;
CREATE TABLE biao2(
index2 int,
NAME VARCHAR(50) NOT NULL UNIQUE,
biao2_index INT PRIMARY KEY auto_increment
);
SELECT * FROM biao2;
DROP table IF EXISTS biao3;
CREATE TABLE biao3(
index3 int PRIMARY KEY auto_increment,
biao3_index1 int ,
biao3_index2 INT
);
SELECT * FROM biao3;
alter table biao3 add CONSTRAINT fk_biao3_index1 FOREIGN KEY (biao3_index1) REFERENCES biao1(biao1_index);
alter table biao3 add CONSTRAINT fk_biao3_index2 FOREIGN KEY (biao3_index2) REFERENCES biao2(biao2_index);
不知道为什么只有带约束才能被关联
多表查询
简介
笛卡尔积:两个集合的所有情况会同时出现
解决办法:消除无效数据,添加条件
内连接:相当于两个表的交集,
外连接分为左外连接还有右外连接,左外连接就是左边表的全部信息还有交集部分,右外连接就是右边表还有交际部分
子查询:
内连接还有外连接
隐式内连接
SELECT * FROM new1,new2 WHERE new1.id = new2.id2;
SELECT
new1.ename,
new1.birthday
FROM
new1,
new2
WHERE
new1.id = new2.id2;
显式内连接
SELECT * FROM new1 INNER JOIN new2 ON new1.id = new2.id2;
inner可以省略
左外连接
SELECT * FROM NEW1 LEFT JOIN NEW2 ON NEW.ID = NEW2.ID2;
右外连接
SELECT * FROM NEW2 RIGHT JOIN NEW1 ON NEW.ID = NEW2.ID2;
子查询
查询中嵌套查询就是子查询,里面看作是查询的一个条件
单行单列查询,多行单列查询,多行多列查询
单行单列
SELECT eNAME , birthday FROM new1 WHERE salary >(SELECT salary FROM new1 WHERE ename = '王明杰');
多行单列
SELECT eNAME ,BRITHDAY FROM NEW1 WHERE ID IN (SELECT ID FROM NEW2 WHERE ID2 = 1 OR ID2 = 2);
多行多列
SELECT * from (select * from new1 WHERE id = 1 or id =2 ) biao4 WHERE biao4.eNAME = '李宇航';
事务
事务简介
事务是一种机制,一个操作序列,包含了一组数据库操作命令
事务·把所有命令作为一个整体一起向系统提交或撤销操作请求,这一组指令要么同时成功要么同时失败,
事务是一个不可分割的工作逻辑单元
由三部分:开启事务,回滚事务,提交事务
开启事务时造成的是临时更改,只有提交事务之后才能真正在数据库修改数据,只是自己的页面可以看到更改,其他页面不会更改
BEGIN;
UPDATE new1 SET salary = salary - 500 WHERE ename = '王明杰';
ROLLBACK;
COMMIT;
不以事务格式执行的话就是永久更改
索引
介绍
索引是帮助数据高效获取数据的数据结构
优点
1.提高数据查询的效率,降低数据库的IO成本
2.通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗
缺点
1.索引会占用存储空间
2.索引大大提高了查询效率,同时也降低了insert,update,delete效率
结构
MYSQL数据库支持的索引结构有很多,比如Hash索引,B+T热尔索隐。Full-Text索引等,我们平时说的索引,如果没有特别明确指示,都是指默认的B-Tree结构组织的索引
存在的问题是大量数据的情况下,层次深,检索速度慢
语法
//创建索引
create [unique] index 索引名字 on 表名(字段名字); //如果有多个字段名,那么用逗号隔开
//查看索引
show index from 表名;
//删除索引
drop index 索引名 on 表名;
主键字段在建表时候,会自动创建主键索引
添加唯一约束时,数据库实际上会添加唯一索引