一、数据库的介绍
1.数据库的概念
数据库:数据库就是存放数据的仓库,本质上也就是把数据以文件的形式保存。
表:数据库中包含的是表,一个数据库可以包含多个表,数据最终保存在表中。
关系数据库:每个表都是独立的,表与表之间通过公共字段来建立关系。
NoSQL(非关系数据库):解决关系型数据库多表查询效率的问题,常见的有Redis、mongodb。数据库中存储格式是键值对。
2.常见的关系型数据库
| 数据库 | 使用语言 | 开发公司 |
| ---------- | -------- | -------------- |
| access | SQL | 微软 |
| SQL Server | T-SQL | 微软 |
| MySQL | Mysql | oracle公司收购 |
| Oracle | PL/SQL | 甲骨文公PL司 |
MYSQL:关系型数据库,由瑞典Mysql AB公司开发,目前属于Oracle公司。
MYSQL:开源
MYSQL:支持大型的数据库 ,可以处理拥有上千万条记录的大型数据库。
MYSQL:使用标准的SQL数据语言形式。
MYSQL:可以运行多个系统上,并支持多种语言,比如c、c++、python、java。php等
3.MYSQL的安装
mysql-installer-community-5.7.22.1.msi
Developer Default:开发人员默认
Server only:仅作为服务器
Client only:仅作为客户端
Full:完全安装类型
Custom:用户自定义安装类型
standalone mysql server/cassic mysql replication:独立的mysql服务器
innodb cluster sandbox thst setup(for testing only):innodb集群沙箱thst设置(仅用于测试)
4.文件查看
bin:是mysql的可执行文件。
data:存放数据的。
5.MYSQL的进程查看
ows10运行窗口中,输入命令services.msc
以管理员的身份运行cmd命令框,在cmd中关闭mysql
通过命令行:
net start 服务名(mysql**):启动mysql服务
net stop 服务名:关闭MYSQL服务器
6.mysql的链接--windows命令行
host:主机-h
username:用户名-u
password:密码-p
port:端口-P
比如:mysql -h127.0.0.1 -P3306 -uroot -proot
本地连接的写法:
比如:mysql -uroot -p
退出mysql并且关闭连接:
1.exit
2.quit
3.\q
7.数据库的CRUD
1.information_schema:是信息数据库,其中保存着关于mysql所维护的所有其他数据库的信息。如数据库名,数据库表,表栏的数据库类型与访问权限等
2.performance_schema:用于监视mysql服务器,收集数据库服务器性能参数
3.mysql:MYSQL系统数据库,保存的登录用户名,密码,以及每个用户的权限等等
4.sys:库里面的表、视图、函数、存储过程可以使我们更方便、快捷了解到mysql的一些信息。
8.创建数据库
语法:
create database [if not exists]`数据库名` charset=utf8
创建的数据库名称,包含特殊字符的,关键字的--在特殊字符、关键字行加上反引号,为了创建数据库时万无一失,我们可以在所有的数据库名上加上反引号。
创建数据库的时候可以指定字符编码
比如:create database teather charset=gbk;
gb2312 :简体中文,收录6千多
gbk:简体中文,收录2万多
utf8:世界通用字符编码
9.删除数据库
语法:
drop database[if exists]数据库名
10.修改数据库编码
语法:
alter database 数据库名 charset=字符编码
11.显示数据库的创建语句
语法:
show create database 数据库名
##12.选择数据库
目的:指定后面要操作的数据库。
语法:use 数据库名
二、表的操作
1.创建表
语法:
create table [if not exists] 表名(
字段名 数据类型 [null][not null][auto_increment][primary key][comment],
字段名 数据类型[default]...
)engine=存储引擎 default charset =utf8;
解释:
null/not null :空/非空
default:默认值
auto_increment:自动增长
primary key:主键
comment:备注
engine:引擎 innodb、myisam、memory引擎是决定数据存储的方式。
2.创建表的步骤
1.创建数据库niu
create database niu;
2.选中数据库niu
use niu;
3.展示当前数据库下是否有表
show tables
4.创建表
create table stu(
id int,
name varchar(30)
);
5.查看创建的表
show tables
例子:复杂表的创建
create table if not exists teather(
id int auto_increment primary key comment ‘主键‘,
name varchar(20) not null comment ‘姓名‘,
phone varchar(20) comment ‘电话号码‘,
addr varchar(100) default ‘地址不详‘ comment ‘地址‘
)engine=innodb;
多学一招:
create table 数据库名.表名:用于给指定的数据库创建表。
create table data.stu(
#给data数据库中创建stu表
id int,
name varchar(10)
);
3.显示表信息
1.显示创建表的语句
常规显示:
语法:show create table 表名;
格式化显示:
语法:show cteate table`表名`\G
- 查看表的结构
语法:desc[ribe] 表名
例子:
查看teather表的结构
describe teather;
简写方式:desc teacher;
4.删除表
语法:drop table [if exists] 表1,表2....
例1:删除stu表
drop table stu;
例2:一次性删除多个表
drop table a1,a2;
5.修改表
语法:alter table 表名;
添加字段:alter table 表名 add [column]字段名 数据类型[位置]
例1:向teacher表中添加age字段
alter table teather add age int;
desc teather;
例2:将字段添加到表中的第一个字段.first
alter table teather add email varchar(30) first;
desc teacher
例3:将字段添加到指定字段的后面after
alter table teacher add sex varchar(2) after name;
查看添加结果
desc teacher
6.删除字段
语法:alter table 表 drop [column] 字段名
例1:删除teather中的email字段
alter table teather drop email;
7.表名的修改
语法:alter table 表名 rename to 新表名
alter table teather rename to stu;
三、插入数据
mysql服务器--->数据库--->表--->数据
1.准备
新建一个数据库fenxiangniu
create database fenxiangniu charset =utf8;
use fenxiangniu;
create table stu(
id int auto_increment primary key comment ‘主键‘,
name varchar(20) not null,
addr varchar(50) default ‘地址不详‘,
score int comment‘成绩‘
);
2.插入一条数据:
语法:insert into 表名(字段名,字段名..)values(值1,值2....)
例1:向stu表中插入1,‘jack‘,‘上海‘,88字段个数与顺序必须一致
insert into stu (id,name,addr,score) values (1,‘jack‘,‘上海‘,88);
例2:插入的字段可以和表的字段顺序不一致,值的顺序必须和插入字段的顺序一致;
insert into stu(name,score,addr,id)values(‘berry‘,77,‘北京‘,2);
例3:自动增长的值插入null即可
insert into stu(id,name,addr,score)values(null,‘李白‘,‘上海‘,66);
例4:可以插入部分字段,但是,非空字段必须插入
instert into stu(id,name,addr)values(3,‘ketty‘,‘上海‘);
例5:插入值的顺序和个数与表的字段的顺序和个数一致,插入的字段可以省略
insert into stu values(null,‘杜甫‘,‘北京‘,null);
例6:通过default关键字插入默认值
insert into stu values(null,‘李清照‘,default,66);
脚下留心:插入的值,必须与字段一致
例7:一次想插入多条数据
insert into stu values(null,‘辛弃疾‘,default,66),(null,‘岳飞‘,‘河南‘,77);
例8:使用insert...set 插入数据
insert into stu set name=‘白居易‘,sex=‘男‘;
四、数据的修改删除清空
1.修改数据
语法:update 表名 set 字段=值[wehre 条件]
例1:将1号学生的地址改成山东
update stu set addr=‘山东‘ where id=1;
例2:将berry地址改成上海,成绩改成66
update stu set addr=‘上海‘,score=66 where name =‘berry‘;
例3:将所有数据的地址改为湖南,成绩改为70
update stu set addr=‘湖南‘,score=70;
2.删除数据
语法:delete from 表名[where 条件]
例1:删除学号是1号的学生
delete from stu where id=1;
例2:删除id小于5的
delete from stu where id<5;
例3:删除表中所有记录
delete from stu;
3.数据库表清空
语法:truncate table 表名
例1:删除学号是1号的学生
truncate table stu;
脚下留心:delete from表和truncate table表的区别?
delete from表:遍历表记录,一条一条的删除
truncate table:将原来表销毁,再创建一个同结构的新表,就清空表而言,这种方法效率高。
五、主键的使用
列属性--主键(primary key)
1.主键规则:
1.设置了主键的字段不能为空,也不能重复
2.一个表只能有一个主键,但是可以设置多个字段为主键
2.主键作用:
1.可以保证记录的完整性
2.加快查询的速度
3.主键的选择原则:
1.设置主键使用最少个数的字段,最好设置主键的字段只有一个
2.设置主键的字段不要以修改频率过高的字段
3.设置主键不要使用字符串,最好使用数字字段
4.添加主键的方法
方法一: create table stu1( name varchar(20) primary key, age int ); 方法二:在创建表语句最后单独设置字段为主键 create table stu2( name varchar(20), age int, primary key(name) );
方法三:可以设置多个字段为主键 create table stu3( name varchar(20), age int, primary key (name,age) ); 方法四:表创建完成后,通过修改表的结构进行创建 create table stu4( name varchar(20), age int ); alter table stu4 add primary key (name); 注意:一般主键都是和自增长地段配合使用,字段类型为数字类型。
create table stu5( id int unsigned auto_increment primary key, name varchar(20), age int ); 使用desc tablename查看表的结构
5.主键的删除
alter table 表名 drop primary key
六、唯一键
1.唯一键(unique)的作用
1.可以设置null(空)
2.字段的值不能重复
创建数据库 create database niuer charset=utf8; use niuer;
方法一: create table stu1( name varchar(20) unique, age int unique key ); 方法二:在表字段的最后,添加唯一键的设置 create table stu2( name varchar(20), age int, uniquey (name) ); 方法三:修改表的结构,添加唯一键 alter table 表名 add unique(字段);
2.外键(foreign key)的了解
外键: 如果一个表的某个字段指向另一个表的主键,就称为外键。被指向叫父表,负责指向的表叫做从表,也叫字表。 对关系字段进行约束,当为从表中的关系字段填写时,会到关联的主表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并报错。
3.创建外键
[constraint 外键名] foreign key(字段) references 主表(字段) 语法:创建表的时候就创建外键
create table stu1(
id int auto_increment primary key,
name varchar(20)
);
create table score(
id int auto_increment primary key ,
math int,
foreign key(id) referencess stu1(id)
);
insert into stu1 values(null,‘张三‘);
insert into score values(1,100);
七、mysql函数
内置函数
1.rand()获取随机数,取值范围为0到1
select rand();
比如::select rand()*100;
2.floor():向下取整
select floor(5.9);--直接去掉小数点后面的数字
3.ceil():向上取整
select ceil(5.1);
select floor(rand()*10);--随机抽奖的应用,随机生成一个id
4.ucase():将小写转为大写
select ucase(‘i am a boy‘);
5.lcase():将大写转为小写
select lcase(‘I AM A BOY‘);
6.concat():将搜索出来的列中的内容合并起来
select concat(name,sex,age) from stu;--将字段中的内容转为字符串
7.left():截取左边多少个
select left(‘abcdef‘,2);
8.right():截取右边多少个
select right(‘abcdef‘,2);
9.substring(字符串,开始位置,截取长度):截取字符串中的内容
select substring(‘abcdef‘,2,3);
10.length():计算字符串的长度
select length(‘床前明月光‘);
11.unix_timestamp():获取时间戳
select unix_timestamp();
12.from_unixtime():将时间戳转为可以识别的日期和时间
select from_unixtime(unix_timestamp());
13.now():获取当前时间
select now();
14.year():获取年份
select year(now());
15.month():获取月份
16.day():获取日
select day(now());
17.md():加密函数
select md5(‘aa‘);
八、索引
为什么要使用索引?
一般的应用系统对比数据库的读写比例在10:1左右,而且插入操作和更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重
什么是索引?
索引相当于目录结构,其内部有一定的算法,可以快速的帮我们定位到相应的数据位置
索引都使用在哪里?
1.用于频繁搜索的列
2.用于排序的字段
3.做条件查询的列
4.如果列中仅仅包含几个不同的值不要设置索引,比如性别(男和女)
primary key:主键索引保证数据的唯一性,而且不能为空,唯一标识数据库表中的每条记录
unique:唯一索引,防止数据出现重复
index(key):普通索引,仅仅只是为了提高查询的速度
fulltext:全文索引(不支持中文)
索引的建立
建表的时候创建索引
create table study(
id mediumint not null auto_increment,
sn char(10) not null comment‘学号‘,
name varchar(20) not null comment‘姓名‘,
primary key (id),
unique sn(sn),
index name(name)
)default charset=utf8;
查看创建成功表的结构:show create table study\G
修改表的结构然后创建索引
除了主键索引,其他索引设置的同时可以给起一个‘名称’,名称不设置与该索引字段名称一致
给存在的数据表增加索引
alter table 表名 add primary key(id);
alter table 表名 add unique key [索引名称](字段);
alter table 表名 add key[索引名称](字段);
alter table 表名 add fulltext key[索引名称](字段);
这里的索引名称都是可以不写的,那么默认就是字段的名称
九、视图
视图-view
定义:存储的查询语句,当调用的时候,产生的结果集,视图充当的是虚拟表的角色,可以控制那些字段显示出来,那些字段隐藏掉
视图就是对查询进行封装,当进行多次相同查询,可以避免次序错误或字段不同,也是对长查询进行简化
语法:create [or replace] view 视图的名字 as 查询的语句
建立stuinfo表的临时视图
1.创建视图
create view view_stuinfo as select name ‘姓名‘,age ‘年龄‘,seat ‘座位号‘,sex ‘性别‘ from stuinfo;
select * from view_stuinfo;
2.修改、删除视图
当视图的内容发送变化时,就需要修改视图,本质上就是sql语句发生了变化
修改语法:alter view 视图名 as 查询的语句
比如:alter view view_stuinfo as select name ‘姓名‘,age ‘年龄‘ from stuinfo;
删除语法:drop 视图名称;
drop view view_stuinfo;
3.视图的结构显示
语法:desc 视图名---desc view_stuinfo;
4.视图的优点
1.提高了sql语句的重用性,不用重复读取,拼接数据内容
2.提高了安全性,针对不同的用户,只显示与其相关的数据
3.让数据更加清晰,想要什么样的数据,就创建什么样的视图
十、事务
事务(transaction)
什么是事务?
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所做的所有更改都会被撤销
场景:
一组sql(曾删改)要么都执行,要么都不执行
A有10000元
B有10000元
A向B转账500,是两条更新
update bill set 余额=余额-500 where A;
update bill set 余额=余额+500 where B;
这两条数据必须要么都执行,要么都不执行,如果执行了一半,发送问题,那么执行过的sql要回滚;
事务的优点
1.A(atoomicity)原子性:事务里面的操作,要么全部成功执行,要么全部失败回滚,不可以只执行其中的一部分
2.C(consistency)一致性:一个事务的执行不应该破环数据库的完整性约束
3.I(isolation)隔离性:通常来说,事务之间的行为不应该互相影响
4.D(durability)持久性:事务提交之后,需要将提交的事务持久化到磁盘,即使系统崩溃,提交的数据也不应该丢失
事务的语法
开启事务:start transaction 或begin [work]
sql语句的执行
提交事务commit
回滚事务:rollback
在事务开始与结束之间的这些sql,就在同一个事务中
准备:创建表,并且插入数据
create table info(
id int auto_increment primary key,
name varchar(10),
money decimal(10,2)
);
insert into info values(1,‘张三‘,1000);
insert into info values(2,‘李四‘,1000);
例1:让张三给李四成功转50快
开启事务:start transaction;
让张三少50快,李四多50快
update info set money=money-50 where id=1;
update info set money=money+50 where id=2;
查询sql执行的结果:select * from info;
重新打开一个mysql客户端,查看数据的变化--没有变化
commit,查看数据变化才有
十一、mysql的使用
1.新建表
create table stu(
stuno char(6) not null primary key,
name varchar(20) not null,
sex char(3) not null,
age tinyint not null,
address varchar(20) not null,
seat int,
math int,
chinese int
)default charset=utf8;
2.插入数据
insert into stu values(‘sh1002‘,‘张家辉‘,‘男‘,30,‘山东省‘,2,95,79),
(‘sh1003‘,‘徐志摩‘,‘男‘,23,‘浙江省‘,1,65,89),
(‘sh1004‘,‘张柏芝‘,‘男‘,24,‘安徽省‘,3,89,91),
(‘sh1006‘,‘陈浩南‘,‘男‘,22,‘江西省‘,6,85,null),
(‘sh1005‘,‘潘金莲‘,‘女‘,16,‘浙江省‘,5,null,65),
(‘sh1001‘,‘刘德华‘,‘女‘,61,‘安徽省‘,4,85,79);
3.数据库的基本操作
-
1.where的用法
查询stu表中的女生 select * from stu where sex=‘女‘;
-
2.and、or的用法
小于20岁的女生 select * from stu where sex=‘女‘ and age<20; 找出安徽省和浙江省的学生 select * from stu where address=‘安徽省‘ or address=‘浙江省‘;
-
3.in 和not的用法
找出地址是安徽省和浙江省的学员(in) select * from stu where address in (‘安徽省‘,‘浙江省‘);
-
4.between和not between的用法
找出年龄在20和25之间的学员(包含20和25)相当于>=20 <=25 select * from stu where age between 20 and 25;
-
5.is null 和 is not null的用法
找出参加数学考试的人的名字 select name from stu where math is not null; 找出参加数学考试的人的姓名和性别 select name,sex from stu where math is not null;
-
6.聚合函数的使用
select sum(age) as ‘年龄‘,avg(age) ‘平均年龄‘,max(age) ‘最大年龄‘,min(age)‘最小年龄‘,count(*) ‘总人数‘ from stu;
-
7.通配符的使用
_:匹配一个字符 %:匹配多个字符(包括没有字符) 张% %张% %里
-
8.模糊查询like的用法:主要针对字符串字段的,在一个字符型字段列中检索包含对应字串的
查找出名字以张开头的学员 select * from stu where name like ‘张%‘;
-
9.分组查询--group by:指定分组字段以后,安装字段中的内容的不同进行分组,有多少个不同的值,就分多少个组
将表中的数据按照男女进行分组 select * from stu group by sex;---分组完成之后,默认只显示每一组的第一条数据。 按照年龄进行分组 select age from stu group by age ; 求出男性和女性的各自的平均年龄 select sex,avg(age) from stu group by sex ;
-
10.group_concat()函数:将统一分组的结果,放在一列显示出来
分别显示男生和女生的所有学生名字 select sex,group_concat(name) from stu group by sex;
-
11.查询语句:all:显示所有的记录(默认),distinct:去除重复的查询结果
找出学员来自那些省份 select address from stuinfo;---有重复的省份 select distinct address from stuinfo;--去重
4.多表查询(很重要)
-
1.概况:
多表查询:连接查询--关联查询;当一个表中的数据无法满足查询需求时,就要使用多个表联合查询; 分为:内连接inner join:查询的结果为两个表匹配到的数据 左外连接left join:查询的结果为两个表匹配到的数据加上左表特有的数据,对于右表不存在的数据用null填充 右外连接right join:查询的结果为两个表匹配到的数据加上右特有的数据,对于左不存在的数据用null填充 交叉连接
-
2.创建多张表
新建学生表 drop table if exists student; create table student( studentno mediumint unsigned primary key auto_increment, name varchar(30), sex varchar(10) ); 插入数据 insert into student values (‘1‘,‘王昭君‘,‘女‘), (‘2‘,‘貂蝉‘,‘女‘), (‘3‘,‘吕布‘,‘男‘), (‘4‘,‘呼韩邪单于‘,‘男‘), (‘5‘,‘西施‘,‘女‘), (‘6‘,‘范蠡‘,‘男‘), (‘7‘,‘夫差‘,‘男‘); 新建成绩表 drop table if exists scores; create table scores( id int(10) unsigned primary key auto_increment, coursename varchar(10), studentno tinyint, score tinyint(4) ); 插入数据 insert into scores values (‘1‘,‘china‘,‘1‘,‘90‘), (‘2‘,‘china‘,‘2‘,‘75‘), (‘3‘,‘math‘,‘2‘,‘98‘), (‘4‘,‘english‘,‘1‘,‘80‘), (‘5‘,‘english‘,‘3‘,‘80‘), (‘6‘,‘china‘,‘4‘,‘79‘), (‘7‘,‘english‘,‘5‘,‘96‘), (‘8‘,‘math‘,‘6‘,‘80‘), (‘9‘,‘math‘,‘9‘,‘80‘);
-
3.内连接inner join:查询的结果为两个表匹配到的数据
用法:select 选项 from 表1 inner join 表2 on 表1.关联字段=表2.关联字段;左表右表只有符合条件的才取出来 例子: 1.查询学生信息及学生的成绩 select * from student inner join scores where student.studentno=scores.studentno; 2.查询王昭君的成绩,要求显示姓名、课程号、成绩 select * from student inner join scores on student.studentno=scores.studentno where student.name=‘王昭君‘;
-
4.左外连接left join:右连接与左连接差不多
语法:select 选项 from 表1 left join 表2 on 表1.关联字段=表2.关联字段;左表数据全部取出,右表只要符合条件的,没有的用null 例子: 查询所有学生的成绩,包括没有成绩的学生 select * from student left join scores on student.studentno=scores.studentno;
-
5.多表查询--using():两张表中的字段名是一样的可以简写成using形式
select * from student stu right join scores sc using(studentno);
5.综合练习
-
1.创建两张表
创建两张表 create table stu( stuno char(6) not null primary key, name varchar(20) not null, sex char(3) not null, age tinyint not null, address varchar(20) not null, seat int )default charset=utf8; create table score1( stuno char(6), math int, ch int )default charset=utf8; insert into stu values(‘sh1002‘,‘范彬彬‘,‘女‘,18,‘安徽省‘,3), (‘sh1001‘,‘谢大鸟‘,‘男‘,25,‘湖北省‘,2), (‘sh1003‘,‘沈万三‘,‘男‘,23,‘上海市‘,4), (‘sh1004‘,‘张柏芝‘,‘男‘,22,‘云南省‘,1), (‘sh1006‘,‘白客‘,‘男‘,21,‘安徽省‘,5), (‘sh1005‘,‘如花‘,‘男‘,25,‘江苏省‘,6), (‘sh1007‘,‘黄家驹‘,‘男‘,28,‘江西省‘,7); insert into score1 values(‘sh1002‘,58,48), (‘sh1003‘,96,20), (‘sh1004‘,85,null), (‘sh1005‘,null,84), (‘sh1006‘,60,59);
-
2.综合操作
显示地区及每个地区参加数学考试的人数,并按人数降序排序; select address,count(math) c from stu join score1 using(stuno) group by address order by c desc; 显示有学生参加考试的地区 方法1:查询出参加考试的省份,并且显示对应参加考试的人数 select address,count(math) s from stu left join score1 using(stuno) group by address having s>0;
-
3.子查询:子查询也叫内部查询,包含子查询的语句称为外部查询或主查询;子查询自身可以包含一个或多个子查询,一个查询语句中可以嵌套任意数量的子查询。
例1:查询班级中数学成绩为60的学员姓名,使用链接查询实现 select name from stu left join score1 using(stuno) where math=60; 例2:使用子查询找出数学成绩为60的学生姓名 思路:1.先找出数学成绩为60的人的学号--根据成绩找出学号 select stuno from score1 where math = 60; 2.再根据学号,找出学生姓名--根据学号找出人名 select name from stu where stuno = ‘sh1006‘; 综合上面两条sql语句,得出如下自查询 select name from stu where stuno = (select stuno from score1 where math = 60); in /not in的用法 in 操作符允许我们在where的字句中规定多个值,返回符合条件的数据,not in相反 例子:使用in来找出符合子查询中条件的人的姓名(找出数学成绩大于80的人的名字) select name from stu where stuno in (select stuno from score1 where math>80); 例子:找出数学成绩最好的人的姓名 select name from stu where stuno =(select stuno from score1 order by math desc limit 1);