MSQL

数据库:database
数据库系统:DBS(Database System): 是一种虚拟的系统,将多种内容联系起来的称呼
DBS = DBMS + DB;
DBMS:Database Management System 数据库管理系统,专门管理数据库
BDA : Database Administrator 数据库管理员

SQL

2016-12-31_003834.png

MySQL

MySQL是一种c/s结构的软件,若想访问服务器必须通过客户端(服务端一直运行,客户端在需要使用的时候运行)
交互方式
1.客户端连接认证;连接服务器,认证身份: mysql -u root -p
2.发送SQL指令
3.服务器接受SQL指令:处理SQL指令:返回结果
4.客户端接受结果;显示结果
5.断开连接(释放资源:服务器并发数) exit 、 quit 、\q 三种方式

Mysql服务器对象

没有办法完全了解服务器的内容,只能粗略的去分析数据库服务器的内容结构(db分层)

将mysql服务器内部对象分成了四层: 系统(DBMS)->数据库(db)->数据表(Table)->字段(field)

Paste_Image.png

SQL基本的操作

基SQL的基本操作根据对象进行分类,库操作 表操作 数据操作

库的操作
  • 新增数据库
Create database 数据库名【库选项】;
字符集设定:具体字符集(数据存储的编码格式)gbk utf8
校队集设定 collate 具体校队集
create database mydatabase charset utf8; 
```
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-63d5691d68e4eaf0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

当创建建了数据库SQL语句之后,发生了什么;
1.在数据库系统中,增加了对应的数据库信息
2.会在保存数据的文件下:Data目录,创建一个对应数据库名字的文件夹

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-5965a3bbdefc80a3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3.每个数据库文件下都有一个db.opt文件 里面的内容保存了库选项

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-efd269a18643bbe5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 查看数据库
1.查看所有的数据库; show databases;

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-b6da6d6449db8fad.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2.查看指定的部分数据库:模糊查询
show databases like “pattern”; --parttern 是匹配模式
%:表示匹配多个字符
_ :表示匹配单个字符 
比如:查看已information_开头的数据库:需要转义
show databases like "infomation\_ %"

3.查看数据库的创建语句:
show create datatbases 数据库名;

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-04747acfcc43291e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

从上图可以看出:
数据库在执行SQL语句之前会优化SQL,系统保存的结果是优化的语句

- 更新数据库
数据库名字不可以修改。
数据库的修改,尽显库选项:字符集和校对集(校对集依赖字符集)

```
Alter database 数据库名字 【库选项】;
Charset/character set[=] 字符集;
Collate 校队集
举例:
alter database t_student charset GBK;
```
执行后,查看数据库db.opt的文件 字符集变成GBK
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-8b59df26a524ef5b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 删除数据库

所有的操作中:删除是最简单的
```
Drop database 数据库名字;
比如“
drop dtatbase t_student;
```

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-2cd3033f86736bb8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

在对应的数据库存储的文件夹内:数据库名字对应的文件夹也被删除(级联删除:里面的数据删除)


![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-431eabe2c55fbe69.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
注意:数据库库的删除是不可逆的,不要随意删除,应该先进行备份后操作

##### 表操作
表与字段是密不可分不的,
- 新增数据表
Create table if not exists 表名 (
  字段名1  数据类型 ,
  字段名2 数据类型 .... 最后一行是不需要逗号
)【表选项】;
if not exists; 如果表名不存在,那么就创建;否则不执行创建代码;检查能
表选项:控制表的表现
    字符集:chatset 具字符集; --保证表中存储的字符字符集
```
create table if not exists student{
  name varchar(10),
  gender varchar(10),
  number varchar(10),
  age int
} charset utf8;
```
任何一个表的设计都必须指定数据库
方案一:显示指定表的所属数据库

Create table 数据库名.表名子();  -- 将当前数据表创建在指定的数据库下
```
creat table if not exists  mydatabase.student(  -- 显示将student表放到mydatabase数据库下
    name varchar(10),
    gender varchar(10),
    number varchar(10),
    age int 
) charset utf8;
```
方案2;隐式的指定所属数据库:先进入到某个数据库环境,然后到某个数据库环境,然后这样创建的表自动归属到某个指定的数据库。
     1.先进入数据库: use 数据库名字;
      2.开始创表

当创建数据表的SQL指令之后,到底发生了什么?
1.指定数据库下已经在对应的表
2,在数据库对应的文件下,会产生对应的表结构
  
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-682a9c95a9a7b60f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 查看书库表
数据库能查看的方式,表都可以
1.查看所有的表:show tables;

![](http://upload-images.jianshu.io/upload_images/1965034-b72e3b433b70d857.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2.查看部分表:模糊匹配:show tables like "pattern"; 
 _ 或""

3.查看表的创建语句
show create table student\g   -- \g 等价于 ====;
4.查看表的结构:查看表中的字段信息
Desc/describe/show columns from 表名;


![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-bd869977ae56f8ab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 修改数据表
表本身存才,还包括字段:表得修改分为两个部分:修改表的本身和修改字段
1.修改表本身:可以修改表名字和表选项

修改表名:rename 旧表名 to 新表名 ; 
```
rename table student to my_ student;
```

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-a354e4ae926bf44e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

修改表选项:字符集,校对集和存储引擎
```
alter tabel my_student charset = GBK;
```

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-3c89c6e08e337769.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 修改字段

字段操作很多:新增 修改 重名 删除

1.新增字段
Alter table 表名 add 【column】 字段名 数据类型【列属性】【位置】;
位置:字段名可以存放到表中的任意位置
Fitst:第一个位置
After:在哪个字段之后;
举例 :给my_student表增加一个id字段 在第一个位置
```
alter table my_student add column id int first;
```

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-965961cf3b26a484.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2.修改字段:修改属性或者数据类型
```
alter table 表名 modify 字段名 数据类型 【属性】【位置】;
```
举例:将学生表中的number学号变成固定长度,切放在第二位(id之后)
```
alter table my_student
modify number char(10) after id;
```

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-782e808dbf076822.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

3.重命名字段
alter table 表名 change 旧字段名 新字段名 数据类型 【属性】【位置】;
举例:修改学生表中的gender字段为sex
```
alter table my_student  change gender sex varchar(10);
```

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-65be464364516e92.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

3.删除字段
Alter table 表名 drop 字段名;

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-1da9ae3364b1f36a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

注意:如果表中已经存在数据,那么删除字段会清空该字段的所有数据(不可逆)

- 删除数据表
drop table 表名1;
当删除数据表指令之后发生了什么?
1.在表空间中,没有了制定的表(数据也没有了)
2.在数据库对应的文件夹下,表对应的文件(与存储引擎有关)也会被删除

##### 数据操作
- 新增数据
方案一
给全表字段插入数据,不需要指定字段列表:顺序一致,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致:凡是非数值数据,都需要使用引号(建议是单引号)包裹,
```
insert into 表名 values(值列表1),(值列表2),......; --可以一次插入多条记录
insert into student values (3, 12, 'jime', 100),(2, 23, 'jim', 98);
``` 

方案2:给部分字段插入数据,需要选中选定字段列表:字段列表出现的顺序与字段顺序无关;
但是值列表的顺序必须与选定的字段的顺序一致
```
insert into 表名 (字段名列表)values(值列表);

