MySQL入门介绍
MySQL学习要点:
MySQL对于PHP程序员来说就是将业务转化成表结构。做好业务中的增、删、改、查。
Mysql数据库的用途和概念
用途:用来存储数据
数据库的五个基本单位
1.数据库服务器
2.数据库
3.数据表
4.数据字段
5.数据行
- 数据库服务器
是指用来运行数据库服务的一台电脑。在数据存储量计算量很大的时候可以存在多台。多台数据库服务器共同存储或计算。由于数据安全非常重要,经常要对数据库服务器里面的数据进行备份。 - 数据库
一个数据库服务器里面可以有多个数据库。主要用来分类使用。 - 数据表
例如在游戏数据库中,根据这一款游戏又分为不同的数据表。专门用来区分不同的数据,例如用户数据;游戏数据。 - 数据字段
也叫数据列,就是我们日常所见表格里面的列。在表格中我们会将一张用户表分为多个列,例如用户编号、性别、年龄。 - 数据行
真正的数据存在每一个表的行里面。字段(列)划分出来了一个表应该按照什么样的格式存数据。而行,是真正的数据。每一行需要遵循数据字段(列)的规范和要求进行存入数据。
数据语句操作类型
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
SQL是最重要的关系数据库操作语言,并且它的影响已经超出数据库的领域,得到其他领域的重视和采用,如人工智能领域的数据检索等。
SQL是1986年10月由美国国家标准局(ANSI)通过的数据库语言美国标准,1989年4月,ISO提出SQL89标准,1992年11月公布SQL92标准。
虽然各个数据库系统略有不同,但基本均遵循SQL 92标准。或者在SQL 92上做了简单的扩展和变化。
SQL语句按照其功能范围不同可分为3个类别:
1.数据定义语言(DDL,Data Defintion Language)
语句:数据定义语句,用于定义不同的数据段、数据库、表、列、索引等。常用的语句关键词包括create(创造)、drop(删除)、alter(增加一个页)等。
2.数据操作语言(DML,Data Manipulation Language)
语句:数据操纵语句,用于添加、删除、更新和查询数据库记录,并检查数据的完整性。常用的语句关键词主要包括insert(增加)、delete(删除)、update(更新)和select(查)等。
3.数据控制语言(DCL,Data Control Language)
语句:数据控制语句,用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键词包括grant、revoke等。
连接数据库
如果加入到了windows的环境变量中,可以在命令行下通过以下命令连接到数据库
mysql -h locahost -u root -p
注:如果是在本地连接可以省略-h locahost
参数说明:-h表示数据库连接地址,连接本机可不填
-u表示要登录的用户
-p表示要登录的密码
通常不直接输入密码。而是在回车之后输入密码。
切记,mysql语句和php一样,语句结束需要在尾部加;
数据表操作
创建数据库
基本语法:create database 数据库名;
示例:create database PHP; 说明:创建一个数库,数据库的名字为PHP
create:创建 database:数据库
查看数据库
基本语法:show databases;
说明:显示当前服务器的所有数据库
注意:databases是数据库的复数形式,指全部数据库
选中数据库
基本语法:use 库名;
示例:use PHP; 说明:使用数据库PHP
注:use是指使用,库名是存在当前数据库系统中的具体的数据库的名称;
可以使用use语句随时切换要操作的数据库。
查看数据库中的表
进入到库后我们可以看这个库里面有多少个数据表。
基本语法:show tables; 说明:显示当前数据库下所有的表
这些表里面的内容是关系服务器相关的用户、权限、数据库状态、设置等相关的信息数据
删除数据库
基本语法:drop database 库名;
示例:drop database PHP; 说明:删除一个数库,数据库的名字为php
注意:数据库删除后,下面的所有数据都会被全部删除,所以删除前一定要慎重并做好相应的备份。
Mysql数据字段操作
修改表字段类型modify
基本语法:alter table 表名 modify 字段名 varchar(20);
示例:alter table user modify username varchar(20);
说明:将user表的username的类型改为varchar(20)
增加表字段
基本语法:alter table 表名 add column 字段名 类型;
示例:alter table user add column age int(3);
说明:添加一个字段为age,类型为整型长度为3
增加字段时控制字段顺序
基本语法:alter table 表名 add 字段名 字段类型 after 字段名;
示例:alter table user add email varchar(60) after createip;
说明:user表中,在createip后增加一个字段为email,类型为varchar,长度为60
基本语法:alter table 表名 add 字段名 字段类型;
示例:alter table user add id int(10) first;
说明:user表中在最开始的位置增加一个字段为id,类型为int,长度为10
删除表字段
基本语法:alter table 表名 drop column 字段名;
示例:alter table user drop column age;
说明:在user表中删除字段age
表字段改名
基本语法:alter table 表名 change 字段原名 字段新名 字段类型;
示例:alter table user change email em varchar(60);
说明:在user表中将字段中的email字段名改为em
使用modify调整顺序
基本语法:alter table 表名 modify 字段名 字段类型 顺序;
示例:alter table user modify em varchar(60) first;
说明:把user表中名为em的varchar类型字段移到第一个
修改表名
基本语法:alter table 旧表名 rename 新的表名;
示例:alter table user rename new_user;
说明:将user表名改为new_user
Mysql数据类型
1.数值类型(整形、浮点)
2.字符串类型
3.日期时间类型
4.复合类型
5.空间类型(非科学性工作基本不用)
注意:在表的字段中规定了使用的是某个数据的类型。那么,在插入的数据中就要使用对应的数据类型,并且遵循数据类型的长度要求。
整型
tinyint 所占字节:1字节 值范围:-128~127
smallint 所占字节:2字节 值范围:-32768~32767
mediumint 所占字节:3字节 值范围:-8388608~8388607
int 所占字节:4字节 值范围:-2147483648~2147483647
bigint 所占字节:8字节 值范围:+-9.22*10的18次方
整型的长度不同。在实际使用过程也就不同
注意:
1.在创建表字段时,性别我们可以使用无符号的微小整型(tinyint)来表示。用0表示女、用1表示男。用2表示未知。
2.同样人类的年龄也是,在创建表字段时可用无符号的整型。因为人类的年龄还没有负数。
3.在实际使用过程中。我们业务中最大需要存储多大的数值。我们创建表时,就选择什么样的类型来存储这样的值。
浮点类型
float(m,d) 所占字节:4字节 值范围:单精度浮点型,m总个数,d小数位
double(m,d) 所占字节:8字节 值范围:双精度浮点型,m总个数,d小数位
decimal(m,d) 值范围:decimal是存储为字符串的浮点数
注意:
1.浮点是非精确值,会存在不太准确的情况
2.而decimal叫做定点数。在MySQL内部,本质上是用字符串存储的。实际使用过程中如果存在金额、数精度要求比较高的浮点数存储,建议使用decimal(定点数)这个类型。
时间类型
data 所占字节:3字节 值范围:日期,格式:2020-03-30
time 所占字节:3字节 值范围:时间,格式:15:56:30
datetime 所占字节:8字节 值范围:日期时间,格式:2020-03-30 15:56:30
timestamp 所占字节:4字节 值范围:自动存储记录修改的时间
year 所占字节:1字节 值范围:年份
注意:
1.时间类型在web系统中用的比较少,很多时候很多人喜欢使用Int来存储时间。插入时插入的是unix时间戳,因为这种方式更方便计算。在前端业务中用date类型的函数,再将unix时间戳转成人们可识别的时间。
2.上面的类型可以根据实际情况实际进行选择
3.有些人为了在数据库管理中方便查看,也有人使用datetime类型来存储时间
复合类型
set 说明:集合类型 举例:set("member","member2",..."member64")(无限制)
enum 说明:枚举类型 举例:enum("member","member2",..."member65535")(有限制)
一个ENUM类型只允许从一个集合中取得一个值;而SET类型允许从一个集合中取得任意多个值
- ENUM类型
ENUM类型因为只允许在集合中取得一个值,有点类似单选项。在处理相互排斥的数据时容易让人理解,比如人的性别。ENUM类型字段可以从集合中取得一个值或使用null值,除此之外的输入将会使MySQL在这个字段中插入一个空字符串。另外如果插入值的大小与集合中值的大小写不匹配,MySQL会自动使用插入值的大小写转换成与集合中大小写一致的值。 - SET类型
SET类型与ENUM类型相似但不同。SET类型可以从预定义的集合中取得任意数量的值。并且与ENUM类型相同的是任何试图在SET类型字段中插入非预定义的值都会使MySQL插入一个空字符串。如果插入一个既有合法元素又有非法元素的记录,MySQL将会保留合法的元素,除去非法的元素。
一个SET类型最多可以包含64项元素。在SET元素中值被存储为一个分离的“位”序列,这些“位”表示与它相对应的元素。“位”是创建有序元素集合的一种简单而有效的方式。
并且它还去除了重复的元素,所以SET类型中不可能包含两个相同的元素。
希望从SET类型字段中找出非法的记录只需查找包含空字符串或二进制值为0的行。
字段其他属性设置
- unsigned(无符号)
主要用于整型和浮点类型,使用无符号。
即前面没有-(负号)
存储位数更长。tinyint整型的取值区间为-128127。而使用无符号后可存储0255个长度。创建时在整型或浮点型字段语句后接上。 - zerofill(0填充)
0(不是空格)可以用来真补输出的值。使用这个修饰符可以阻止MySQL数据库存储负值。创建时在整型或浮点型字段语句后接上。 - default
default属性确保在没有任何值可用的情况下,赋予某个常量值,这个值必须是常量,因为MySQL不允许插入函数或表达式值。此外,此属性无法用于BLOB或TEXT列。如果已经为此列指定了NULL属性,没有指定默认值时默认值将为NULL,否则默认值将依赖于字段的数据类型。创建时在整型或浮点型字段语句后接上。
default ‘值’;
- not null
如果将一个列定义为not null,将不允许向该列插入null值。建议在重要情况下始终使用not null属性因为它提供了一个基本验证,确保已经向查询传递了所有必要的值。创建时在整型或浮点字段语句后接上。 - null
为列指定null属性时,该列可以保持为空,而不论行中其他列是否已经被填充。记住,null精确的说法是“无”,而不是空字符串或0。
创建时在整型或浮点字段语句后不要声明not null即可。
MySQL字符集
为了更好地识别中文、日文、英文。对于常用的符号进行了编码,这个编码就是字符集。
字符集确定了文字的存储方式
字符集相当于是计算机中人类的语言
ASCALL 说明:美国标准信息交换代码 字节长度:单字节
GBK 说明:汉字内码扩展规范 字节长度:双字节
unicode 说明:万国码 字节长度:4字节
UTF-8 说明:Unicode的可变长度字符编码 字节长度:1到6字节
中文中常使用的字符集分为utf-8和GBK
gbk_chinese_ci 说明:简体中文,不区分大小写
utf8-general_ci 说明:Unicode(多语言),不区分大小写
Mysql字符集由三个部分组成:
1.字符集
2.语言
3.类型
最后的bin是指二进制字符集,后面的ci是指存储排列时不区分字符的大小写
注意:mysql在写utf-8的时候写的是utf8。不加中间的中横线。
MySQL表引擎
在mysql命令中使用:show engines;可查看当前服务器支持的所有引擎
MylSAM 特点:常用,读取效率很高的引擎
InnoDB 特点:常用,写入,支持事务等都支持
Archive 特点:不常用,归档引擎,压缩比高达1:10,用于数据归档
NDB 特点:不常用,主要在MySQL集群服务器中使用
MySAM
不支持事务,表锁(表级锁,加锁会锁住整个表),支持全文索引,操作速度快,常用于读取多的业务。
1.myisam存储引擎表由myd和myi组成。.myd用来存放数据文件,.myi用来存放索引文件。
2.对于myisam存放引擎表,mysql数据库只缓存其索引文件,数据文件的缓存由操作系统本身来完成。
InnoDB
1.支持事务,主要面向在线事务处理(OLTP)方面的应用。
2.行锁设计,支持外键,即默认情况下读取操作不加锁。
InnoDB是为处理巨大数据量时的最大性能设计
注:
行锁:写入、更新操作的时候将这一行锁起来,不让其他人再操作
表锁:写入、更新操作时,将表锁起来不让其他人再操作
事务:同时操作多个数据,若其中的一个数据操作失败。可回滚到操作之前。常用于银行、电商、金融等系统。
MySQL索引
普通索引
基本语法:alter table 表 add index(字段)
示例:ALTER TABLE money ADD INDEX(username);
说明:为money表的username字段增加索引
唯一索引
基本语法:alter table 表 add unique(字段)
示例:ALTER TABLE money ADD UNIQUE(email);
说明:为money表的email字段增加唯一索引
全文索引
基本语法:alter table 表 add fulltext(字段)
示例:ALTER TABLE money ADD FULLTEXT(content);
说明:为money表的content字段增加唯一索引
主键索引
基本语法:alter table 表 add primary key(字段)
示例:ALTER TABLE money ADD PRIMARY KEY(id);
说明:为money表的id字段增加主键索引
注:创建表时可在创建表语句后加上对应类型即可声明索引。
MySQL插入记录
语法一
基本语法:insert into 表 values(值1,值2,值n);
示例:INSERT INTO user values(2,'php','男');
说明:向user表中插入值id为2,姓名为php,性别为男
注意:
1.可以不指定字段名称,但是values后面的顺序应该和表字段的排序一致
2.有默认值的字段可以不写,则为默认值
3.如果有默认值或者可空字段不想写入具体指,可写入null
4.数据格式必须和表规定的数据格式一致
语法二
基本语法:insert into 表(字段1,字段2,字段n)values(值1,值2,值n);
示例:INSERT INTO user(id,username,sex) values(220,'张三',1);
说明:向user表中插入id为220,username为张三,性别为1
注意:
1.ID为自增字段可以不用传入值,每插入一次这个字段的值会自动向上加1
2.有默认值和可为空的字段可不传
3.以表user(username,sex)的插入顺序为准
4.基本语法二为更常用的用法
语法一和语法二区别:
1.基本语法1的插入语句,表中有多少个字段必须插入多少个值。一个不能多,一个不能少。若有默认值,不想传,可以写上null
2.基本语法2中,除非有必填字段必须写入值外。如果有默认值的不想写可以忽略不写。mysql会自动补主默认值。
3.基本语法2中,以user(id,username,sex)字段顺序为值的顺序。
MySQL查询记录
基础查询
基本语法:select * from 表;
示例:select * from money;
说明:查询money表中所有字段中的所有结果
注:“*”是一种正则表达式的写法,表示匹配所有,上面的查询语句和下面的是等价
指定字段查询
基本语法:select 字段 from 表;
示例:select id,username,sex from money;
说明:查询money表中id,username,,sex字段中所有结果
查询单个字段不重复记录
基本语法:select distinct 字段 from 表;
示例:select distinct age deptno from money;
说明:查询money表中年龄唯一的所有结果
条件查询
基本语法:select 字段 from 表 where 条件;
示例:select * from money where age = 29;
说明:查询money表中年龄为29的所有结果
结果集排序
基本语法:select 字段 from 表 order by 字段 排序关键词
示例:select id,username,sex from money order by sex desc;
说明:查询money表中的id,username,sex字段,按照性别进行降序排序
注:asc 升序排序,从小到大(默认)
desc 降序排序,从大到小
结果集限制
基本语法:select 字段 from 表 limit 数量;
示例;select id ,username,sex from money limit 5;
说明:只显示前五个用户
结果集区间选择
基本语法:select 字段 from 表 limit 偏移值,数量
示例:select id,username,sex from money limit 0,3;
说明:从第一条开始读取三条数据
注:第一条记录为0
统计类函数使用
常用的统计类函数:
sum:求和 count:统计总数 max:最大值 min:最小值 avg:平均值
基本语法:select 函数(字段) from 表
示例:select count(id) from money;
说明:查询money表的id总数
使用集合示例:select * from money where sex = 0 order by id limit 1,1;
说明:把money表中性别为0并按id进行升序排序中的第二个开始的第一条数据
MySQL多表联合查询
多表联合查询的本质是表连接
表连接
当需要查询多个表中的字段时,可以使用表连接来实现。表连接分为内连接和外连接
1.内连接:将两个表中存在的联结关系的字段符合联结关系的那些记录形成记录集的联结
基本语法:select 表1.字段[as 别名],表n.字段 from 表1[别名],表n where 条件;
注:当使用from表的表别名时,表别名太长,容易写错。可以在表后直接跟上一个简写英文字符串。在前面拼接字段时,直接使用简写字符串.字段即可。
2.外连接:会选出其他不匹配的记录,分为外左联结和外右联结
基本语法:select 表1.字段[as 别名],表n.字段 from 表1 left join 表n on 条件;
注:外连接分为左连接和右连接
左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录
右连接:包含所有的右边表中的记录甚至是右边表中没有和它匹配的记录
子查询
当我们查询的时候,需要的条件是另外一个select语句的结果,这时就需要使用子查询。用于子查询的关键词包括in、not in、=、!=、exists、not exists等。
基本语法:select 字段 from 表 where 字段 in (条件)
MySQL修改记录
基本语法:update 表名 set 字段1=值1,字段2=值2,字段n=值n where 条件;
同时对两个表进行更新
基本语法:update 表1,表2 set 字段1=值1,字段2=值2,字段n=值n where 条件
MySQL删除记录
使用delete删除记录
基本语法:delete from 表 [where条件];
清空记录表
delete和truncate是一样的,但有一点不同那就是DELETE可以返回被删除的记录数,而TRUNCATE TABLE返回的是0
如果表中有自增字段,使用truncate table这个自增字段将起始值恢复成1
基本语法:TRUNCATE TABLE 表名;
注意:删除时一点要加上where条件,不然会清空整个表的数据,删除重要数据前一定要备份
备份数据库
基本语法:mysqldump -uroot -proot xxx(库名)>D:/xxx.sql(存储地址及文件名)
删除数据库
基本语法:drop database xxx;(库名)
还原数据库
- 创建一个数据库
- 设置中文
- use 191
- source D:/xxx.sql;
CMD中将Mysql数据库设置中文
方法一:set character_set_client=gbk;//声明客户端这边的文字编码
再输入set character_set_results=gbk;//mysql希望返回的结果集编码,只要客户端是gbk编码的,只要设置这个就可以解决乱码这个问题。
方法二:set charset gbk;//和上面的效果一致
z