打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
听说这是史上最简单的 MySQL 教程(内有圣诞节福利)

今晚是圣诞节,大家收到礼物或送出吗?反正小编是没有的~!

数据库

1 定义

数据库,可以简单的解释为:高效的存储和处理数据的介质(主要分为磁盘和内存两种)。

关系型数据库

1 定义

关系型数据库,是一种建立在关系模型(数学模型)上的数据库。

至于关系模型,则是一种所谓建立在关系上的模型,其包含三个方面,分别为:

  • 数据结构:数据存储的形式,二维表(行和列);

  • 操作指令集合:所有的 SQL 语句;

  • 完整性约束:表内数据约束(字段与字段)和表与表之间的约束(外键)。小编推荐大家加一下这个群:103456743这个群里好几千人了!大家遇到啥问题都会在里面交流!而且免费分享零基础入门料资料web开发 爬虫资料一整套!是个非常好的学习交流地方!也有程序员大神给大家热心解答各种问题!很快满员了。欲进从速哦!各种PDF等你来下载!全部都是免费的哦!只为帮助大家快速入门,所以小编在群里等你们过来一起交流学习呢!

4 SQL

SQL:Structured Query Language,结构化查询语言(数据以查询为主,99% 都是在进行查询操作)。

SQL 主要分为三种:

  • DDL:Data Definition Language,数据定义语言,用来维护存储数据的结构(数据库、表),代表指令为create、drop和alter等。

  • DML:Data Manipulation Language,数据操作语言,用来对数据进行操作(表中的内容)代表指令为insert、delete和update等,不过在 DML 内部又单独进行了一个分类,即 DQL(Data Query Language),数据查询语言,代表指令为select.

  • DCL:Data Control Language,数据控制语言,主要是负责(用户)权限管理,代表指令为grant和revoke等。

SQL 是关系型数据库的操作指令,是一种约束,但不强制,类似于 W3C,因此这意味着:不同的数据库产品(如 Oracle 和 MySQL)内部可能会有一些细微的区别。

服务器对象

由于没办法完全了解服务器内部的结构,因此只能粗略的分析数据库服务器的内部结构。

一般来说,将 MySQL 数据库服务器的内部对象分为四层,分别为:数据管理系统(DBMS)–> 数据库(DB)–> 表(Table)–> 字段(Filed).

2 查询数据库

查看全部 –> 基本语法:show databases;

查看部分(模糊查询)–> 基本语法:show databases like 'pattern';

其中,pattern是匹配模式,有两种,分别为:

  • %:表示匹配多个字符;

  • _:表示匹配单个字符。

此外,在匹配含有下划线_的数据库名称的时候,需要在下划线前面加上反斜线\_进行转义操作。

示例:show databases like 'TBL%';表示匹配所有TBL开头的数据库。

查看数据库的创建语句 –> 基本语法:show create database + 数据库名称;

在这里,查看的结果有可能与咱们书写的 SQL 语句不同,这是因为数据库在执行 SQL 语句之前会优化 SQL,系统保存的是优化后的结果。

3 更新数据库

在这里,需要注意:数据库的名字不可以修改。

数据库的修改仅限库选项,即字符集和校对集(校对集依赖字符集)。

基本语法:alter database + 数据库名称 + [库选项];

  • charset/character set[=] 字符集;

  • collate[=] 校对集;

示例:alter database TBL_ERROR_CODE charset gbk;表示修改此数据库的字符集为gbk.

4 删除数据库

基本语法:drop database + 数据库名称;

在这里,需要注意:在删除数据库之前,应该先进行备份操作,因为删除为不可逆操作,所以不要随意删除数据库。

表操作

1 新增表

基本语法:

create table [if not exists] + 表名( 字段名称 数据类型, …… 字段名称 数据类型 /* 最后后一行,不需要加逗号 */)[表选项];

其中,if not exists表示

如果表名不存在,就执行创建代码;如果表名存在,则不执行创建代码。

表选项则是用来控制表的表现形式的,共有三种,分别为:

  • 字符集设定:charset/ character set+ 具体字符集,用来表示数据存储的编码格式,常用的字符集包括GBK和UTF8等。

  • 校对集设定:collate+ 具体校对集,表示数据比较的规则,其依赖字符集。

  • 存储引擎:engine+具体存储引擎,默认为InnoDB,常用的还有MyISAM.

由于任何表都归属于某个数据库,因此在创建表的时候,都必须先指定具体的数据库。在这里,指定数据库的方式有两种,分别为:

  • 第 1 种:显式的指定表所属的数据库,示例

create table if not exists test.student( name varchar(10), age int, /* 整型不需要指定具体的长度 */ grade varchar(10) /* 最后后一行,不需要加逗号 */)charset utf8;

  • 第 2 种:隐式的指定表所属的数据库,示例

