mysql简介
一、概述:
Mysql数据库是一种c/s结构的软件,客户端/服务端,若想访问服务器必须通过(服务器已至运行,客户端在需要使用的时候运行)。
二、交互方式
1、客户端连接认证:连接服务器,认证身份:mysql.exe
2、发送sql指令
3、服务器接收sql指令,处理sql指令,返回操作结果
4、客户端接收结果:显示结果
5、断开连接(释放资源:服务器并发限制)
三、Mysql服务器对象
没有办法完全了解服务器内部的内容:只能粗略的去分析数据库服务器的内部结构,将Mysql服务器的内部对象丰城了四层:系统(DBMS)-》数据库(DB)-》数据表(table)-》字段(field)
四、SQL基本操作
1、基本操作CRUD
将SQL的基本操作根据操作对象进性分类,我们可以将之分为三类:库操作,表操作(字段操作),数据操作。
五、库操作
对数据库的增删改查
1、新增数据库
基本语法:Create database 数据库名字[库选项];
-> 什么叫做库选项,用来约束数据库,分为两个选项
1)字符集设定:charset/characterset集体字符集(数据存储的编码格式),常用字符集:GBK,uft8
2)校对字符集:collate 具体校对集(数据比较的规则)
* 其中数据库名字不能使用关键字和保留字
*如果要使用中文名字的数据库的时候,解决方案就是告诉服务器当前中文的字体是什么.
*sql语句报错只会告诉用户大致的错误位置,不会说明错误的原因,这算是一种警告模式。
*如果非要使用关键字数据库,那么我们必须使用反引号(esc键下面的键在英文状态下输出)
*当我们创建数据库的sql语句执行后发生了什么?
1)在数据库系统中,创建对应名字的数据库,增加了响应的数据库信息
2)会在保存数据库的面Data目录下创建一个对应的数据库命名字的文件夹
2、查看数据库
1)查看所有数据库: show databases;
2 ) show databases information_ ;时我们需要注意,下划线可以替代一个字符,而百分号可以替代一个或者多个字符。这种方式被我们称之为模糊查询。斜杠或者反斜杠被查询时需要被转义。
3)查看数据库的创建语句:showdatabase 数据库名字;
在这个时候我们可以看到,显示出来的sql语句跟我们当初使用的语句是不一样的,这说明了数据库在执行sql语句之前回优化我们的sql;系统保存的结果是优化后的结果,所以当我们查看我们的语句时,会显示优化后的结果。
3、更新数据库
1)一般我们不能更改数据库的名字,因为这会造成后期代码大量的维护成本。
2)数据库的修改 仅限于库选项:字符集和校对集(字符集依赖校对集),所以我们一般很少去修改校对集。
Alter database 数据库名字[库选项];
Charset character set[=]字符集
Clolate 校对集
4、删除数据库
所有数据库中:删除是最简单的
Drop database 数据库名字;
当删除数据库与执行后发生了什么
1) 在数据库内部看不到对应的数据。
2) 在对应的数据库存储文件夹内,数据库对应名字的数据库也被删除(级联删除)。
3) 注意:数据库的删除可不是闹着玩的。不要随意删除,应该先进行备份后操作,(删除是不可逆的)。
六、表操作
表的操作与字段是密不可分的
1、 新增数据表:
create table[if not exists] 表名(
字段名字 数据类型,
字段名字 数据类型
)[表选项]; 最后一个字段是不需要字段的
If not exists : 如果表名不存在,那么就创建,否则不执行创建代码:检查功能。
表选项:控制表的表现
è 字符集:charset /character set 具体字符集; 保证表中存储数据的字符集
è 校对集:collate 具体校对集
è 存储引擎:engine 具体的存储引擎(innodb和 myisam)
任何一个表的设计都必须指定数据库:
l 方案一:为表指定数据库 数据库的.表名
l 方案二:隐式的指定数据表:先进入到数据库环境,然后再来创建表,这样的话,表就自动归属到某个指定的数据库中。
进入数据库环境: use 数据库名字。
è 当创建数据表的sql指令执行之后发生了什么?
1) 指定数据库中已经存在对应的表
2) 在数据库对应的文件夹下,会产生对应表的结构文件
2、 查看数据表
数据库能查看的方式都能查看
1) 查看所有数据表:show databases;
2) 产看部分表:模糊匹配 show tables like ‘%s’;
3) 还能查表的创建语句:show create table 表名\g;
还有另外一种方式show create table 表明\G;跟第一种方式区别在于表内容的显示旋转了九十度。
4) 查看表的结构:
desc 表名;
descibe 表名;
show colums from 表名;这三种方式都是一样的。
3、 修改数据表
表本身存在,还包含字段,所以表的修改包括修改表本身以及修改字段。
1) 修改表本身:
表本身可以修改: 表名,表选项
A、 修改表名: rename 老表名 to 新表名;
B、 修改表选项:字符集、校对集、存储引擎
Alter table 表名 表选项
C、 Droptable 表名1,表名2,……..;可以一次性删除多张表。这样的操作我我们一般不做,因为几乎所有的操作中,删除数据式非常危险的一种方式,我们要有保护数据的意识。
è 当删除数据表的指令生效时,(1)在表的空间中,没有了指定的表(就连原先存储的数据都没有了)(2)在数据库对应的文件夹下面,表对应的文件(与数据库的存储引擎有关)也会被删除。
2) 修改字段:
字段操作有很多:新增、修改、重命名、删除
A、 新增字段:alter 表名 add [column] 字段名 数据类型 [列属性] [位置]
位置:字段名可以存放在任何的位置
First::第一个位置
After:在哪个字段之后:after 字段名;默认是在最后一个字段之后。
B、 重命名字段: alter table 表名 change 旧字段 新字段名数据类型 [属性] [位置];
C、 删除字段:alter table 表名 drop 字段名;
注意:如果表中已经存在数据,删除该字段的时候,会清空该字段中的所有数据
3) 数据操作
A、 新增数据:有两种方式
l 方案一:给全表中的字段添加数据,不需要指定字段列表,但是要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致,凡是非数值数据,都需要使用引号,而且建议使用单引号包裹
Insert into 表名 values (值列表)[,(值列表)]; 可以一次性插入多条记录
l 方案二:给部分字段插入数据,需要选定字段列表:字段列表出现的顺序无关,但是值列表的顺序一定要与选择插入的字段列表的顺序一致。
Insert into 表名 (字段列表)values(值列表)[,(值列表)];
B、 查看数据
<- 查看所有数据:select * from 表名;
C、 更新数据
Update 表名 set 字段=值[where 条件];
更新数据不一定会成功,如果数据没有变化就不会成功。
D、 删除数据
Delete from 表名 where 条件;
七、 中文数据问题的本质是字符集的问题
计算机只识别二进制:人类更多的时识别字符,需要有个二进制与字符形成对应关系(字符集)
A、 查看数据库服务器支持的字符集:show character set;
B、 查看数据服务器默认的对外处理的字符集:show variables like ‘character_set%’;
C、 采用set方式设置字符集时,只是档次有效,如果我们每次都是这样去设置字符集,将会变得十分麻烦,所以我们可以采用一下方式快捷设置字符集。
D、 快捷设置字符集: set names [字符集名称];
例如:set names gbk;
此时更改的是character_set_client,character_set_cllection,character_set_results;三个选项。
ð 为什么要改变collection呢?这是因为collection是字符集住那边的连接层,如果统一了效率会更高,事实上不统一也是没有任何问题的。
八、 校对集问题
校对集的概念:数据比较的方式:
校对集的三种方式:
1) _bin:binary ,二进制的比较,一位一位的比较,区分大小写
2) _cs:case sensitive,大小写敏感,区分大小写
3) _ci: case insensitice,大小写不敏感,不区分大小写。
1、 首先我们查看一下数据库支持的校对集:show cllection;我们可以知道,数据库支持197种校对集。
2、 校对集应用,只有在数据产生比较的时候,校对集蔡虎生效
3、 对比:使用utf8 的_bin和_ci 来创建表,通过这个来进行比较。
九、 Web乱码问题
动态网站是由三部分构成的:浏览器,服务器,数据库服务器三个部分组成,三个部分都有自己的字符集,,数据需要在三个方面来回传递,很容易产生乱码问题
解决方案就是:三方统一字符集,但是 事实上是不可能的,我们不可能控制用户的字符集编码。
但是我们呢要注意一点:操作系统的文件是ANSI:本地操作系统字符集GBK
当我们使用,javaweb进行web编程的时候,我们就依赖java代码来将这几者相互交互,处理好他们之间的字符集关系。这个时候我们就必须进行编码检查。