- 数据查询语言DQL:select
- 数据操作语言DML:insert update delete
- 事务处理语言TPL:用于事物安全处理,不是所有数据库都支持事务处理语言。
- 数据控制语言DCL:专门用于权限管理,grant分配,revoke回收
- 数据定义语言DDL:专门用于结构管理 creat drop (alter)
以上语言统称为SQL。
- MySQL一个关系型数据库。
- MySQL对PHP的支持是最好的(wamp或者lamp)
- MySQL用到的指令为SQL指令。
MySQL的架构是C/S结构,客户端和服务端。
服务端对应的软件为MySQL.exe
-
启动MySQL
cmd命令:net start mysql 开启mysql
:net stop mysql 关闭mysql
-
进入服务:通过cmd命令:services.msc
找到mysql进行启动服务。
通过客户端与服务器进行链接认证,就可以进行操作。
通常服务端与客户端不在一台电脑。
连接认证基本语法
mysql/mysql.exe -hlocalhost -P3306 -uroot -proot
登录数据库之后可以对数据库进行操作。
- 退出时,使用以下的方式退出。
- EXIT;
- \q
MySQL的服务端的架构有以下几层构成。
1.数据库管理系统(最外层):DBMS,专门管理服务器的所有内容。
2.数据库(第二层):DB,专门用于存储数据的仓库(可以后很多个)
3.二维数据表(第三层):Table,专门存储某种类型的数据。
4.字段(第四层):Field,专门存储某种类型的数据(实际存储单元)。
数据库几个常用的关键字。
row 行
column 列
SQL对于数据库的操作。
数据库数据存储的最外层。
-
创建数据库
. 基本语法:create database mydatabase;
. 库选项:charset 字符集,代表着当前数据库下的所有的数据默认指定的字符集
. 校对集:collate 校对集。
. Create database 数据库名字 charset 字符集-
create database mydatabase2 charset gbk;
有数据库,就要有文件来存储。每个数据库文件夹下,都有一个opt文件,保存的是数据库选项。
-
有数据库,怎样通过指令来查看数据库
-
显示所有的数据库
- show
-
显示部分数据库
- 基本语法:show databases like ‘字符串’
- '_' 匹配当前位置的单个字符。
- '%'匹配指定位置的多个字符。
- 获取以my开头的全部数据库 :'my%'
- 获取以m开头,后面的第一个字母不确定,最后为database的数据库:m_database
- 获取以database结尾的数据库:'%database'
-
显示数据库的创建语句
- show create database mydatabase
- 看到的指令并非原始指令而是经过系统加工的指令
-
选择数据库
- 为什么选择数据库?因为数据库是存储到数据表,表存在数据库下,如果要操作数据,name必须要进入到对应的数据库才行。
- 基本语法:use数据库名字;
- use mydatabase;
- 返回一个Database changed,表示当前进入到指定的数据库环境。
- use mydatabase;
-
修改数据库
- 是否可以修改数据库的名字,mysql之前可以用rname修改之后不可以。
- 修改数据库的库选项:字符集和校对集。
- 基本语法:alter database mydatabase charset = gbk;
- 一旦修改成功,相对应的opt文件也发生变化。
-
删除数据库
- 基本语法:drop database mydatabase;
- 删除数据库很简单,但是确保数据库没有自己需要的数据。
- 删除数据库之后,对应的文件也被删除。
-
创建表
- 基本语法:create table mytable(字段名 字段类型。。。。。。);
- 复制已有的表结构
--创建一个表,将数据表挂到数据库下。不需要进入数据库 create table mydatabase.class( name varchar(10) ); -- 或者在创建表之前,先进入要创建表的数据库。
- 表选项
- Engine,存储引擎,mysql提供的具体存储数据的方式,默认有一个imnodb(5.5以前默认是myisam)
- Charset:字符集,只对自己的表有效(级别比数据库高)
- collate:校对集,也是指对自己有效。
--使用表选项 create table student( name varchar(10) )engine [=] innodb/myisam charset utf8 collate; create table student( name varchar(10) )charset utf8;
-
复制已有表结构的基本语法
-
create 新表名 like 表名;
create Newtable like Oldtable; --只复制结构,不复制数据 --只要使用 数据库.表名。就可以在任意的数据库下使用其他数据库的表 create table teacher like Mydatabase.teacher; -- 从Mydatabase2底下整的一个表
-
-
显示数据表
每当一张数据表创建,那么就会在对应的数据库下创建一些文件(与存储引擎有关与innodb有关。innodb所有的文件都在外部的ibdate1文件里边,里边存储所有的innodb对应的表数据)
-
显示所有表
show tables; --查找当前数据库所有的表 show tables like '匹配的数据表' --查找一个表,可以模糊,也可以精确。
-
显示表结构
--本质含义:显示表中所包含的字段信息(名字,类型,属性) Describe teacher; Desc teacher; show columns from teacher;
-
显示表的创建语句
1.看到的语句,是被系统加工过的语句。
show create table teacher; --查看teacher表的创建的语句。
!!!!!!!!!!!!
//mysql中的多种语句结束符 // ';' & '\g' & '\G' //前两个效果是一样的,字段在上排横着,下面跟对应的数据。 // '\G' 字段在左边竖着, 数据在右边横着,旋转90°。
-
设置表的属性
表属性指的就是表的选项,engine , charset 和 collate。
-
基本语法:alter table 表名 表选项 [=];
-- 修改表选项 alter table tearcher charset utf8; -- 如果数据库已经确定,有很多数据,就不要轻易修改表选项了。
-
修改表的结构
-
修改表名
--修改数据库表名,通常有前缀。取数据库前面的两个字母加上下划线 rename table tercher to my_tercher;
-
修改字段
--新增字段(默认是加到表的最后面) --西段位置:字段想要存放的位置 --First :放到表的第一个字段; --After 字段名: 放到字段名之后的字段。 alter table my_teacher add column age int; --修改字段名 alter table my_teacher change 字段名 新字段名 新字段类型【列属性】【新位置】; --修改字段类型,修改类型。 alter table my_teacher modify name varchar(20); --删除字段 alter table my_teacher drop name;
-
删除表结构
--删除表结构, 可以一次删除多个表结构。 drop table 表名1,表名2.....;
-
数据操作
-
插入操作
--1.插入数据导数据表 insert into tablename(name,age) values('jack',30); --后面的值列表,与前面的字段列表对应就可以。 insert into tablename(age,name) values(49,'jak'); --字段列表不一定有所有的表中字段 --2. 向表中所有字段插入数据 insert into tablename values('jack',30; --值列表必须与表的字段列表对应。否则会出错。因为没有指定字段列表。
- 数据的操作
-- 1. 查询操作
--查询表中所有数据:
select * from my_teacher;
--查询表中部分字段:
//字段列表使用逗号隔开
select name from my_teacher;
--简单的条件查询:获取年龄为30岁的人
select name from my_teacher where age = 30;
-- 2. 删除操作
delete from tablename [where 条件];
--删除年龄为30岁的
delete from my_teacher where age = 30;
-- 3. 更新操作
update tablename set 字段名 = 新值 [where 条件];
--将数据进行修改(修改部分字段)
```
字符集
1.字符编码概念
各种文字符号的总称,字符编码:是计算机针对各种符号,在计算机中的一种二进制存储代号。(ASCII, GB2312, BIG5, GB18030, Unicode, 等等)
2.设置mysql 的字符集
问题:
通过mysql.exe 来操作 mysqld.exe。
mysql.exe将数据传入mysqld.exe来执行。
mysql.exe将数据传入的时候,没有告知其对应的符号规则(字符集),而mysqld.exe也没有能力自己判断,就会使用自己默认的一个字符集。
解决:
mysql.exe告知mysqld.exe自己的字符集。
--设置字符集 , mysql.exe 和 mysqld.exe之间的处理关系有三层
-- 客户端传入数据给服务器:client: character_set_client
-- 服务器返回数据给客户端:server: character_set_results
-- 客户端与服务器之间的链接: connection: character_set_connection
set names gbk;//一次性打通三层关系的字符集,使三层的字符集变得一致。
--set names gbk; 相当于set character_set_client = gbk; \set character_set_results = gbk;\set character_set_connnection = gbk;
show variables like 'charaoter_set——%'
-- 重新打开一个客户端即可得知正确性。
--修改变量
set character_set_client = gbk;
set character_set_results = gbk;
--容易导致一个牛头不对马嘴的问题。传入正确,查看乱码。
字段类型(列类型)
1.整数类型
-
Tinyint
迷你整形,采用一个字节来保存的整形,表示范围 0 ~ 255
-
smallint
小整形,采用两个字节来保存的整形,表示范围 0 ~ 65535
-
Mediumint
中整形,采用三个字节来保存的整形
-
INT
整形,采用四个字节来保存的整形,表示范围 -2147483648 ~ 2147483647
-
Bigint
大整形,采用八个字节来保存的整形
--创建一个INT表
create table my_int(
int_1 tinyint,
int_2 smallint,
int_3 mediumint,
int_4 int,
int_5 bigint
)charset utf8;
-- 插入合理数据
insert into my_int values(10,100,100,10000,100000);
--且默认整形有负数。
--实际应用根据对应的数据范围来选择相对应的整形数据
alter table my_int add int_6 tinyint unsigned first;
--插入无符号整形
insert into my_int values(255,10,100,100,10000,100000);
--指定字段长度(在表中添加)
alter into my_int add int_7 tinyint(2) zerofill first;
可以指定字段长度,不会改变字段能表示的数据大小。低于长度自动补充。时间等应用。
2.小数类型
mysql 将小数分为两种类型,浮点型和定点型。
浮点型:又称精度类型,是一种可能丢失精度的数据类型,数据有可能不那么准确(尤其是超出范围)
-
float
-
单精度类型,4字节。数据范围 10的38次方。只能保证7个左右的精度。
Float : 表示不指定小数位的浮点位。 float(M,D)表示一共存储M个有效数字,其中小数部位占D位。 Float(10,2):整数10位,小数2位。
-
-
double
- 双精度类型:8字节,数据范围为10的308次方。精度15位左右。
定点数:能够保证精确的小数(小数部分可能不精确,超出长度四舍五入),整数部分一定精确。
-
decimal
-
decimal定点数: 系统自动根据存储的数据来分配空间,大概9个数字就会分配四个字节来进行存储,同时小数和整数部分是分开的。
Decimal(M,D):M表示总长度,最大值不能超过65,D代表小数部分长度,最长不能超过30. --创建表,和浮点数比较。 create table my_decimal_1( f1 float(10,2), d1 decimal(10,2) )charset utf8; --插入数据 insert into my_decimal values(12345678.90,12345678.90); --第二组 insert into my_decimal values(9999999.99,99999999.99); --尝试定点数四舍五入。 insert into my_decimal values(9999999.99,99999999.999); --定点数如果整数部分进位超出长度也会报错。
-
--创建一个浮点类型的表
create table my_float(
f1 float,
f2 float(10,2)
)charset utf8;
--存入数据
insert into my_float values(123.123,12345678.90);
--存入数据,超出大小。会报错。
insert into my_float values(123.123,123456789.90);
--用户不能直接插入数据超过长度,但是系统自动进位会发生。
--浮点数可以插入满足科学计数法的浮点数
3.时间日期类型
Date:日期类型,系统使用三个字节存储数据,对应的格式为YYYY-mm-dd能表示的范围为1000-01-01到9999-12-12,初始值为0000-00-00
Time:时间类型,能够表示某个指定的时间,系统使用三个字节存储数据,对应的格式为HH:MM:SS,但是mysql的time表示时间的范围大的多,能表示从-838:59:59~838:59:59。在mysql的具体用处为用来描述时间段
datetime:日期时间类型,将date和time联合起来。使用8个字节存储数据。对应的格式为YYYY-mm-dd HH:MM:SS。表示的区间为:1000-01-01 00:00:00到9999-12-12 23:59:59.可以全为0.
timestamp:时间戳,从格林尼治时间开始,时间的格式为datetime
-
Year:年类型:占用一个字节来保存,能表示19002155年。year有两种数据插入方式:099和 四位数的具体年。
--创建一个时间类型的数据表 create table my_date( d1 date, d2 time, d3 datetime, d4 timestamp, d5 year )charset utf8; --插入数据 insert into my_date values( '1900-01-01','12:12:12','1900-01-01 12:12:12','1999-01-01 12:12:12','58' ); --year可以采用两位数的插入,也可以采用四位数的插入。 --year进行两位数的插入的时候,有一个区分点。69 和 70 --输入69 以及 69 以下。year 为 2000+ --输入70 以及 70 以上。 year 为 1900+ --timestramp会自动修改,只要对应的记录被修改。 --time可以插入一个时间段。 --也可以插入一个简单的日期来代替时间,在时间格式之前加一个空格,然后指定一个数字:系统会自动将该数字转换为天数*24小时,再加上后面的时间 --对于这个我们也是醉了。
PHP中有着十分强大的时间日期转换函数,:date将时间戳转换为想要的格式,strtotime又可以将很多的格式转换为对应的时间戳。PHP通常不需要数据库来版主处理这么复杂的时间。所以通常配合PHP时间的保存使用时间戳,从而用整形来操作。
4.字符串类型
char : 定长字符,指定长度之后,系统一定会分配指定的空间用于存储数据。char(L)L代表长度,中英文一样。L的范围为0~255
-
varchar:变长字符:指定长度后,系统根据实际存储的数据来计算长度,分配合适的长度,(数据没有超出长度)。varchar(L)。L的长度理论上为0~65535
因为varchar要记录数据长度(系统根据数据长度自动分配空间),所以每个varchar数据产生后,系统都会在后面增加1~2个字节的额外开销,适用于保存数据所招用的空间长度。如果数据本身小于127个字节:额外开销一个字节:如果大于127个,就开销两个字节。
存储数据 char(2) varchar(2) char所用字节 varchar所用字节 A A A 2*3=6 1*3+1=4 AB AB AB 2*3=6 2*3+1=7 区别
char varchar 使用指定空间 根据数据来定空间 查询效率高 查询效率低 定长使用char。
不确定数据到底有多少,使用Varchar。
数据长度超过255个字符,不论是否固定长度,都会使用text。不再使用char和varchar。
-
text:文本类型,mysql提供了text普通的字符文本,
--系统提供了四种text --tinytext:系统使用一个字节保存,实际能够存储的数据为:2的八次方+1 --text:系统使用两个字节保存,实际存储为:2的十六次方+2 --mediumtext:使用三个字节保存,实际存储为2的二十四次方+3 --longtext:使用四个字节保存,实际存储为:2的三十二次方+4‘ --系统会自动根据存储的数据长度来选择合适的文本类型。 --选择字符存储的时候,数据超过255字符,一定选择text存储。
blob:存储二进制的文本,一般都不会使用Blob通常使用一个链接指向对应的文件本身。
-
enum:枚举类型。在数据插入之前,先设定几个项,这几个选项就是可能出现的数据结果。
如果确定某个字段的数据只有那么几个值,如性别:男,女,保密。系统就可以在设定字段的时候规定当前字段只能存放几个固定值,使用枚举。
enum(数值1,数值2,数值。。。。。。)
--创建表
create table my_enum(
gender enum('男','女','保密')
)charset utf8;
--插入数据
insert into my_enum values('男');
--插入数据只能插入枚举里边的类型
--枚举有规范数据的功能。
--查询,以数字查询
select * +0 from my_enum;
--enum存储的时候,存储的对应的数值。
--插入的时候可以插入对应的数值。
枚举的意义 | |
---|---|
节省空间 | 规范数据 |
-
set:集合。是一种将多个数据选项可以同时保存的数据类型,本质是将指定的二进制来进行控制。1表示该选项被选中,0表示该选项没有被选中。
基本语法:set(’值1‘,。。。。)
1个字节:set有8个选项。
2个字节:set有16个选项
3个字节:set有24个选项。
8个字节:set有64个选项。
set里边的值最多64个。
--创建一个set表 create table my_set( hobby set('篮球','冰球','羽毛球') )charset utf8; --插入数据 insert into my_set values('羽毛球,篮球,冰球'); --系统将对应的数据选项,按照顺序进行编排,从第一个开始进行占位,每一个都对应一个二进制。 --存储的时候,插入了set里边的值,对应位置用二进制表示1,否则,表示0 --查看数据,按照自动转换为数值来查看(以数值方式来查看) select hobby + 0 from my_set; --同样的可以插入数值来表示我们的数据。
set的意义 | |
---|---|
规范数据 | 节省空间 |
5.mysql的记录长度
-
mysql的记录长度(record == 行 row)总长度不能超过65535个字节
varchar能够存储的理论值为65535个字符:字符在不同的字符集下可能占用多个字节。
--创建表:证明varchar在mysql中能够达到的理论值(utf8和gbk)
--varchar的存储特点:除去必要的数据部分,还有额外的保存长度的字节。
create table my_maxvar(
name varchar(65535)
)charset utf8;--会提示错误。
create table my_maxvar(
name varchar(21844)
)charset utf8;--会提示错误
create table my_gbk(
name varchar(32766)
)charset gbk;--会提示错误
6.列属性
列属性又称字段属性,在mysql中一共有6个属性:NULL,默认值,列描述,主键,唯一建,自动增长。
-
NULL属性:代表字段为空,如果对应的值为YES,表示该字段可以为NULL
注意 在设计表的时候,尽量不要让数据为空 mysql的记录长度为65535个字节,如果一个表中有字段允许为NULL,那么系统就会设计保留一个字节来存储NULL,最终有效存储长度为35534个字节 -
默认值:
Defalut:默认值,当字段被涉及的时候,如果允许默认条件下,用户不进行数据的插入。那么就可以使用事先准备好的数据来填充,通常填充的是NULL
--创建数据表
create table my_de(
name varchar(20) not null,
age int default 18
)charset utf8;
--插入数据,先使用set names gbk;保证编码统一。
insert into my_de(name) values('马华腾');
insert into my_de values('jack',default);
-
列描述:comment,是专门用于给开发人员进行维护的一个注释说明。
create table my_co( name varchar(10)not null comment '当前不能为空' )charset utf8;