1、数据库:database,存数据的仓库;高效的存储和处理数据的介质(介质主要有磁盘和内存)。
2、数据库分类:
<1>基于介质的不同进行分类:
(1) 关系型数据库(SQL): 大型:Oracle,DB2; 中型:SQL-SERVER,Mysql;小型:access等。(2)非关系型数据库(NoSQL:Not Only SQL):memcached,mongodb,redis
<2>两者区别:
(1)关系型:安全(保存磁盘基本不可能丢失),易理解,但较浪费空间(二维空间)(2)非关系型:效率高,但不安全(断电丢失)
3、关系型数据库:是一种建立在关系模型(数学模型)上的数据库
4、关系模型:包括三个方面:
(1) 数据结构:数据存储的问题,二维表(有行与列)(3)完整性约束:表内数据约束(字段与字段),表与表之间的约束(外键)
5、SQL操作主要分为三种:DDL,DML,DCL三种类型:
(1)DDL:Data Definition Language,数据定义语言,用来维护存储数据的结构(数据库,表),代表指令:create,drop,alter等。
(2)DML:Data Manipulation Language,数据操作语言,用来对数据进行操作(数据表中的内容),代表指令:insert,delete,update等:其中DML内部又单独进行了一个分类:DQL(Data Query Language:数据查询语言,如select)。
(3)DCL:Data Control Language,数据控制语言,主要是负责权限管理(用户),代表指令:grant,revoke等。
注:SQL是关系型数据库的操作指令,SQL是一种约束,但不强制(类似W3C):不同的数据库产品(如Oracle,mysql)可能内部会有一些细微的区别。
好了,说完了上面SQL后,再把目光真正转向MySQL数据库上来
1、首先,什么是MySQL数据库呢?MySQL数据库是一种c/s结构的软件(c/s结构即为客户端/服务端结构):若想访问服务器必须通过客户端来访问,其中服务器要一直运行,客户端需要使用时运行。
2、交互方式:
(1)客户单连接认证:连接服务器,认证身份:Mysql.exe-hPup。
mysql.exe -h(主机地址) -p(端口) -u(用户名) -p(用户密码)
(2)客户端发送SQL指令
示例:show databases(查看所有数据库)
(3)服务器接受指令,进行处理SQL指令,再返回操作结果
(4)客户端接受结果显示出来
(5)断开连接(为了释放资源,服务器并发限制)(简单来说,不能占着空间,其他用户也需要使用)
断开连接的三种操作:exit,quit,\q
3、基本操作:CRUD(增查改删)
4、将SQL的基本操作根据操作对象进行分类,可分为以下三类:
(1)库操作:对数据库的增删改查。
基本语法:
<1>Create database 数据库名字 [库选项];
库选项:用来约束数据库,分为两个选项:校对集设定:collate 具体校对集(数据比较的规则)
注:其中,数据库名字不能使用关键字(已经被使用的字符)或者保留字(将来可能会用到的)
如果非要使用关键字和保留字,那么必须使用反引号(esc键下面的键再英文状态下的输出:`)
注:中文数据库是可以的,但是有前提条件:保证数据库能够识别(建议不用)
当创建数据库的SQL语句执行后,发生了什么?
1、在数据库系统中,增加了对应的数据库信息
2、会在保存数据的文件夹下:Data目录,创建一个对应的数据库名字的文件夹
(下图即为创建中文数据库的弊端,名字不一样,而且创建多个中文数据库时很难区分)
3、每个数据库下都有一个opt文件:保存了库选项
<2>查看数据库:
Show databases;(查看所有数据库)
Show database like 'pattern'; ----pattern是匹配模式(查看指定部分的数据库:模糊查询)
%:表示匹配多个字符。
_:表示匹配单个字符。
——查看以information_开始的数据库,需要被转义
show databases like 'information_%'; ---相当于information%
show databases like 'information\_%';
Show create database 数据库名字;(查看数据库的创建句子)
<3>更新数据库(数据库名字不可修改;数据库的修改仅限库选项:字符集和校对集(校对集依赖字符集))
Alter database 数据库名字 [库选项];
Charset/character set [=] 字符集
Collate 校对集
<4>删除数据库(所有操作中最简单的)
drop database 数据库名字;
当删除数据库语句执行后,发生了什么?
1、在数据库内部看不到对应的数据库
2、在对应的数据库存储的文件夹内:数据库名字对应的文件夹也被删除(级联删除:里面的数据表全部删除)
注:删除数据库需谨慎!(应进行备份后进行删除操作)
(2)表操作(包含字段操作,因为表与字段关联是离不开的)
<1>新增数据表
Create table [if no exists] 表名(
字段名字 数据类型,
字段名字 数据类型 -- 最后一行不需要逗号
)[表选项];
if no exists:如果表名不存在,就创建对应名字的表,否则不执行创建代码(称为检查功能)
表选项:控制表的表现
字符集:charset/character set 具体字符集; --保证表中数据存储的字符集
校对集:collate 具体校对集;
存储引擎:engine 具体的存储引擎(innodb和myisam)
(注:任何一个表的设计都需要指定数据库)
方案一:显示指定表所属的数据库
Create table 数据库名.表名(); -- 将当前数据表创建到指定数据库下
方案二:隐式的指定表所属数据库:先进入某个数据库环境,然后创建的表自动归属到这个进入的数据库。
use 数据库名;
当创建数据表的SQL指令执行后,到底发生了什么?
1、指定数据库下已经存在对应的表
2、在数据库对应的文件夹下,会产生对应表的结构文件(跟存储引擎有关系)
<2>查看数据表
Show tables;(查看所有数据表);
Show tables like 'pattern';(查看部分表:模糊匹配)
Show create table 表名;(查看表的创建语句)
Desc/describe/show columns from 表名;(查看表结构:查看表中的字段信息)
<3>更新(修改)数据表(表可以修改的有:表名和表选项)
rename table 原表名 to 新表名字
修改表选项:字符集,校对集和存储引擎
Alter table 表名 表选项 [=] 值;
修改字段:新增,修改,重名,删除
1、新增字段
Alter table 表名 add [column] 字段名 数据类型 [列属性] [位置];
位置:字段名可以存放在表中的任意位置
First:第一个位置
After:在某个字段之后;用法:after 字段名;默认的是最后一个字段之后
2、修改字段:修改通常是修改属性或者数据类型
Alter table 表名 modify 字段名 数据类型 [属性] [位置];
3、重命名字段
Alter table 表名 change 旧字段 新字段 数据类型 [属性] [位置];
4、删除字段
Alter table 表名 drop 字段名;
(注:删除方面的操作都要注意备份,删除的数据表内的数据基本无法恢复)
<4>删除数据表
Drop table 表名1,表名2...; --- 可以一次性删除多张表
当删除数据表的指令执行之后,发生了什么?
1、在表空间中,没有了指定的表(表内数据也不存在了)
2、在数据库对应的文件夹下,表对应的文件(与存储引擎有关)也会被删除
(3)数据操作
<1>方案一:给全表字段插入数据,不需要指定字段列表;要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致;凡是非数值数据,都需要引号(建议是单引号)包裹。
Insert into 表名 values(值列表)[,(值列表)]; -- 可以一次性插入多条记录
方案二:给部分字段插入数据,需要选定字段列表;字段列表出现的顺序与字段的顺序无关,但是值列表的顺序必须与选定的字段顺序一致。
Insert into 表名(字段列表) values (值列表)[,(值列表)];