```

- 查看数据
1.查看所有的数据
select *from 表名;
2.查看制定的字段,制定条件的数据
select id,number, sex, name from student where id = 1;

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-bd1f3264cd701e96.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- 更新数据
update 表名 set 字段 = 值 【where 条件】; 建议都有where;要不是就更新全部

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-85f26788758034d8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

注意: 更新不一定会成功,如果没有真正要跟新的数据

- 删除数据
删除数据是不可逆的;谨慎删除
delete from my_student where sex = ‘man’;

##### 中文数据问题
本质是字符集的问题
计算机只是别二进制:人类更多是识别字符号:需要有个二进制与字符对应的关系(字符集)
客户端想服务器插入中文数据;没有成功

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-e9797e36eca2bee3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

原因:\xCF\xF2\xC8\XFD 代表‘向三’在当前编码(字符集)下对应的二进制编码转换成的十六进制 两个汉字=>四个字节(  GBK)

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-d2553a80e5194a4a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

报错的原因:服务器没有识别对应的四个自己;服务器认为数据是utf8,一个汉字有三个字节,读取三个字节转换成汉字(失败),剩余的在读取三个字节(不够),最终失败

所有的数据库服务器认为的一些特性都是同坐服务器端的变量来保存:系统先读自己的变量,看看应该怎么表现。

查看服务器到第识别那些字符集
show character set;

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-b22771c7ce239dfc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

基本上:服务器是万能的,什么字符集都支持
客户端改变不了 那么就改变服务器

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


![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-685d981d76ee0e16.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

问题根源:客户端数据只能是GBK,而服务器默认是utf8;矛盾产生
解决方案:改变服务器默认接受字符集为 GBK
set character_set_client = gbk;


![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-968720cbc04abb12.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

一个插入中文数据了,但查询依然是乱码

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-a254ab0a10a86b59.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

原因:数据来源是服务器,而解析数据是客户端(客户端只是别GBK);只会两个字节要给汉字,服务器给的数据缺失UTF8,三个字一个汉字:乱码
解决方案:放服务器给客户端的护具字符集为:GBK
set character_set_results = gbk;

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-83fe4d2bcf8d0784.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

然后在查询数据
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-61153d168228d6b9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

set 变量= 值; 修改只会是回话级修改(当前客户端当次连接有效,关闭失效);

设置服务器对客户端的字符集的认识:可以使用快捷方式:set names 字符集
set names gbk;===> character_set_client = gbk;  set character_set_results = gbk;

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-ecf382cbfef86c1d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Connection 连接层:是字符集转变的中间者,如果统一了效率更高,不统一也没问题

##### 校对集
数据的比较方式
校对集有三种格式
  _bin:binnary ,二进制比较,取出二进制位的比较,区分大小写
  _cs:case sensitive,大小写敏感,区分大小写:
  _ci:case insensitice,大小写不敏感,不区分大小写

查看我们的数据库所支持的校对集:show collation;

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-110da42662ab886b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

校对集应用:当数据产生比较的时候,校对集才会生效

##### Web乱码
动态网站由但部分构成 浏览器 服务器(PHP) 数据库,三个部分都有自己的字符集,数据要在三个部分之间来回传递:很容易产生乱码

如何解决乱码问题:统一编码

但是事实上不可能的;浏览器是用户管理的(根本不可能控制的)
但是必须要解决这个问题;通过PHP来做

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1965034-1d04f2751cc47be7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,563评论 18 139
  • 1、引言 数据库设计过程中表、字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理...
    SnowflakeCloud阅读 40,915评论 0 48
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,835评论 6 13
  • 城市里的草履虫, 是被浪拍打到岸的幸存者, 是黎明前快消失的音乐, 失眠后焦躁的枕套, 我是被浪卷走的根茎, 狂欢...
    在古老的荒原弹火焰阅读 258评论 0 1
  • 一个人的生命,终究是为了活出自己。如果你在很小的时候就被告知这一点,并且身体力行,那么将会是你非常不同的人生起点。...
    小幸甫阅读 2,039评论 4 9