use test; /* use + 数据库名称,表示切换到指定的数据库,这句命令其实不加分号也可以,但不建议这么做 */create table if not exists student( name varchar(10), age int, /* 整型不需要指定具体的长度 */ grade varchar(10) /* 最后后一行,不需要加逗号 */)charset utf8;

2 查询表

查看全部 –> 基本语法:show tables;

查看部分(模糊查询)–> 基本语法:show tables like 'pattern';

其中,pattern是匹配模式,有两种,分别为:

  • %:表示匹配多个字符;

  • _:表示匹配单个字符。

此外,在匹配含有下划线_的表名的时候,需要在下划线前面加上反斜线\_进行转义操作。

示例:show tables like '%t';表示匹配所有以t结尾的表。

查看表的创建语句 –> 基本语法:show create table + 表名;

在这里,咱们也可以用\g和\G代替上述语句中的;分号,其中\g等价于分号,\G则在等价于分号的同时,将查的表结构旋转90度,变成纵向结构。

查看表中的字段信息 –> 基本语法:desc/describe/show columns from + 表名;

3 更新表

在这里,需要注意:表的修改,分为修改表本身和修改表中的字段。

第 1 类:修改表本身

  • 修改表名,基本语法:rename table 旧表名 to 新表名;

  • 修改表选项,基本语法:alter table + 表名 + 表选项[=] + 值;

第 2 类:修改表中的字段,新增、修改、重命名和删除

  • 新增字段,基本语法:alter table + 表名 + add + [column] + 字段名 + 数据类型 + [列属性][位置];

    其中,位置表示此字段存储的位置,分为first(第一个位置)和after + 字段名(指定的字段后,默认为最后一个位置).

    示例:alter table student add column id int first;

  • 修改字段,基本语法:alter table + 表名 + modify + 字段名 + 数据类型 + [列属性][位置];

    其中,位置表示此字段存储的位置,分为first(第一个位置)和after + 字段名(指定的字段后,默认为最后一个位置).

    示例:alter table student modify name char(10) after id;

4 删除表

基本语法:

/** 可以一次删除多张表 */drop table + 表1, 表2 ... ;

在这里,需要注意:此删除为不可逆操作,希望大家谨慎使用。

数据操作

1 新增数据

对于数据的新增操作,有两种方法。

第 1 种:给全表字段插入数据,不需要指定字段列表,但要求数据的值出现的顺序必须与表中的字段出现的顺序一致,并且凡是非数值数据,都需要用引号(建议使用单引号)括起来。

基本语法:insert into + 表名 + values(值列表)[,(值列表)];

示例:insert into test valus('charies',18,'3.1');

第 2 种:给部分字段插入数据,需要选定字段列表,字段列表中字段出现的顺序与表中字段的顺序无关,但值列表中字段值的顺序必须与字段列表中的顺序保持一致。

基本语法:insert into + 表名(字段列表) + values(值列表)[,(值列表)];

示例:insert into test(age,name) valus(18,'guo');

2 查询数据

查看全部 –> 基本语法:select * from + 表名 + [where 条件];

示例:select * from test;

查看部分 –> 基本语法:select + 字段名称[,字段名称] + from + 表名 + [where 条件];

示例:select name,age,grade from test where age = '18';

3 更新数据

基本语法:update + 表名 + set + 字段 = 值 + [where 条件];

示例:update test set age = 20 where name = 'guo';

在这里,建议尽量加上where条件,否则的话,操作的就是全表数据。

此外,判断更新操作是否成功,并不是看 SQL 语句是否执行成功,而是看是否有记录受到影响,即affected的数量大于1时,才是真正的更新成功。

4 删除数据

基本语法:drop from + 表名 + [where 条件];

示例:drop from test where grade = '3.1';

在这里,需要注意:此删除为不可逆操作,希望大家谨慎使用。

中文数据问题

中文数据问题的本质就是字符集的问题。

由于计算机仅识别二进制数据,而且人类则更倾向于识别字符(符号),因此就需要一个二进制与字符的对应关系,也就是字符集。

在咱们通过 MySQL 数据库的客户端向服务器插入中文数据的时候,有可能失败,原因则可能是客户端和服务器的字符集设置不同导致的,例如:

  • 客户端的字符集为gbk,则一个中文字符,对应两个字节;

  • 服务器的字符集为utf8,则一个中文字符,对应三个字节。

这样显然会在编码转换的过程中出现问题,从而导致插入中文数据失败。

由于所有的数据库服务器表现的一些特性都是通过服务器端的变量来保持的,因此系统会先读取自己的变量,看看具体的表现形式。这样的话,咱们就可以通过以下语句查看服务器到底识别哪些字符集:

