MySQL数据库学习day1

  1. 什么是数据库?

数据库:database,存储仓库的介质。

数据库:高效的存储和处理数据的介质(介质主要是两种:磁盘和内存)

  1. 数据库的分类?

数据库基于存储介质的不同:进行了分类,分为两类:关系型数据库(SQL)和非关系型数据库(NoSQL:Not Only SQL,不是关系型数据库都叫做非关系型数据库)

  1. 不同的数据库阵营中的产品有哪些?

关系型数据库:

大型:Oracle,DB2

中型:SQL-Server,MySQL等

小型:access等

非关系型数据库:memcached,mongodb,redis(同步到磁盘)

  1. 两种数据库阵营的区别

关系型数据库:安全(数据保存在磁盘基本不可能丢失),容易理解,比较浪费空间(关系型数据库其实是一个二维表,即使不存储数据也会占用空间)。

非关系数据库:效率高,不安全(断电会丢失数据)。

关系型数据库

  1. 什么是关系型数据库?

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

关系模型:一种所谓建立在关系上的模型。关系模型包含三个方面:

数据结构:数据存储的问题。二维表(行和列)

操作指令集和:所有SQl语句

完整性约束:表内数据约束(字段与字段),表与表之间约束(外键)
  1. 关系型数据库的设计

关系型数据库:从需要存储的数据需求中分析,如果是一类数据(实体)应该设计成一张二维表:表是由表头(字段名:用来规定数据的名字)和数据部分组成(实际存储的数据单元)。

表头 字段1 字段2
数据单元 数据1 数据2

二维表:行和列

表头 字段1 字段2
数据单元 数据1 数据2

以实际案例来进行处理:分析一个教学系统:讲师负责教学,教学生,在教室教学生。

  1. 找出系统中所存在的实体:讲师表,学生表,班级表

  2. 找出实体中应该存在的数据信息

    讲师:姓名,性别,年龄,工资

    学生:姓名,性别,学号,学科

    班级:班级名字,教室编号

关系型数据库:维护实体内部,实体与实体之间的联系。

实体内部的联系:每个学生都有姓名,性别,学号,学科信息

第二行的所有字段,都是在描述陈明这个学生(内部联系);第二列只能放性别(内部约束)

关系型数据库的特点之一:如果表中对应的某个字段没有值(数据),但是系统依然要分配空间(而且跟有数据的空间一样大),因此关系型数据库比较浪费空间。

实体与实体之间的联系:每个学生肯定属于某个班级,每个班级一定有多个学生(一对多)

学生表:

班级表:

解决方案:在学生表中增加一个字段来指向班级(必须能够为唯一找到一个班级信息)

学生实体与班级实体的关联联系:实体与实体之间的关系。

关键字说明

数据库:database

数据库系统:DBS(System DataBase):是一种虚拟系统,将多种内容关联起来的称呼

DBS=DBMS+DB

DBMS:DataBase Management System,数据库管理系统,专门管理数据库

DBA:DataBase Administrator,数据库管理员

行/记录:row/record,本质是一个东西:都是指表中的一行(一条记录):行是从结构角度出发,记录是从数据角度从发

列/字段:column/field,本质是一个东西。

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是关系型数据库的操作指令,SQl是一种约束,但不强制(类似W3C):不同的数据库产品(如:Oracle,MySQL)可能内部会有细微差异。

MySQL数据库

MySQL数据库是一种c/s结构的软件:客户端/服务端,若想访问服务器必须通过客户端(服务端一直运行,客户端在需要使用的时候运行)。

扁平化c/s软件:FeiQ,不严格区分服务端和客户端。

支付宝曾经服务器宕机过,却声称是被挖断网线,但是挖断网线怎么会使整个服务器都宕机呢?

交互方式:

  1. 客户端连接认证:连接服务器,认证身份:mysql.exe -hPup

  2. 客户端发送SQl指令

  3. 服务器接收SQL:处理SQL指令:返回操作结果

  4. 客户端接收结果:显示结果

  5. 断开连接(释放资源,服务器并发限制)exit/qiut/\q

