首页 > 代码库 > MySQL数据库知识复习
MySQL数据库知识复习
- 什么是数据库?
所谓数据库,就是存储数据的仓库。数据有多种形式:文字,图片,电影
- 什么是数据库系统?
管理数据库的软件就被称为数据库系统。数据库系统一般分为两个部分:数据库(DB),数据库管理系统(DBMS)
- 数据库在Web程序开发中重要地位
动态网站基本上都是要对数据进行操作。例如新闻网站:当我们浏览新闻的时候,网页的内容会经常发生变化,框架是不会变的。这就是一个典型的动态网页。动态网页的数据就是存储在数据库里面。
PHP连接数据库执行过程
- 为什么选择MySQL和PHP进行合作
理由很简单,全都免费,中小企业的福音
- 结构化查询语言
SQL:结构化查询语言
SQL可以分为4个部分:DML,DDL,DQL,DCL
DML:数据操作语言,用于操作数据库中的数据,例如insert,update,delete
DDL:数据定义语言,用于定义和管理数据对象,create,drop,alter
DQL:数据查询语言,用于查询数据的,select
DCL:数据控制语言,主要用于权限上面的修改,GRANT,commit,rollback
- 数据库相关操作
既然要操作数据库,那么首先需要连接数据库
语法:mysql -h 服务器主机地址 –u 用户名 –p 用户密码
-h:指定所要连接的数据库服务器的位置,可以是IP地址,也可以是服务器域名
-u:数据库服务器所使用的用户名
-p:连接数据库服务器所使用的密码
- 查看当前数据库系统里面的所有数据库
Show databases
- 创建新用户并授权
Mysql里面默认的用户是root,我们可以通过grant语句来创建新用户并且授权
语法:
Grant 权限 on 数据库.数据表 to 用户名@登录主机 identified by “密码”
示例:创建一个叫做xiejie的用户,权限是可以操作所有的数据库的所有表,密码是123
all 代表所有权限
*.* 代表所有数据库的所有数据库表
查看mysql数据库里面的所有用户
语法:
Select distinct concat(‘user:’ ’’,user,’’’@’’’,host,’’’;’)as query from mysql.user
查看具体某一个用户的权限
语法:
Show grants for ‘用户名’@’主机名’;
删除用户
方法一:
语法:drop user ‘用户名’@’主机名’
如下:
方法二:
语法:
Delete from mysql.user where host=’主机名’ and user=’用户名’
示例:
Drop和delete的区别
Drop就是完全删除,包括权限表里面对应的权限信息和其他相关信息
Delete只是将该用户删除,并没有删除权限表相关的数据。后期如果重新建立一个同名的用户的话,权限就会继承之前的权限
- 数据库相关操作
创建数据库
语法:create database 数据库名;
查看字符集
语法:show variables like ‘char%’;
校对规则:所谓校对规则,就是排序的方式,比较的规则。简单来讲就是按照什么样的规则进行排序
查看mysql里面的校对规则:
Show collation;
Mysql中校对规则部分截图
_ci:对大小写不敏感
_cs:对大小写敏感
_bin:基于二进制编码进行比较
所以我们创建数据库的时候可以指定字符集和校对规则
语法:
Create database 数据库名 character set 字符集 collate 校对规则
如果要使用数据库,需要先指定哪一个数据库
Use 数据库名
删除数据库
语法:drop database 数据库名
修改已经创建好了的数据库的字符集和校对规则
语法:
Alter database 数据库名
[character set 字符集 collate 校对规则];
查看当前使用的数据库
Select database()
查看数据库
方法有2种:
显示所有的数据库
Show databases
显示数据库创建语句
Show create database 数据库名
我们可以在后面添加一个\G,使其格式化输出,方便我们查看
数据表相关
建立数据表
语法:
Create table 表名(字段名1 数据类型,字段名2 数据类型,字段名2 数据类型…);
创建数据表的时候也可以指定表的字符集和校对规则
查看数据表:3种方法
方法1:
Describe 表名
有一个简写:desc就是Describe的简写
查看所有数据表
Show tables
查看建表语句
Show create table 表名\G
加了\G的情况
数据表相关操作
修改表名
Alter table 原表名 rename 新表名
方法2:rename table 旧表名 to 新表名
给数据表添加列
语法:alter table 表名 add 新列名 数据类型
如果想要新添加的字段在所有字段的最开头,后面再添加一个first关键字即可
修改某一个字段位于另外一个字段后面
语法:alter table 表名
Modify 字段名1 数据类型 after 字段名2
删除某列
Alter table 表名
Drop 列名
修改字段的数据类型
语法:alter table 表名
Change 原字段名 新字段名 新数据类型
删除表
Drop table 表名
MySQL里面的数据类型
MySQL里面的数据类型大致可以分为5类:整数数据类型,浮点型数据类型,字符串数据类型,日期时间数据类型,二进制数据类型
整数数据类型
整数数据类型大致又分为5类:TINYINT(1),SMALLINT(2),MEDIUMINT(3),INT(4),BIGINT(8)
浮点型数据类型:分为3种,float(4),double(8),decimal(17)
字符串数据类型:分为6种,char,varchar,TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT
char和varchar:char是定长,varchar是变长
char(5)abc 实际占用内存还是5个字节
varchar(5)abc 根据数据的长度实际占用的长度会改变,这里因为abc只有3个字节,所以只占用3个字节
这两个不存在谁好谁坏,char是省时间,varchar省空间
时间日期数据类型:分为5种,DATE,TIME,YEAR,DATETIME,TIMESTAMP
时间戳:所谓时间戳,就是从1970年1月1日0时0分0秒到现在的总秒数
数据的完整性
要实现数据的完整性,方法有4种:实体完整性,域完整性,引用完整性,自定义完整
实体完整性
所谓实体,就是一条完整的数据,换句话说,就是一行信息
姓名 |
年龄 |
分数 |
性别 |
张三 |
18 |
100 |
男 |
李四 |
20 |
99 |
女 |
保证实体完整性:主键约束和唯一约束
在创建表的时候,在字段后面添加primary key关键字
例如:创建表时id作为主键示例:
主键事实上就等于非空+唯一
指定某个字段为主键的方法二:
唯一约束:unique指定某一字段的值必须是唯一的
设置了唯一约束以后,字段的值就必须是唯一值
证明:主键=非空加唯一
域完整性:数据类型,非空约束,默认约束,检查约束(mysql不支持检查约束)
所谓域,就是指一列
数据类型:我们在创建表的时候指定数据类型,一定程度就是实现了域完整性(列完整性)例如age列是填写年龄的,我们将其数据类型指定为int后该列的数据类型就只能是int型,从而保证了域完整性
非空约束:not null
默认约束:给某一个字段默认值
Default
引用完整性
引用完整性是通过外键约束来实现
一个表的某一个字段是引用的另外一张表的主键,该字段就被称之为外键
示例:有两张表:班级班,一个是学生表
班级表:有3个班,分别是pg37,pg39和youxiban
学生表:
自定义完整性
就是由用户自己指定约束条件。
设置字段自动增加 auto_increment
设置了自动增长后字段可以自动增长
注意:设置自动增长时,该字段需要是主键或者设置了非空约束
存储引擎
所谓存储引擎,实际上就是指存储表的类型是什么
查看mysql里面的存储引擎
Show engines;
MyISAM:之前mysql主打的是MyISAM存储引擎
InnoDB:现在mysql主打的是InnoDB
使用DML语句更改数据
DML语句无外乎就是3个,增加,删除,修改
添加语句
Insert into 表名(要添加信息的字段名) values (对应字段的值)
如果是给所有字段添加数据
Insert into 表名 values (对应字段的值)
Insert into 表名
Set 字段名1=值1,字段名2=值2…
更新数据
Update 表名
Set 字段名1=值1,字段名2=值2…
需要注意的是:更新数据一定要和where进行配合使用
删除数据
方法有2种:
通过delete关键字来删除数据
语法:delete from 表名
Where 条件表达式
注意点:删除某条数据以后,再重新添加新的数据,新的数据的主键部分的编号不做改变
删除数据,后面的数据的主键编号也不会改变
删除全部数据
Delete from 表名
Truncate 表名
Delete和truncate区别:
- Truncate是直接销毁表,然后重新建立一个一模一样的表,delete则是一条一条的进行删除,如果是要删除全表的话,truncate的效率要比delete要高
- 虽然truncate效率比delete高,但是没有delete灵活,因为delete可以指定具体删除某一条数据
- Truncate一般是被认为DDL语句,delete是被分为DML语句
- Truncate删除所有数据后再重新添加数据,自动增长的字段重新从1开始增长,但是delete的话从删除前的最大值+1开始
Truncate的情况:
Delete的情况
表的复制
方法一:
Create table 新表名 like 旧表名
注意:该方法只会复制表的结构,内容是不会被拷贝过去的
语法2:
Create table 新表名 as
(select * from 旧表名)
注意:该方法虽然可以复制内容,但是表结构不能得到完全的复制,自动增长和主键会丢失
语法3:
Create table 新表名 like 旧表名;
Insert into 新表名 select * from 旧表名;
DQL语句
DQL语句其实就是查询语句,就只有一个select
Select * from 表名
Select 字段名1,字段名2… from 表名
按条件查询
用where关键字对信息进行过滤
= |
等于 |
> |
大于 |
!= |
不等于 |
< |
小于 |
>= |
大于等于 |
<> |
也是表示不等于 |
<= |
小于等于 |
|
|
例如:查询年龄大于20岁的人的姓名
In:判断一个字段的值是否在一个集合里面
可以和not关键进行配合,表示不在某一个集合
Between..and:表示是一个范围
例如:要找18-20之间的人
可以和not配合,表示不再某一个范围
空值查询
Is null 代表空值查询
查询非空
Distinct:排除重复值
示例:找出学生有哪些年龄
注意:distinct只能放在查询字段的最前面,不能放在后面,放在后面会报错
模糊查询
模糊查询使用like关键字配合%和_
查询名字里面含有z字母的人
下划线代表的意思就是一个_就匹配一个字符
需要注意空格也要匹配一个字符,所以也需要一个_
如果要查询的内容里面也包含了%或者下划线,那么需要对其进行转义\
And
两个条件都必须满足
Or:满足一个条件就可以
聚合函数和分组
聚合函数如下表
函数名 |
作用 |
函数名 |
作用 |
Count() |
返回某列的行数 |
Max() |
最大值 |
Sum() |
返回某列的和 |
Min() |
最小值 |
Avg() |
返回某列的平均值 |
|
|
主要注意一个平均数的计算
如果是使用系统提供的avg()函数,则有null值得字段不会被计算进去,根据实际业务需求,如果想要将null计算到平均数里面,则需要自己定义。
排序
排序的关键字是order by
升序 ASC 降序DESC
升序的关键字ASC是可以省略的
降序desc
分组:使用的关键字为group by
如下:
还有一个和group by关键字一起配合的使用的是having
Having:用于过滤
Where:用于过滤
Where是在分组前进行过滤,having是在分组后进行过滤
先用where进行id过滤,然后进行分组,最后再过滤出分组后的成绩
限制查询结果
Limit:可以指定返回多少行数据
语法:limit a,b
A:代表开始的小标
B:代表总共显示多少条
例如:1-100 5-15 limit 4,11
为表取别名
关键字as
联表查询
- 什么是联表查询?
所谓联表查询,就是将多个表横向连接起来,进行查询。相比子查询,要更加容易理解。
- 外键
所谓外键,就是指一个字段去引用另外一张表的主键字段
外键约束:所谓外键约束,就是因为系统并不知道两张表之间的关系,所以我们添加外键约束来让系统知道两张表是存在引用关系
删除外键
语法:alter table 表名(表名是有外键的那一张表)
Drop foreign key 外键名
- 表与表之间的关系
表与表之间的关系:一对一,一对多,多对多
一对一:人与身份证之间的关系
一对多:比如学生和班级之间的关系就是一对多,一个学生只可能属于一个班级,但是一个班级可以对应多个学生
多对多:例如菜市场,一个商家可以对应多个买主,一个买主也可以去多个商家买菜
- 联表查询
联表查询可以分为3类:内连接,外链接,以及自连接
内连接:inner join
在mysql里面,如果直接执行inner join但是不给条件的话,会得出笛卡尔乘积。
这里有两张表
学生表 班级表
接下来我们来执行不给条件的内连接,会得到笛卡尔乘积
在mysql里面,如果内连接不给条件,那么可以得到笛卡尔乘积,这是mysql的特殊处理机制。在其他数据库管理系统里面要得到笛卡尔乘积,使用的关键字为cross join。
在mysql里面,使用cross join也能够正常的得到笛卡尔乘积
语法:(内连接中的inner关键字可以省略)
Select 字段 from 表1 join 表2 on 表1.字段=表2.字段
除了on以外,还有where关键字是可以用的
虽然两个关键字都能够得出相同的效果,但是on的效率要高于where
On:在内联之前就进行过滤
Where:产生了笛卡尔乘积以后进行过滤
外连接:
外连接分为3种:左外连接,右外连接,全外连接(mysql不支持全外连接)
使用union可以模拟出全外连接
左外连接:显示左表的全部数据
如下:修改学生表的数据如下,添加niuer同学,班级编号为4,但是在班级表里面没有编号为4的班级
接下来进行左外连接,把左边表的数据全部显示出来
右外连接示例
首先给班级表添加新的数据,如下:
接下来进行右外连接,所谓右外连接,就是将右表的数据全部显示出来,不管左表有没有,如果左表没有,显示为null
关于左表和右表的判断,非常简单,join左边的就是左表,join右边的就是右表
全外连接:在标准的sql,全外连接的关键字为full join
左表右表的数据都显示出来,虽然mysql不支持全外连接,但是可以使用union模拟全外连接
自连接:所谓自连接,就是自己连接自己,自连接的表来源源于同一张表,自连接其实就是内联或者外联的一种特殊情况
例如:有如下职员表
EmpID:员工编号 empName:员工姓名 leaderID:领导编号
查询员工的姓名和所属领导的姓名
复合条件连接查询
所谓复合条件连接查询,就是指在连接查询的基础添加一些过滤条件,如排序,limit
MySQL数据库知识复习