-- 查看服务器识别的全部字符集show character set;

通过以上查询,咱们会发现:服务器是万能的,其支持所有字符集。

既然服务器支持这么多字符集,总会有一种是服务器默认的和客户端打交道的字符集。因此,咱们可以通过以下语句查看服务器默认的对外处理的字符集:

-- 查看服务器默认的对外处理的字符集show variables like 'character_set%';

  • 标注1:服务器默认的客户端传来的数据字符集为utf8;

  • 标注2:连接层字符集为utf8;

  • 标注3:当前数据库的字符集为utf8;

  • 标注4:服务器默认的对外处理的字符集utf8.

通过以上查询,咱们会发现:服务器默认的对外处理的字符集是utf8.

那么反过来,咱们在通过客户端的属性查看客户端支持的字符集:

显然,咱们已经找到了问题的根源,确实是:客户端支持的字符集为gbk,而服务器默认的对外处理的字符集为utf8,因此产生矛盾。

既然问题已经找到了,那么解决方案就是:修改服务器默认接收的字符集为gbk.

-- 修改服务器默认接收的字符集为 GBK(不区分大小写)set character_set_client = gbk;

这样的话,咱们再插入中文数据的时候,就会插入成功啦!But,在咱们查看数据的时候,又发现了一个问题,就是之前咱们插入的中文数据显示乱码啦!不过这也正常,因为查询的时候,数据的来源是服务器(utf8),解析数据的是客户端,而客户端仅识别gbk格式的数据,显示乱码也就在意料之中啦!

因此,解决方案就是:修改服务器给客户端的数据字符集为gbk.

-- 修改服务器给客户端的数据字符集为 GBK(不区分大小写)set character_set_results = gbk;

如上图所示,向服务器插入中文数据的问题已经解决啦!

此外,咱们之前使用的 SQL 语句:

-- 修改的只是会话级别,即当前客户端当次连接有效,关闭后失效set 变量 = 值;

这样的话,每当咱们重启客户端的时候,都要依次重新进行设置,比较麻烦,因此咱们可以使用快捷的设置方式,即:

set names 字符集;

例如,

/*** 恒等于 set character_set_client = gbk;* 恒等于 set character_set_results = gbk;* 恒等于 set character_set_connection = gbk;*/set names gbk;

表示上述一条语句,将同时改变三个变量的值。其中,connection为连接层,是字符集转换的中间者,如果其和client和results的字符集一致,则效率更高,不一致也没有关系。

校对集问题

校对集,其实就是数据的比较方式。

校对集,共有三种,分别为:

  • _bin:binary,二进制比较,区分大小写;

  • _cs:case sensitive,大小写敏感,区分大小写;

  • _ci:case insensitive,大小写不敏感,不区分大小写。

查看(全部)校对集 –> 基本语法:show collation;

如上图所示,MySQL 数据库支持百多种校对集。

接下来,咱们在一起看看校对集的应用,因为只有当数据进行比较的时候,校对集才会生效。在这里,咱们用utf8的_bin和_ci两种校对集进行比较:

-- 创建两张使用不同校对集的表create table my_collate_bin( name char(10))charset utf8 collate utf8_bin;create table my_collate_ci( name char(10))charset utf8 collate utf8_general_ci;

如上图所示,咱们创建了两张表,分别为my_collate_bin和my_collate_ci,其校对集分别为_bin和_ci. 然后,分别向这两张表中添加数据:

-- 向表中添加数据insert into my_collate_bin values ('a'),('A'),('B'),('b');insert into my_collate_ci values ('a'),('A'),('B'),('b');

再分别查看两张表中的数据:

-- 查看表中的数据select * from my_collate_bin;select * from my_collate_ci;

下面,咱们根据表中的某个字段(在这里my_collate_bin和my_collate_ci都仅有一个字段)进行排序,其基本语法为:

order by + 字段名 + [asc/desc];

其中,asc表示升序,desc表示降序,默认为升序。执行如下 SQL 语句:

-- 排序比较select * from my_collate_bin order by name;select * from my_collate_ci order by name;

如上图所示,显然校对集生效啦!

此外,咱们需要特别注意的是: 校对集必须在没有数据之前声明好,如果有了数据之后,再进行校对集的修改,则修改无效。

如有侵权请联系小编删除哦!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
熬夜肝了 | 值得收藏!一篇数据库规范,你应该用得上
使用SQL语句操作MYSQL字符编码
关于MySQL如何修改character
MySQL+PHP乱码原理与解决 - 51CTO.COM
修改MYSQL数据库,数据表,字段的编码(解决JSP乱码)
升级迁移:利用DMU修改数据库字符集
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服