MySQL服务器对象

没有办法完全了解服务器内部的内容:只能粗略的去分析数据库服务器的内部的结构将MySQL服务器内部对象分成了四层:系统(DBMS)-> 数据库(DB)-> 数据表(Table)-> 字段(field)

SQL基本操作

基本操作:CRUD

将SQL的基本操作根据操作对象进行分类,分三类:库操作,表操作(字段操作),数据操作

库操作

对数据库的增删改查

新增数据库

基本语法

Create database 数据库名字 [库选项];

库选项:用来约束数据库,分为两个选项

字符集设定:charset、character set具体字符集(数据存储的编码格式):常用字符集:GBK和UTF8

校对集设定:collate 具体校对集(数据比较的规则)

当创建数据库的SQL语句执行以后,发生了什么?

  1. 在数据库系统中,增加了对应的数据库信息

  2. 会在保存数据的文件夹下,创建一个对应数据库名字的文件夹

  3. 每个数据库下都有一个opt文件:保存了库选项

第一行是字符集

第二行是校对集,校对集依赖于字符集

查看数据库

查看所有数据库

  1. show databases;
  1. 查看指定部分的数据库:模糊查询

show databases like ‘pattern’ –pattern是匹配模式

%:表示匹配多个字符

_:表示匹配一个字符

  1. 查看数据库创建语句

show create database mydatabase;

出现的SQL语句跟我们创建数据库时候的SQL语句不一样,是由于数据库在执行SQL语句之前会优化;系统保存的结果是优化后的结果

更新数据库

数据库名字不可以修改

数据库的修改仅限于库选项:字符集和校对集(校对集依赖于字符集,一般不建议修改校对集)

alter database 数据库名字[库选项];

charset/character set [=] 字符集

collate 校对集

修改字符集的同时会修改校对集

删除数据库

所有的操作中:删除是最简单的

drop database 数据库名字;

当删除数据库语句执行之后,发生了什么?

  1. 在数据库内部看不到对应的数据库;

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

注意:数据库的删除一定要进行备份(删除不可逆)

表操作

表与字段是密不可分的

新增数据表

create table[if not exsits] 表名 (

字段名字 数据类型,

字段名字 数据类型   --最后一行不需要逗号

)[表选项];

If not exsits:如果表名不存在,那么就创建,否则不执行创建代码:检查功能

表选项:控制表的表现

字符集:charset/character set 具体字符集;  --保证表中数据存储的字符集

校对集:collate 具体校对集

存储引擎:engine具体的存储引擎(innodb 和 myisam)

出现上面错误的原因是:任何一个表的设计都必须指定数据库

方案1:显示的指定表所属的数据库

create table 数据库名.表名(); ---将当前数据表创建到指定的数据库下

方案2:隐式的指定表所属的数据库:先进入到某个数据库环境,然后这样创建的表自动归属到某个指定的数据库

进入某个数据库环境:use 数据库名字;(注意:可以不加分号,少数)

当创建数据表的SQL指令执行之后,到底发生了什么?

  1. 指定数据库下已经存在对应的表;

  2. 在数据库对应的文件夹下,会产生对应表的结构文件(跟存储引擎有关系)

查看数据表

数据库能查看的方式,表都可以查看

  1. 查看所有表:show tables;

2.查看部分表:模糊匹配:show tables like ‘pattern’

这样模糊查询效率比较低,由于前面是不确定,后面是确定的(相当于索引失效了),效率高的查询方式是前面确定,后面不确定

  1. 查看表的创建语句

  2. show create table 表名

show create table 表名 \g 等价于 show create table 表名;

  1. 查看表结构:查看表中的字段信息(三种方式)

desc 表名;

describe 表名;

show columns from class 表名;

修改数据表

表本身存在,还包含字段:表的修改分为两个部分

修改表本身

表本身可以修改:表名和表选项

修改表名:rename table 旧表名 to 新表名;

修改表选项:字符集、校对集、存储引擎(innodb,myisam)

alter table 表名 表选项 [=] 值;

