一,MySQL数据库
-
为什么要学习数据库
1.了解数据库可以准确定位bug为止。
2.准确指出数据库bug给开发。 -
什么是数据库
-
按照数据的组织、存储和管理数据的仓库
数据库 = 多张表 + 各表之间的关系
常见数据库:Mysql、Oracle、SQLServer、MongoDB、SQLite
数据库SQL的关系:SQL是操作数据库中数据的语言
-
-
MySQL数据库安装配置
- 安装:根据提示安装
- 卸载:干净(4步卸载)
- 停止启动
- 卸载程序
- 删除mysql文件下所有文件
- 点开隐藏文件
- 配置
-
MySQL数据库操作命令
登录:mysql -h localhost -p -u root -p
退出:exit或者 ctrl+C
显示数据库:show databases;
数据库切换:use 数据库
查看当前库的所有表:show tables;
查看其它库所有表:show tables from 库名;
创建表:create table 表名(
列名 类型
列名 类型
)查看表结构:desc 表名;
-
MySQL增删改查:
-
DDL-数据库定义语言
-
概念及作用
database defination language 数据库定义语言,用于定义数据库,用于定义表结构
-
表中字段基本数据类型
- UTF-8 :一个汉字 = 3 字符
- GBK :一个汉字 = 2字符
- varchar(n),n表示n个字符
- 数据库语句操作
1.创建一个数据库
create databae 库名;
2.删除创建的数据库
drop database 库名;
3.选择数据库
user 库名;
4.查看数据库创建细节
show create database 库名;
5.创建一个使用gbk字符集的数据库
create database 库名 character set gbk
3.表结构语句操作
1.选择数据库
use 库名
2.创建MySQL数据表
//创建表 create table 表名(id int,name varchar(20),sex varchar(20),age int,salery float(6,2),birthday date); //删除表 drop table 表名; //查看所有表 show tables; //查看表的创建细节 show create table 表名; //展示表结构 desc 表名; //在原有的学生基础上添加address列 alter table 表名 add address varchar(20); //在原来的学生基础上删除address列 alter table 表名 drop address;
5.定义表的约束
create table 表名(id int primary key auto_increment,name varchar(20) unique not null,sex varchar(20),age int,salery float(6,2),birthday date)
- 如果不想字段位NULL 可以设置字段属性为 NOT NULL,在操作数据库时如果输入该字段的数据为NULL,就会报错。
- AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1.
- PRIMARY KEY关键字用于定义列为主键。为了识别数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引。可以多列来定义主键,列间以逗号分隔
- UNIQUE KEY用途:主要是用来防止数据插入的时候重复的
- ENGINE:设置存储引擎
- CHARSET:设置编码
-
-
DML数据库操作语言
-
概念及作用
DML:data manipulation language 数据库操作语言,用以操作数据库。
-
插入数据
//插入数据 insert into student values(1,'zhangsan','nan',19,387.13,'1990-10-10'); //查询 select * from 表名
- 问题:插入中文会报错
insert into 表名 values(2,'李四','男',19,564.23,'199-10-10');
- 解决
//通知服务器客户端使用的编码是gbk set character_set_client=gbk; //通知服务器客户端查看结果集使用的编码是gbk set character_set_results=gbk; insert into student(id,name,sex,age) values(3,'王五','男',19);
-
删除数据
//删除单挑数据 delete from 表名 where id=1; //删除所有数据,不删除结构,会放到日志中,事物提交后才生效 delete from 表名 //摧毁表,删除表中所有数据,不删除结构,立即生效 truncate table 表名
注意:delete from 表名; 与truncate table 表名; 都是删除该表中所有数据,区别:前者删除后自增主键还在,后者主键会从1开始
-
修改数据
//设置所有人的年龄加10岁 update 表名 set age=age+10 //修改zhangsan 为张三 update 表名 set name='张三' where name='zhangsan'; //修改王五的salery和出生日期 update 表名 set salery=100.01,birthday='1999-10-10' where id=3;
-
-
DQL-数据库查询语言
-
概念及作用
DQL:Date Query Language 数据库查询语言
-
数据查询
//删除表 drop table 表名 //创建数据库表-学生成绩表 create table 表名(id int primary key auto_increment,nam varchar(20) unique not null,chinese float,english float,) //添加几条数据 insert into 表名 values(1,'张三',90,80,80); insert into 表名 values(2,'李四',90,87,60); insert into 表名 values(3,'王五',90,80,80); insert into 表名 values(4,'赵六',90,80,80); //查询所有学生信息 select * from 表名; //查询id为1的学生信息 select * from 表名 where id=1; //查询数学成绩大于80的学生 select * from 表名 where math>80; //查询所有学生成绩,并输出效果为 姓名 语文 英语 数学 效果 select name as 姓名,chinese as 语文,english as 英语,math as 数学 from 表名; //查询所有成绩及数学分+10分 select *,(math+10)from 表名 //统计每个学生的总分 select name,(math+english+chinese) as 总分 from 表名 //查询总分大于230分的同学 select * from 表名 where(math+english+chinese)>230 //查询数学成绩在80-90之间的同学 select * from 表名 where math between 80 and 90 //查询数学语文英语都大于80的同学成绩 select * from 表名 where math>80 and english>80 and chinese >80; //查询数学成绩在 80 60 90内的同学,即数学成绩有60、80、90的。 select * from 表名 where math in(80,60,90); //模糊查询 //查询所有姓名中包含张的同学 select * from 表名 where name like ‘%张%’
-
排序查询
Mysql升序为asc,降序为desc
//升序 select * from 表名 order by 字段 [asc];(不加默认) //降序 select * from 表名 order by 字段 desc;
-
分页查询
limit是mysql的分页查询语法
select * from 表名 limit m,n; 其中 m 是指记录从m+1条开始,n代表取n条记录 //排序+分页 select * from 表名 order by 字段 desc limit m,n;
-
分组查询
分组查询得到结果是第一次查到的某个组别。
//创建一个订单表 create table employee(id int,name varchar(20),sex varchar(20),age int); insert into employee values(1,'sunsan','男',18); insert into employee values(2,'lisi','男',18); insert into employee values(3,'wangwu','女',19); insert into employee values(4,'zhaoliu','男',15); //分组查询 select * from 表名 group by 字段; //分组查询加条件 select * from 表名 group by 字段 having 字段><=值;
- having 条件表达式:用来分组查询后指定一些条件来输出查询结果
- having作用和where一样,但having只能用于group by
-
报表查询
count 个数
sum 总数
avg 平均值
max 最大值
min 最小值
//统计班级里面有多少同学 select count(*) from 表名; //统计总成绩大于250分的人数 select count(*) from 表名 where (列名+列名)><=值; //统计班级里面各科总成绩 select sum from 表名; //统计所有科目的总成绩 select sum(列名+列名) from 表名; //统计一下语文平均成绩 select avg(字段) from 表名; //统计一下最高分 select max(字段) from 表名; //统计一下最低分 select min(字段) from 表名;
-
-
数据库控制语言
数据库控制语言,简称DCL
-
二、多表联查和子查询
创建表约束外键:
constraint 约束
foreign key 约定表与表之间的关系 references 关联表的主键
-
多表联查
一对一:一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然。
-
一对多:一个实体的某个数据与另一个实体的多个数据有关联关系,一对多的关系在设计的时候,需要设计表的外键。
注意:表的外键必须是另一张表的主键
多对多:(3个表= 2个实体表+1个关系表)
-
连表查询
分类:内连接、外连接、交叉连接
-
交叉查询:交叉查询,又叫笛卡尔积查询,会将左表和右表的信息,做一个乘积将所有信息查询出来,会产生临时表,比较占用内存,生成的记录数=表1X表2
两个表的条件相乘查出结果,占用内存大
select * from 左表名,右表名; select * from 左表名 cross join 右表名;
-
-
内连接查询:inner join on 查询两张表,设定条件,将两张表中对应的数据查询出来,不会产生笛卡尔积,不会产生临时表,性能高。
两张表重叠部分
select * from 左表名 左别名 inner join 右表名 右别名 on 左别名.id=右别名.外键名; select * from 左表名,右表名 where 左表名.id=右表名.外键名; select * from 左表名 左别名,右表名 右别名 where 左别名.id=右别名.外键名;
-
左外连接:left join on查询两张表的同时,将左表自己没有关联的数据也查询出来。
注意:join前面是左,后面是右
select * from 左表名 左别名 left join 右表名 右别名 on 左别名.id=右别名.外键名;
-
右外连接:right join on查询两张表的同时,将右表自己没有关联的所有数据查询出来。
select * from 左表名 左别名 right join 右表名 右别名 on 左别名.id=右别名.外键名;
-
MySQL图形化工具
Navicat
-
性能优化
索引优化:给某字段添加一个索引。
-
优点:方便查询,运行速度快。
缺点:占用内存大。
数据库检测:explain。
-
数据库视图
查看表与表之间的关系
解决太复杂表关系,方便查数据。