首页 > 代码库 > MySQL数据库知识复习

MySQL数据库知识复习

 

  1. 什么是数据库?

所谓数据库,就是存储数据的仓库。数据有多种形式:文字,图片,电影

 

  1. 什么是数据库系统?

管理数据库的软件就被称为数据库系统。数据库系统一般分为两个部分:数据库(DB),数据库管理系统(DBMS

  1. 数据库在Web程序开发中重要地位

动态网站基本上都是要对数据进行操作。例如新闻网站:当我们浏览新闻的时候,网页的内容会经常发生变化,框架是不会变的。这就是一个典型的动态网页。动态网页的数据就是存储在数据库里面。

PHP连接数据库执行过程

 

 

 

 

 

  1. 为什么选择MySQLPHP进行合作

理由很简单,全都免费,中小企业的福音

 

  1. 结构化查询语言

SQL:结构化查询语言

SQL可以分为4个部分:DMLDDLDQLDCL

DML:数据操作语言,用于操作数据库中的数据,例如insertupdatedelete

DDL:数据定义语言,用于定义和管理数据对象,createdropalter

DQL:数据查询语言,用于查询数据的,select

DCL:数据控制语言,主要用于权限上面的修改,GRANTcommitrollback

 

  1. 数据库相关操作

既然要操作数据库,那么首先需要连接数据库

语法:mysql  -h 服务器主机地址 –u 用户名 –p 用户密码

-h:指定所要连接的数据库服务器的位置,可以是IP地址,也可以是服务器域名

-u:数据库服务器所使用的用户名  

-p:连接数据库服务器所使用的密码

 

  1. 查看当前数据库系统里面的所有数据库

Show  databases

 

  1. 创建新用户并授权

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=’用户名’

示例:

 

Dropdelete的区别

Drop就是完全删除,包括权限表里面对应的权限信息和其他相关信息

Delete只是将该用户删除,并没有删除权限表相关的数据。后期如果重新建立一个同名的用户的话,权限就会继承之前的权限

 

  1. 数据库相关操作

创建数据库

语法: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 新表名

 

方法2rename table 旧表名 to 新表名

 

 

给数据表添加列

语法:alter table 表名 add 新列名 数据类型

 

 

如果想要新添加的字段在所有字段的最开头,后面再添加一个first关键字即可

 

 

修改某一个字段位于另外一个字段后面

语法:alter table 表名

  Modify 字段名1 数据类型 after 字段名2

 

 

删除某列

Alter table 表名

Drop 列名

 

 

修改字段的数据类型

语法:alter table 表名

 Change  原字段名  新字段名  新数据类型

 

 

删除表

Drop table 表名

 

 

 

MySQL里面的数据类型

MySQL里面的数据类型大致可以分为5类:整数数据类型,浮点型数据类型,字符串数据类型,日期时间数据类型,二进制数据类型

 

整数数据类型

整数数据类型大致又分为5类:TINYINT1),SMALLINT2),MEDIUMINT3),INT4),BIGINT8

 

浮点型数据类型:分为3种,float4),double8),decimal17

 

字符串数据类型:分为6种,charvarcharTINYTEXTTEXTMEDIUMTEXTLONGTEXT

charvarcharchar是定长,varchar是变长

char5abc  实际占用内存还是5个字节

varchar5abc  根据数据的长度实际占用的长度会改变,这里因为abc只有3个字节,所以只占用3个字节

这两个不存在谁好谁坏,char是省时间,varchar省空间

 

时间日期数据类型:分为5种,DATETIMEYEARDATETIMETIMESTAMP

时间戳:所谓时间戳,就是从197011000秒到现在的总秒数

 

 

数据的完整性

要实现数据的完整性,方法有4种:实体完整性,域完整性,引用完整性,自定义完整

 

实体完整性

所谓实体,就是一条完整的数据,换句话说,就是一行信息

姓名

年龄

分数

性别

张三

18

100

李四

20

99

保证实体完整性:主键约束和唯一约束

在创建表的时候,在字段后面添加primary key关键字

例如:创建表时id作为主键示例:

 

主键事实上就等于非空+唯一

指定某个字段为主键的方法二:

 

 

唯一约束:unique指定某一字段的值必须是唯一的

 

设置了唯一约束以后,字段的值就必须是唯一值

 

证明:主键=非空加唯一

 

 

域完整性:数据类型,非空约束,默认约束,检查约束(mysql不支持检查约束)

所谓域,就是指一列

数据类型:我们在创建表的时候指定数据类型,一定程度就是实现了域完整性(列完整性)例如age列是填写年龄的,我们将其数据类型指定为int后该列的数据类型就只能是int型,从而保证了域完整性

 

非空约束:not null

 

 

默认约束:给某一个字段默认值

Default

 

 

引用完整性

引用完整性是通过外键约束来实现

一个表的某一个字段是引用的另外一张表的主键,该字段就被称之为外键

示例:有两张表:班级班,一个是学生表

班级表:有3个班,分别是pg37pg39youxiban

 

学生表:

 

 

 

自定义完整性

就是由用户自己指定约束条件。

 

设置字段自动增加  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 表名

 

 

Deletetruncate区别:

  1. Truncate是直接销毁表,然后重新建立一个一模一样的表,delete则是一条一条的进行删除,如果是要删除全表的话,truncate的效率要比delete要高
  2. 虽然truncate效率比delete高,但是没有delete灵活,因为delete可以指定具体删除某一条数据
  3. Truncate一般是被认为DDL语句,delete是被分为DML语句
  4. 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

 

 

 

联表查询

  1. 什么是联表查询?

所谓联表查询,就是将多个表横向连接起来,进行查询。相比子查询,要更加容易理解。

 

  1. 外键

所谓外键,就是指一个字段去引用另外一张表的主键字段

外键约束:所谓外键约束,就是因为系统并不知道两张表之间的关系,所以我们添加外键约束来让系统知道两张表是存在引用关系

 

删除外键

语法:alter  table  表名(表名是有外键的那一张表)

  Drop foreign key 外键名

 

  1. 表与表之间的关系

表与表之间的关系:一对一,一对多,多对多

一对一:人与身份证之间的关系

一对多:比如学生和班级之间的关系就是一对多,一个学生只可能属于一个班级,但是一个班级可以对应多个学生

多对多:例如菜市场,一个商家可以对应多个买主,一个买主也可以去多个商家买菜

 

  1. 联表查询

联表查询可以分为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数据库知识复习