修改字段

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

新增字段:

alter table 表名 add [column] 字段名 数据类型 [列属性][位置];

位置:字段名可以存放在表中的任意位置

first:第一个位置

after: 在哪个字段之后,after字段名:默认是在最后一个字段之后

修改字段:(通常是修改属性或者数据类型)

alter table 表名 modify 字段名 数据类型[属性][位置];

重命名字段:

alter table 表名 change 旧字段名 新字段名 数据类型[属性][位置];

删除字段:

alter table 表名 drop 字段名;

注意:删除字段后,数据也会被删除(而且操作不可逆)

删除数据表

drop table 表名1, 表名2;可以一次性删除多张表

删除数据表发生了哪些操作?

  1. 在表空间中,没有了指定的表(数据也没有了)

  2. 数据库对应的文件夹下,表对应的文件(与存储引擎有关)也会被删除

注意:删除有危险,操作需谨慎(不可逆)

数据操作

新增数据

有两种方案:

方案1:给全表字段插入数据,不需要指定字段列表:要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致:凡是非数值数据,都需要使用引号(建议单引号)包裹:

insert into 表名 values (值列表)[,(值列表)]; ---可以一次性插入多条记录

方案2:给部分数据插入数据,需要选定字段列表:字段列表出现的顺序与字段的顺序无关,但是值列表的顺序必须与选定的字段的顺序一致

insert into 表名 (字段列表)values(值列表)[,(值列表)];

查看数据

select */字段列表 from 表名 [where 条件];

查看所有数据:

查看指定字段、指定条件数据

更新数据

update 表名 set 字段 = 值 [where=条件]; --建议都有where:不然会更新全部

更新不一定会成功:如没有真正要更新的数据

删除数据

删除是不可逆的:谨慎删除

delete from 表名 [where 条件];

中文数据问题

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

计算机只识别二进制:人类更多是识别符号:需要有个二进制与字符的对应关系(字符集)

客户端向服务器端插入中文数据:没有成功

原因:\xD5\xC5\xD4\xBD代表的是“张越”在当前编码(字符集)下对应的二进制编码转换成的十六进制:两个汉字 => 四个字节(GBK)

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

所有的数据库服务器认为(表现)的一些特性都是通过服务器的变量保存:系统先读取自己的变量,看看应该怎么表现:

//查看服务器到底识别哪些字符集

show character set;

基本上:服务器是万能的,什么字符都支持

//既然服务器识别这么多:总有一种是服务器默认的跟客户端打交道的字符集

//查看服务器默认的对外处理的字符集

show variables like ‘character_set%’;

问题根源:客户端数据只能是GBK,而服务默认是UTF8:矛盾产生

解决方案:改变服务器,默认接收的字符集为GBK;

set character_set_client = GBK;

设置后插入中文数据的效果:

查看数据效果:

原因:数据来源是服务器,解析数据是客户端(客户端只识别GBK:只会两个字节一个汉字):但是事实数据却是UTF8,三个字节一个汉字:乱码

解决方案:修改服务器给客户端的数据字符集为GBK

set character_set_results = GBK;

查看数据效果:

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

connection:连接层:是字符集转变的中间者,如果统一了效率更高、不统一也没问题。

校对集

校对集:数据比较的方式

校对集有三种格式:

_bin:binary,二进制比较,取出二进制,一位一位的比较,区分大小写

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

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

查看数据库支持的所有校对集:

show collation;

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

对比:使用utf8的_bin和_ci来验证不同的校对集效果

  1. 创建不同校对集对应的表
  1. 插入数据
  1. 比较:根据某个字段进行排序:order by 字段名[asc/desc],asc升序,desc降序,默认是升序

校对集:必须在没有数据之前声明好,如果有了数据,那么再进行校对集修改是无效的

Web乱码问题

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

如何解决乱码:统一编码(三码合一)

但是事实上不可能:浏览器是用户管理(根本不可能控制)

但是必须要解决这些问题:主要靠php来做

day 2

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

推荐阅读更多精彩内容