内容好多啊◑﹏◐[那看视频吧…..] ٩(๑❛ᴗ❛๑)۶ (๑>◡<๑)
一. MySQL介绍
1. MySQL数据库简称MySQL,是一款由瑞典MySQL AB公司开发并且应用广泛的数据管理系统,MySQL数据库因其体积小、速度快、总体拥有成本低 受到很多的热捧。现在,MySQL的所有者世界上最著名的数据库企业——Oracle所有。2. MySQL的应用,在国内的企业包括:百度、阿里、腾讯、新浪、搜狐、网易等等企业,全部都在使用MySQL数据库。
3. MySQL是一种开放源代码的关系型数据库管理系统(RDBMS) ,MySQL数据库系统使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理。
由于MySQL是开放源代码的,因此任何人都可以在GPL的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。
4. PHP与很多数据库结合都很紧密。由于,PHP和MySQL都是开源免费的。所以PHP一直对于MySQL等数据库都有很好的支持。
数据库的五个基本单位
- 数据库服务器
- 数据库
- 数据表
- 数据字段(列)
- 数据行
1. 数据库服务器。是指用来运行数据库服务的一台电脑。在中小型企业通常为一台。在数据存储量计算量很大的时候可以存在多台。多台数据库服务器共同来存储或计算。由于数据安全非常重要,我们经常会对数据库服务器里面的数据进经备份。
2. 数据库。一个数据库服务器里面有可以有多个数据库。主要用来分类使用。我们可以建立交通信息数据库、游戏数据库、酒店开房数据库… … 主要用来将各个不同用途的数据,按照业务进行大块的划分。
3. 数据表。例如在游戏数据库中。根据这一款游戏又分为了不同的数据表。专门用来区分游戏不同的数据。例如:用户数据(用户、密码);人物数据;所有装备和装备信息;用户的充值信息;药品、魔力药水信息… …等
4. 数据字段,也叫数据列。就是我们日常所见表格里面的列。在表格中,我们会将一张用户表分成多个列。如下(表一)所示:用户编号、用户名、性别、年龄是字段。在真正的数据库中数据字段需要换成英文需要写成:id、username、sex、年龄。
5. 数据行。真正的数据存在每一个表的行里面。字段(列)划分出来了一个表应该按照什么样的格式存数据。而行,是真正的数据。每一行需要遵循数据字段(列)的规范和要求进行存入数据。
(表一)
用户编号 | 用户名 | 性别 | 年龄 |
---|---|---|---|
1 | 李文凯 | 男 | 18 |
2 | 景田 | 女 | 16 |
3 | 宁泽涛 | 男 | 22 |
二. 数据库语句操作类型
1. 学习数据库安装后,最重要的就是学习SQL语句。2. SQL是操作数据库的核心,也是本章开始的一句话:MySQL对于PHP程序员来说就是将业务转化成表结构。做好业务中的增、删、改、查。
3. 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
一. 数据库操作语句类型(DQL、DML、DDL、DCL)简介
1. 数据查询语言DQL
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:
语句 | 功能 |
---|---|
SELECT | <字段名表> |
FROM | <表或视图名> |
WHERE | <查询条件> |
2 .数据操纵语言DML
用于添加、删除、更新和查询数据库记录,并检查数据的完整性。数据操纵语言DML主要有三种形式:
1) 插入:INSERT
2) 更新:UPDATE
3) 删除:DELETE
3. 数据定义语言DDL
数据定义语言DDL用来创建数据库中的各种对象—–表、视图、索引、同义词、聚簇等。注意:DDL操作是隐性提交的!不能rollback
常用的语句关键字包括
1) CREATE:创建
2) DROP:删除
3) ALTER:修改
4. 数据控制语言DCL
用于控制不同数据段直接的许可和访问级别的语句。这些语句定义了数据库、表、字段、用户的访问权限和安全级别。主要的语句关键字包括grant、revoke等。
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制。数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
1) GRANT:授权
2)REVOLK:撤销
三. 连接数据库
方法一安装后,可以在开始菜单的列表中找到MySQL Command Line 点击操作的命令行终端操作。
方法二
如果加入到了windows的环境变量中,可以在命令行下直接操作。
在命令行下,通过以下命可以连接到数据库服务器:mysql -h localhost -u root -p
参数说明:
参数 | 说明 |
---|---|
-h | 表示数据库连接地址,连接本机可不填 |
-u | 表示要登录的用户 |
-p | 表示使用密码登录 |
注:通常我们不直接输入密码。而是在回车之后,输入密码。因为,密码输入时的字符是不可见的,输完密码直接回车登录。防止旁边有人把重要的密码看走。
如果没有什么别的问题,登陆成功之后会出现下面内容:
mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.6.25 MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
上面的中文意思翻译过来是说,欢迎使用MySQL的命令行操作工具。每一个命令结束可以输入\g 或者 ;
mysql当前是第 7次连接。
当前数据库的版本是5.6.25社区支持版。遵循GPL协议。
版权所有:2000至 2015。归Oracle及其子机构拥有所有权。
如果需要帮助的话,通过 ‘help;’ 或者 ‘\h’ 命令来显示帮助内容,通过 ‘\c’ 命令来清除命令行历史。
mysql>
mysql > 表示等待输入指令。
注:
在登陆成功后有这么一句提示,可能大家不太理解:
Your MySQL connection id is 7
表示第7次连接登陆,每登陆一次这个id为加1。下一次显示的会是第8次。
四. 数据库操作
4.1 创建数据库
基本语法:CREATE DATABASE 数据库名;
类别 | 详细解示 |
---|---|
基本语法 | CREATE DATABASE 数据库名; |
示例 | CREATE DATABASE PHP; |
示例说明 | 创建一个数库,数据库的名字为PHP |
注意:
一个MySQL语句结尾是以英语分号(;)结束的,千万不要忘记了,不然语句是错误的!
示例:
mysql> CREATE DATABASE PHP;
Query OK, 1 row affected (0.00 sec)
- “Query OK” 表示上面的命令执行成功,所有的 DDL 和 DML(不包 括 SELECT)操作执行成功后都显示“Query OK”,这里理解为执行成功就可以了;“1 row affected” 表示操作只影响了数据库中一行的记录,“0.00 sec”则记录了操作执行的时间。
- 如果已经存在这个数据库,系统会怎么提 示:
mysql> CREATE DATABASE PHP;
ERROR 1007 (HY000): Can't create database 'PHP'; database exists
4.2 查看数据库
基本语法:show databases;
类别 | 详细解示 |
---|---|
基本语法 | show databases; |
示例说明 | 显示当前服务器的所有数据库 |
注意:
show 是指显示
database 是指数据库
databases 是数据库的复数形式,指全部数据库。
4.3 选中数据库
基本语法:use 库名;
类别 | 详细解示 |
---|---|
基本语法 | use 库名; |
示例 | use PHP |
示例说明 | 使用数据库PHP |
注意:
- 在一个数据库里面处理数据的时候,必须先进入这个数据库,即先use 库名;
- use 是指使用;
- 库名 是存在当前数据库系统中的具体的数据库的名称;
- 出现 ” Database changed“ 表示切换成功。然后,看看mysql数据库里面有什么内容(和查看当前数据库服务器数据库一样使用 show 语句)
4.4 查看数据库中的表
基本语法:show tables;
前提是先:use 库名;
类别 | 详细解示 |
---|---|
基本语法 | show tables; |
示例说明 | 显示当前数据库下所有的表 |
4.5 删除数据库
基本语法:DROP DATABASE 库名;
类别 | 详细解示 |
---|---|
基本语法 | DROP DATABASE 库名; |
示例 | DROP DATABASE PHP; |
示例说明 | 删除一个数库,数据库的名字为liwenkai |
注意:
- drop 是汉语可以翻译为指掉下来,不要了的意思
- database 是指库
- 库名 是指要删掉的库的名称
示例:
mysql> DROP DATABASE PHP;
Query OK, 0 rows affected (0.01 sec)
- 【切记】注:数据库删除后,下面的所有数据都会全部删除,所以删除前一定要慎重并做好相应的备份。(若重要数据未备份,而实际中产生的数据风险很高。)
- 一定要指定好要删除的数据库的名字。
五. 数据表操作
5.1 创建数据表
基本语法:CREATE TABLE 表名(字段名1 字段类型,….字段名n 字段类型n);
类别 | 详细解示 |
---|---|
基本语法 | CREATE TABLE 表名(字段名1 字段类型,….字段名n 字段类型n); |
示例 | CREATE TABLE user(username varchar(20),password varchar(32)); |
示例说明 | 创建一个表名叫user的表,第一个字段(列)为username、表的字段类型为varchar、长度为32个 长度。第二个字段为password,类型也为varchar,长度也为32个长度。 |
5.2 查看表字段(列)结构信息
基本语法:desc 表名;
类别 | 详细解示 |
---|---|
基本语法 | desc 表名; |
示例 | desc test |
示例说明 | 查看test表的表结构(显示出test表的每一行详细数据) |
5.3 查看表的创建SQL语句
当我们不会创建数据表,或者需要参考其他已经创建好的数据表的语法,我们可以查看那些数据表的语法。基本语法:SHOW CREATE TABLE 表名 [\G];
如果一行很长,需要这行显示的话,看起结果来就非常的难受。在SQL语句或者命令后使用\G,可以将每一行的值垂直输出。
类别 | 详细解示 |
---|---|
基本语法 | SHOW CREATE TABLE表名 \G; |
示例 | SHOW CREATE TABLE emp \G; |
示例说明 | 查看表emp的创建语句 |
注:上面表的创建 SQL 语句中,除了可以看到表定义以外,还可以看到表的 engine(存储引擎) 和 charset(字符集)等信息。“\G”选项的含义是使得记录能够按照字段竖着排列,对于内 容比较长的记录更易于显示。
5.4 指定表引擎和字符集
数据库引擎推荐资料:[数据库引擎学习总结]、[MYSQL数据库引擎区别详解]
字符集推荐资料:[各种字符集和编码详解]、[字符集百度百科]
在创建表最后,我们常用MyISAM或者InnoDB引擎。在指定引擎时,我们可以使用:ENGINE=InnoDB
指定表默认字符集:DEFAULT CHARSET=utf8
(1) Mysql表引擎
MySQL的强大之处在于它的插件式存储引擎,我们可以基于表的特点使用不同的存储引擎,从而达到最好的性能。
基本语法:show engines;
可以查看到当前服务器支持的所有引擎。
引擎名称 | 特别 |
---|---|
MyISAM | 常用。读取效率很高的引擎 |
InnoDB | 常用。写入,支持事处等都支持 |
Archive | 不常用。归档引擎,压缩比高达1:10,用于数据归档 |
NDB | 不常用。主要在MySQL 集群服务器中使用,不做介绍 |
MyISAM
- 不支持事务,表锁(表级锁,加锁会锁住整个表),支持全文索引,操作速度快。常用于读取多的业务。
- myisam存储引擎表由myd和myi组成。.myd用来存放数据文件,.myi用来存放索引文件。
- 对于myisam存储引擎表,mysql数据库只缓存其索引文件,数据文件的缓存由操作系统本身来完成。
InnoDB
- 支持事务,主要面向在线事务处理(OLTP)方面的应用。
- 行锁设计,支持外键,即默认情况下读取操作不加锁。
- InnoDB是为处理巨大数据量时的最大性能设计。
注意:
- 行锁:写入、更新操作的时候将这一行锁起来,不让其他人再操作了。
- 表锁:写入、更新操作时,将表给锁起来不让其他人再操作了。
- 事务:同时操作多个数据,若其中的一个数据操作失败。可回滚到操作之前。常用于银行、电商、金融等系统中。
(2) Mysql字符集
1. 为了更好的识别中文、日文、英文、希腊语。对于常用的符号进行了编码,这个编码就是字符集。
2. 字符集确定了文字的存储方式。
3. 字符集相当于是计算机中人类的语言。
字符集 | 说明 | 字节长度 |
---|---|---|
ASCII | 美国标准信息交换代码 | 单字节 |
GBK | 汉字内码扩展规范 | 双字节 |
unicode | 万国码 | 4字节 |
UTF-8 | Unicode的可变长度字符编码 | 1到6个字节 |
ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。
其中:
0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。
32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。
65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
GBK
GBK 向下与 GB 2312 编码兼容。是中华人民共和国定义的汉字计算机编码规范。早期版本为GB2312。
Unicode
Unicode(统一码、万国码、单一码)Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。以满足跨语言、跨平台进行文本转换、处理的要求。
UTF-8
是一种针对Unicode的可变长度字符编码,也是万国码。因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)
(3) 实际工作中要使用的编码
在中文中常用的字符集分为utf-8和GBK。
实际使用的如下:
字符集 | 说明 |
---|---|
gbk_chinese_ci | 简体中文, 不区分大小写 |
utf8_general_ci | Unicode (多语言), 不区分大小写 |
MySQL字符集由三个部份组成:
1. 字符集
2. 语言
3. 类型
注意:
1. 最后的bin是指二进制字符集,后面的ci是指存储排序时不区分字符的大小写。
2. mysql在写utf-8的时候写的是utf8。不加中间的中横线。
六. 数据字段(列)操作
6.1 修改表字段类型 modify
基本语法:alter table 表名 modify 字段名 varchar(20);
关键字:alter、modify
类别 | 详细解示 |
---|---|
基本语法 | alter table 表名 modify 字段名 varchar(20); |
示例 | alter table user modify username varchar(20); |
示例说明 | 将user表的username的类型改为varchar(20) |
6.2 增加表字段
基本语法:alter table 表名 add column 字段名 类型;
关键字:alter、add column
类别 | 详细解示 |
---|---|
基本语法 | alter table 表名 add column 字段名 类型; |
示例 | alter table user add column age int(3); |
示例说明 | 添加一个字段为age,类型为整型长度为3 |
6.3 增加字段时控制字段顺序
基本语法:alter table 表名 add 字段名 字段类型 after 字段名;
关键字:alter、add、after
类别 | 详细解示 |
---|---|
基本语法 | ALTER TABLE 表名 ADD 字段名 字段类型 AFTER 字段名; |
示例 | ALTER TABLE user ADD email VARCHAR(60) AFTER createip; ALTER TABLE user ADD id INT(10) FIRST; |
示例说明 | user表中,在createip后增加一个字段为email,类型为varchar,长度为60 ser表中在最开始的位置增加一个字段为id,类型为int,长度为10 |
6.4 删除表字段
基本语法:alter table 表名 drop column 字段名;
关键字:alter、drop column
类别 | 详细解示 |
---|---|
基本语法 | alter table 表名 drop column 字段名; |
示例 | alter table user drop column age; |
示例说明 | 在user表中删除字段age |
6.5 表字段改名
基本语法:alter table 表名 change 字段原名 字段新名 字段类型;
关键字:alter、change
类别 | 详细解示 |
---|---|
基本语法 | alter table 表名 change 字段原名 字段新名 字段类型; |
示例 | alter table user change email em varchar(60); |
示例说明 | 在user表中将字段中的email字段名字为em |
6.6 修改表字段排列顺序
在前的字段增加和修改语句(add/change/modify)中,最后都可以加一个可选项 first|after。
增加表字段时我们已经学过了如何调整顺序。我们现在在来看看另外的change或modify如何来调整顺序。
我们用first做个小实验。
使用modify调整顺序
mysql> alter table user modify em varchar(60) first;
Query OK, 0 rows affected (0.41 sec)
Records: 0 Duplicates: 0 Warnings: 0
输出结果:
mysql> desc user;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| em | varchar(60) | YES | | NULL | |
| username | varchar(20) | YES | | NULL | |
| password | varchar(32) | YES | | NULL | |
| createtime | int(10) | YES | | NULL | |
| createip | int(10) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
6.7 修改表名
基本语法:alter table 旧表名 rename 新的表名;
关键字:alter、rename
类别 | 详细解示 |
---|---|
基本语法 | alter table 旧表名 rename 新的表名; |
示例 | alter table user rename new_user; |
示例说明 | 将user表名改为new_user |
七. 数据类型
MySQL中存的是数据。只要是数据,我们就会规定数据的类型。在表的字段中规定了使用的是某个数据类型。那么,在插入的数据中就要使用对应的数据类型。并且,遵守数据类型的长度要求。
在MySQL里面我们将数据类型分为了以下一些类型:
- 数值类型(整型、浮点)
- 字符串类型
- 日期时间类型
- 复合类型
- 空间类型(非科学性工作基本不用,不做讲解)
1. 整型
数据类型 | 所占字节 | 值范围 |
---|---|---|
tinyint | 1字节 | -128~127 |
smallint | 2字节 | -32768~32767 |
mediumin | 3字节 | -8388608~8388607 |
int | 4字节 | -2147483648~2147483647 |
bigint | 8字节 | +-9.22*10的18次方 |
注意:
- MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展,这样当从数据库检索一个值时,可以把这个值加长到指定的长度。例如,指定一个字段的类型为 INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。需要注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。
- 在创建表字段时,性别我们可以使用无符号的微小整型(tinyint)来表示。用0表示女、用1表示男。用2表示未知。
- 同样人类年龄也是,在创建表字段时可用用无符号的整型。因为人类的年龄还没有负数
- 在实际使用过程中。我们业务中最大需要存储多大的数值。我们创建表时,就选择什么样的类型来存储这样的值。
2. 浮点类型
数据类型 | 所占字节 | 值范围 |
---|---|---|
float(m, d) | 4字节 | 单精度浮点型,m总个数,d小数位 |
double(m, d) | 8字节 | 双精度浮点型,m总个数,d小数位 |
decimal(m, d) | decimal是存储为字符串的浮点数 |
注意:
- 浮点是非精确值,会存在不太准确的情况
- 而decimal叫做定点数。在MySQL内部,本质上是用字符串存储的。实际使用过程中如果存在金额、钱精度要求比较高的浮点数存储,建议使用decimal(定点数)这个类型。
3. 字符类型
数据类型 | 所占字节 | 值范围 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-255字节 | 变长字符串 |
TINYBLOB | 0-255字节 | 不超过255个字符的二进制字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
BLOB | 0-65535字节 | 二进制形式的长文本数据 |
TEXT | 0-65535字节 | 长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LOGNGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
VARBINARY(M) | 允许长度0-M个字节的定长字节符串 | 值的长度+1个字节 |
BINARY(M) | M | 允许长度0-M个字节的定长字节符串 |
注意:
- CHAR 类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从0-255。比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补。
- VARCHAR 把这个大小视为值的大小,不长度不足的情况下就用空格补足。而 VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度
类型不会被空格填补,但长于指示器的值仍然会被截短。
因为VARCHAR类型可以根据实际内容动态改变存储值的长度,所以在不能确定字段需要多少字符时使用 VARCHAR 类型可以大大地节约磁盘空间、提高存储效率。- text类型与blob类型对于字段长度要求超过 255 个的情况下,MySQL 提供了 TEXT 和 BLOB 两种类型。根据存储数据的大小,它们都有不同的子类型。这些大型的数据用于存储文本块或图像、声音文件等二进制数据类型。
- TEXT 和 BLOB 类型在分类和比较上存在区别。BLOB 类型区分大小写,而 TEXT 不区分大小写。大小修饰符不用于各种 BLOB 和 TEXT 子类型。
4. 时间类型
数据类型 | 所占字节 | 值范围 |
---|---|---|
date | 3字节 | 日期,格式:2014-09-18 |
time | 3字节 | 时间,格式:08:42:30 |
datetime | 8字节 | 日期时间,格式:2014-09-18 08:42:30 |
timestamp | 4字节 | 自动存储记录修改的时间 |
year | 1字节 | 年份 |
注意:
- 时间类型在web系统中用的比较少,很多时候很多人喜欢使用int来存储时间。插入时插入的是unix时间戳,因为这种方式更方便计算。在前端业务中用date类型的函数,再将unix时间戳转成人们可识别的时间。
- 有些人为了在数据库管理中方便查看,也有人使用datetime类型来存储时间。
5. 复合类型
数据类型 | 说明 | 举例 |
---|---|---|
set | 集合类型 | set(“member”, “member2″, … “member64″) |
enum | 枚举类型 | enum(“member1″, “member2″, … “member65535″) |
注意:
一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。
ENUM 类型
1. ENUM 类型因为只允许在集合中取得一个值,有点类似于单选项。在处理相互排拆的数据时容易让人理解,比如人类的性别。ENUM 类型字段可以从集合中取得一个值或使用null值,除此之外的输入将会使 MySQL 在这个字段中插入一个空字符串。另外如果插入值的大小写与集合中值的大小写不匹配,MySQL会自动使用插入值的大小写转换成与集合中大小写一致的值。
2. ENUM 类型在系统内部可以存储为数字,并且从1开始用数字做索引。一个 ENUM 类型最多可以包含 65536 个元素,其中一个元素被 MySQL 保留,用来存储错误信息,这个错误值用索引 0 或者一个空字符串表示。
3. MySQL 认为 ENUM 类型集合中出现的值是合法输入,除此之外其它任何输入都将失败。这说明通过搜索包含空字符串或对应数字索引为 0 的行就可以很容易地找到错误记录的位置。
SET 类型
1. SET 类型SET 类型与 ENUM 类型相似但不相同。SET类型可以从预定义的集合中取得任意数量的值。并且与 ENUM 类型相同的是任何试图在 SET 类型字段中插入非预定义的值都会使MySQL插入一个空字符串。如果插入一个即有合法的元素又有非法的元素的记录,MySQL 将会保留合法的元素,除去非法的元素。
2. 一个 SET 类型最多可以包含 64 项元素。在 SET 元素中值被存储为一个分离的“位”序列,这些“位”表示与它相对应的元素。“位”是创建有序元素集合的一种简单而有效的方式。
并且它还去除了重复的元素,所以SET类型中不可能包含两个相同的元素。
希望从 SET 类型字段中找出非法的记录只需查找包含空字符串或二进制值为 0 的行。
6. 类型使用
我们学习了这么多类型,在创建表的语句的时候使用对应的类型即可。
举例如下:
CREATE TABLE IF NOT EXISTS demo (
id int(11) NOT NULL,
username varchar(50) NOT NULL,
password char(32) NOT NULL,
content longtext NOT NULL,
createtime datetime NOT NULL,
sex tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7. 字段(列)其他属性设置
(1) UNSIGNED(无符号)
主要用于整型和浮点类型,使用无符号。即,没有前面面的-(负号)。
存储位数更长。tinyint整型的取值区间为,-128-127。而使用无符号后可存储0-255个长度。
创建时在整型或浮点字段语句后接上:
unsigned
(2) ZEROFILL(0填充)
0(不是空格)可以用来真补输出的值。使用这个修饰符可以阻止 MySQL 数据库存储负值。
创建时在整型或浮点字段语句后接上:zerofill
(3) default
default属性确保在没有任何值可用的情况下,赋予某个常量值,这个值必须是常量,因为MySQL不允许插入函数或表达式值。此外,此属性无法用于BLOB或TEXT列。如果已经为此列指定了NULL属性,没有指定默认值时默认值将为NULL,否则默认值将依赖于字段的数据类型。
创建时在整型或浮点字段语句后接上:default ‘值’
(4) not null
如果将一个列定义为not null,将不允许向该列插入null值。建议在重要情况下始终使用not null属性,因为它提供了一个基本验证,确保已经向查询传递了所有必要的值。
创建时在整型或浮点字段语句后接上:not null (5) null
为列指定null属性时,该列可以保持为空,而不论行中其它列是否已经被填充。记住,null精确的说法是“无”,而不是空字符串或0。
创建时在整型或浮点字段语句后不要声明not null即可。
八. 索引
索引看着挺高大上的一个名字,说白了就是我们书最新面的目录。 (ง •_•)ง
索引用于快速找出在某个列中有一特定值的行。
不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。
当然索引也不易过多,索引越多写入,修改的速度越慢。因为,写入修改数据时,也要修改索引。
索引类型 | 功能说明 |
---|---|
普通索引 | 最基本的索引,它没有任何限制 |
唯一索引 | 某一行企用了唯一索引则不准许这一列的行数据中有重复的值。针对这一列的每一行数据都要求 是唯一的 |
主键索引 | 它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户 ID。类似于书中的页码 |
全文索引 | 对于需要全局搜索的数据,进行全文索引 |
1. 普通索引
类型 | 详细说明 |
---|---|
基本语法 | alter table 表 add index(字段) |
示例 | ALTER TABLE money ADD INDEX(username); |
示例解释 | 为money表的username字段增加索引 |
2. 唯一索引
类型 | 详细说明 |
---|---|
基本语法 | alter table 表 add UNIQUE(字段) |
示例 | ALTER TABLE money ADD UNIQUE(email); |
示例解释 | 为money表的email字段增加唯一索引 |
3. 全文索引
类型 | 详细说明 |
---|---|
基本语法 | alter table 表 add FULLTEXT(字段) |
示例 | ALTER TABLE money ADD FULLTEXT(content); |
示例解释 | 为money表的content字段增加唯一索引 |
4. 主键索引
类型 | 详细说明 |
---|---|
基本语法 | alter table 表 add PRIMARY KEY(字段) |
示例 | ALTER TABLE money ADD PRIMARY KEY(id); |
示例解释 | 为money表的id字段增加主键索引 |
5. 创建表时也可以声明索引
创建表时可在创建表语句后加上对应的类型即可声明索引:
PRIMARY KEY(字段)
INDEX [索引名] (字段)
FULLTEXT [索引名] (字段)
UNIQUE[索引名] (字段)
注:中括号中的索引名,代表可选。
整体示例如下:
CREATE TABLE test (
id INT NOT NULL ,
username VARCHAR(20) NOT NULL ,
password INT NOT NULL ,
content INT NOT NULL ,
PRIMARY KEY (id),
INDEX pw (password),
UNIQUE (username),
FULLTEXT (content)
) ENGINE = InnoDB;
九. 多表联合查询
很多时候在实际的业务中我们不只是查询一张表、在电子商务系统中,查询哪些用户没有购买过产品、银行中可能查询违规记录,同时查询出用户的查询中奖信息和中奖人员的基本信息、以上只是列的情况我们就需要把两张表在一起进行查询。而上述业务中需要多表联合在一起查询才能有结果,而多表联合查询的本质是:表连接。
9.1 表连接
当需要查询多个表中的字段时,就可以使用表连接来实现。表联接分为内连接和外连接。
内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。外连接:会选出其他不匹配的记录,分为外左联结和外右联结。
在学习实验前,我为大家准备了两个模拟的数据表:
用户表,存放用户信息
订单表,存放哪个用户购买过哪个商品
user表创建语句:
CREATE TABLE IF NOT EXISTS user (
uid int(11) NOT NULL,
username varchar(30) NOT NULL,
password char(32) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS order_goods (
oid int(11) NOT NULL,
uid int(11) NOT NULL,
name varchar(50) NOT NULL,
buytime int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
user表数据如下:
uid username password
1 景甜 123456
2 王小二 245667
3 王宝强 1235531
4 井柏然 123455
5 范冰冰 5abcwa
6 黄晓明 abcdeef
7 anglebaby caption
8 TFBOYS abcdwww
9 安小超 12tfddwd
10 高小峰 3124qwqw
11 李小强 323fxfvdvd
12 李小超 311aqqee
13 韩小平 121rcfwrfq
14 宋小康 123123tcsd
15 佟小刚 3cxvdfs
order_goods数据如下:
oid uid name buytime
1 10 苹果鼠标 1212313
2 3 iphone 12s 123121241
3 12 雪碧 13232333
4 15
34242123
5 3 iphone 键盘 12123413
注意:在上表order_goods表中uid是指user表中的uid字段。上表中oid为1的数据行,uid为10的用户。为user表中uid为10的用户:高小峰。该用户购买了商品为苹果鼠标。购买时间buytime为一个unix时间戳。
9.2 内连接
基本语法一:
类型 | 详细说明 |
---|---|
基本语法 | select 表1.字段 [as 别名],表n.字段 from 表1 [别名],表n where 条件; |
示例 | select user.uid ,user.username as username,order_goods.oid,order_goods.uid, order_goods.name as shopname from user,order_goods where user.uid = order_goods.uid; |
示例说明 | 查询商品表中哪些用户购买过商品,并将用户信息显示出来 |
注:下例中from 表使用到了表别名。
由于表名太长,每次写的时候容易写错。我们可以在表后直接跟上一个简写英文字符串。在前面拼接字段时,直接使用简写字符串.字段即可。
mysql> select u.uid ,u.username as username,o.oid,o.uid,o.name as shopname from user u,
order_goods o where u.uid = o.uid;
+-----+-----------+-----+-----+---------------+
| uid | username | oid | uid | shopname |
+-----+-----------+-----+-----+---------------+
| 10 | 高小峰 | 1 | 10 | 苹果鼠标 |
| 3 | 王宝强 | 2 | 3 | iphone 12s |
| 12 | 李小超 | 3 | 12 | 雪碧 |
| 15 | 佟小刚 | 4 | 15 | |
| 3 | 李文凯 | 5 | 3 | iphone 键盘 |
+-----+-----------+-----+-----+---------------+
5 rows in set (0.00 sec)
基本语法二:
类型 | 详细说明 |
---|---|
基本语法 | select 表1.字段 [as 别名],表n.字段 from 表1 INNER JOIN 表n on 条件; |
示例 | select user.uid ,user.username as username,order_goods.oid,order_goods.uid, order_goods.name as shopname from user inner join order_goods on user.uid = order_goods.uid; |
示例说明 | 查询商品表中哪些用户购买过商品,并将用户信息显示出来 |
结果与基本语法1中一致。
mysql> select user.uid ,user.username as username,order_goods.oid,
order_goods.uid,order_goods.name as shopname from user inner join order_goods on
user.uid = order_goods.uid;
+-----+-----------+-----+-----+---------------+
| uid | username | oid | uid | shopname |
+-----+-----------+-----+-----+---------------+
| 10 | 高小峰 | 1 | 10 | 苹果鼠标 |
| 3 | 王宝强 | 2 | 3 | iphone 12s |
| 12 | 李小超 | 3 | 12 | 雪碧 |
| 15 | 佟小刚 | 4 | 15 | |
| 3 | 王宝强 | 5 | 3 | iphone 键盘 |
+-----+-----------+-----+-----+---------------+
5 rows in set (0.00 sec)
9.3 外连接
外连接:左连接、右连接。关键字:left join、on、right join
说明 | 详解 |
---|---|
基本语法 | select 表1.字段 [as 别名],表n.字段 from 表1 LEFT JOIN 表n on 条件; |
示例 | select * from user left join order_goods on user.uid = order_goods.uid; |
示例说明 | 以左边为主,查询哪些用户未购买过商品,并将用户信息显示出来 |
左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录。
mysql> select * from user left join order_goods on user.uid = order_goods.uid;
+-----+-----------+------------+------+------+---------------+-----------+
| uid | username | password | oid | uid | name | buytime |
+-----+-----------+------------+------+------+---------------+-----------+
| 10 | 高小峰 | 3124qwqw | 1 | 10 | 苹果鼠标 | 1212313 |
| 3 | 王宝强 | 1235531 | 2 | 3 | iphone 12s | 123121241 |
| 12 | 李小超 | 311aqqee | 3 | 12 | 雪碧 | 13232333 |
| 15 | 佟小刚 | 3cxvdfs | 4 | 15 | | 34242123 |
| 3 | 王宝强 | 1235531 | 5 | 3 | iphone 键盘 | 12123413 |
| 1 | 景甜 | 123456 | NULL | NULL | NULL | NULL |
| 2 | 王小二 | 245667 | NULL | NULL | NULL | NULL |
| 4 | 井柏然 | 123455 | NULL | NULL | NULL | NULL |
| 5 | 范冰冰 | 5abcwa | NULL | NULL | NULL | NULL |
| 6 | 黄晓明 | abcdeef | NULL | NULL | NULL | NULL |
| 7 | anglebaby | caption | NULL | NULL | NULL | NULL |
| 8 | TFBOYS | abcdwww | NULL | NULL | NULL | NULL |
| 9 | 安小超 | 12tfddwd | NULL | NULL | NULL | NULL |
| 11 | 李小强 | 323fxfvdvd | NULL | NULL | NULL | NULL |
| 13 | 韩小平 | 121rcfwrfq | NULL | NULL | NULL | NULL |
| 14 | 宋小康 | 123123tcsd | NULL | NULL | NULL | NULL |
+-----+-----------+------------+------+------+---------------+-----------+
16 rows in set (0.00 sec)
右连接:包含所有的右边表中的记录甚至是右边表中没有和它匹配的记录。
说明 | 详解 |
---|---|
基本语法 | select 表1.字段 [as 别名],表n.字段 from 表1 right JOIN 表n on 条件; |
示例 | select * from user right join order_goods on user.uid = order_goods.uid; |
示例说明 | 查询商品表中哪些用户购买过商品,并将用户信息显示出来 |
mysql> select * from user right join order_goods on user.uid = order_goods.uid;
+------+-----------+----------+-----+-----+---------------+-----------+
| uid | username | password | oid | uid | name | buytime |
+------+-----------+----------+-----+-----+---------------+-----------+
| 10 | 高小峰 | 3124qwqw | 1 | 10 | 苹果鼠标 | 1212313 |
| 3 | 王宝强 | 1235531 | 2 | 3 | iphone 12s | 123121241 |
| 12 | 李小超 | 311aqqee | 3 | 12 | 雪碧 | 13232333 |
| 15 | 佟小刚 | 3cxvdfs | 4 | 15 | | 34242123 |
| 3 | 王宝强 | 1235531 | 5 | 3 | iphone 键盘 | 12123413 |
+------+-----------+----------+-----+-----+---------------+-----------+
5 rows in set (0.00 sec)
9.4 子查询
有时候,当我们查询的时候,需要的条件是另外一个select语句的结果,这时就需要使用子查询。
用于子查询的关键字包括in、not in、=、!=、exists、not exists等。
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 where 字段 in(条件) |
示例1 | select * from user where uid in (1,3,4); |
示例1说明 | 按照id 查询指定用户 |
示例2 | select * from user where uid in (select uid from order_goods); |
示例2说明 | 将购买过商品的用户信息显示出来 |
示例1:
mysql> select * from user where uid in (1,3,4);
+-----+-----------+----------+
| uid | username | password |
+-----+-----------+----------+
| 1 | 景甜 | 123456 |
| 3 | 王宝强 | 1235531 |
| 4 | 井柏然 | 123455 |
+-----+-----------+----------+
3 rows in set (0.00 sec)
示例2:
mysql> select * from user where uid in (select uid from order_goods);
+-----+-----------+----------+
| uid | username | password |
+-----+-----------+----------+
| 10 | 高小峰 | 3124qwqw |
| 3 | 王宝强 | 1235531 |
| 12 | 李小超 | 311aqqee |
| 15 | 佟小刚 | 3cxvdfs |
+-----+-----------+----------+
4 rows in set (0.00 sec)
mysql> select * from emp where deptno in (select deptno from dept);
9.5 记录联合
使用 union 和 union all 关键字,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示。两者主要的区别是把结果直接合并在一起,而 union 是将 union all 后的结果进行一次distinct,去除重复记录后的结果。
关键字包括union、union all、distinct等。
类别 | 详细解示 |
---|---|
基本语法 | select语句1 union[all] select语句2 |
示例 | select * from user where uid in (1,3,4); |
示例说明 | 将商品表中的用户信息和用户表中的用户信息的结果组合在一起 |
mysql> select uid from user union select uid from order_goods;
+-----+
| uid |
+-----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
+-----+
15 rows in set (0.00 sec)
十. 增删改查之插入记录
插入记录有两种个基本语法。
插入基本语法一
类别 | 详细解示 |
---|---|
基本语法 | insert into 表 values(值1,值2,值n); |
示例 | INSERT INTO user values(2,’php中文网’,’男’) |
示例说明 | 向user表中插入值id为2,姓名为李文凯,性别为男 |
插入基本语法二
类别 | 详细解示 |
---|---|
基本语法 | insert into 表(字段1,字段2,字段n) values(值1,值2,值n); |
示例 | INSERT INTO user(id,username,sex) values(213,’小沈阳’,1); |
示例说明 | 向user表中插入id为213,username为小沈阳,性别为1 |
基本语法1和基本语法2的区别是:
- 基本语法1的插入语句,表中有多少个字段就必须要插入多少个值。一个不能多,一个也不能少。若有默认值,不想传,可以写上null。
- 基本语法2中,除非有必填字段必须要写入值外。如果有默认值的不想写可以忽略不写。mysql会自动补主默认值。
- 基本语法2中,以user(id,username,sex)字段顺序为值的顺序。
假设有一张表为user表,我们对字段、字段说明、类型和字段选填和必须状态进行说明,表结构如下:
字段 | id | username | password | sex | |
---|---|---|---|---|---|
中文说明 | 编号 | 用户名 | 邮箱 | 密码 | 性别 |
类型说明 | int | varchar(50) | varchar(60) | varchar(32) | tinyint |
默认值说明 | 自增 | 必填 | 选填字段,默认值为123@php.cn | 选填字段 | 必填字段 |
按照基本语法一写上表中的插入语句:
INSERT INTO user values(null,'php中文网','pig@php.cn',null ,1);
注意:
- 可以不指定字段名称,但是 values 后面的顺序应该和表字段的排序一致。
- 有默认值的字段可以不写,则为默认值。
- 如果有默认值或者可空字段不想传入具体值,可写入null。
数据格式必须要与表规定的数据格式一致。
按照基本语法二写上表中的插入语句:
INSERT INTO user(username,sex) values('php中文网',1);
注意:
1. ID为自增的自段可以不用传入值,每插入一次这个字段的值会自动向上加1。
2. 有默认值和可为空的字段可不传
3. 以表user(username,sex)的插入顺序为准
4. 基本语法二为更常用的用法
基本语法变形:一次插入多条记录
INSERT INTO user(username,password,sex)
values('胡歌', 'abcdef', 1),
( '霍建华', 'bcdeef', 0),
( '张靓颖', '123456', 1),
('刘诗诗', '987654', 1);
十一. 增删改查之查询记录
下面定义了一个表结构,表名为money,表中存放着银行的余额和用户的基本信息。
[视频教程]
创建表的语句如下:
CREATE TABLE money (
id INT NOT NULL AUTO_INCREMENT ,
username VARCHAR(50) NOT NULL ,
balance FLOAT NOT NULL ,
province VARCHAR(20) NOT NULL ,
age TINYINT UNSIGNED NOT NULL ,
sex TINYINT NOT NULL ,
PRIMARY KEY (id(10))
) ENGINE = InnoDB CHARACTER SET utf8;
表结构和数据展示如下:(注:balance是指余额、province是指省份)
id | username | balance | province | age | sex |
---|---|---|---|---|---|
1 | 王宝强 | 120.02 | 上海 | 29 | 1 |
2 | 范冰冰 | 260.23 | 山东 | 40 | 0 |
3 | 黄晓明 | 150.86 | 山东 | 40 | 1 |
4 | 井柏然 | 810 | 辽宁 | 27 | 1 |
5 | 李冰冰 | 20.15 | 黑龙江 | 43 | 0 |
6 | 成龙 | 313 | 山东 | 63 | 1 |
7 | 杨幂 | 123 | 北京 | 30 | 0 |
8 | 刘诗诗 | 456 | 北京 | 29 | 1 |
9 | 柳岩 | 23.4 | 湖南 | 36 | 0 |
10 | 赵本山 | 3456 | 辽宁 | 63 | 1 |
11 | 汪峰 | 34.32 | 北京 | 44 | 1 |
12 | 郭德纲 | 212 | 天津 | 43 | 1 |
11.1 基础查询
类别 | 详细解示 |
---|---|
基本语法 | select * from 表; |
示例 | select * from money; |
示例说明 | 查询money表中所有字段中的所有结果 |
注:” * ” 是一种正则表达式的写法,表示匹配所有,上面的查询语句和下面的是等价:
mysql> select * from money;
+----+-----------+---------+-----------+-----+-----+
| id | username | balance | province | age | sex |
+----+-----------+---------+-----------+-----+-----+
| 1 | 王宝强 | 120.02 | 湖北 | 29 | 1 |
| 2 | 范冰冰 | 260.23 | 山东 | 40 | 0 |
| 3 | 黄晓明 | 150.86 | 山东 | 40 | 1 |
| 4 | 井柏然 | 810 | 辽宁 | 27 | 1 |
| 5 | 李冰冰 | 20.15 | 黑龙江 | 43 | 0 |
| 6 | 成龙 | 313 | 山东 | 63 | 1 |
| 7 | 杨幂 | 123 | 北京 | 30 | 0 |
| 8 | 刘诗诗 | 456 | 北京 | 29 | 1 |
| 9 | 柳岩 | 23.4 | 湖南 | 36 | 0 |
| 10 | 赵本山 | 3456 | 辽宁 | 63 | 1 |
| 11 | 汪峰 | 34.32 | 北京 | 44 | 1 |
| 12 | 郭德纲 | 212 | 天津 | 43 | 1 |
+----+-----------+---------+-----------+-----+-----+
12 rows in set (0.00 sec)
11.2 指定字段查询
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表; |
示例 | select id,username, balance from money; |
示例说明 | 查询money表中id,username, balance字段中的所有结果 |
mysql> select id,username, balance from money;
+----+-----------+---------+
| id | username | balance |
+----+-----------+---------+
| 1 | 王宝强 | 120.02 |
| 2 | 范冰冰 | 260.23 |
| 3 | 黄晓明 | 150.86 |
| 4 | 井柏然 | 810 |
| 5 | 李冰冰 | 20.15 |
| 6 | 成龙 | 313 |
| 7 | 杨幂 | 123 |
| 8 | 刘诗诗 | 456 |
| 9 | 柳岩 | 23.4 |
| 10 | 赵本山 | 3456 |
| 11 | 汪峰 | 34.32 |
| 12 | 郭德纲 | 212 |
+----+-----------+---------+
12 rows in set (0.00 sec)
11.3 查询单个字段不重复记录 distinct
类别 | 详细解示 |
---|---|
基本语法 | select distinct 字段 from 表; |
示例 | select distinct age deptno from money; |
示例说明 | 查询money表中年龄唯一的所有结果 |
mysql> select distinct age deptno from money;
+--------+
| deptno |
+--------+
| 29 |
| 40 |
| 27 |
| 43 |
| 63 |
| 30 |
| 36 |
| 44 |
+--------+
8 rows in set (0.00 sec)
11.4 条件查询 where
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 where where条件; |
示例 | select * from money where age = 29; |
示例说明 | 查询money表中年龄为29的所有结果 |
mysql> select * from money where age = 29;
+----+-----------+---------+----------+-----+-----+
| id | username | balance | province | age | sex |
+----+-----------+---------+----------+-----+-----+
| 1 | 李文凯 | 120.02 | 湖北 | 29 | 1 |
| 8 | 刘诗诗 | 456 | 北京 | 29 | 1 |
+----+-----------+---------+----------+-----+-----+
2 rows in set (0.00 sec)
where后可接的条件
比较运算符
比较运算符结果集中将符合条件的记录列出来。上面的例子中,where 后面的田间是一个字段的 ‘=’。
除此之外,还可以使用>、<、>=、<=、!=等比较运算符;
逻辑运算符
多个条件还可以使用 or 、 and 等逻辑运算符进行多条件联合查询
or 或者
and 并且
我们来看一下多个条件的例子:
类别 | 详细内容 |
---|---|
示例 | select * from money where id <10 and |
说明 | 查询所有字段 要求id小于10 并且province=’湖北’ |
mysql> select * from money where id <10 and province='湖北';
+----+-----------+---------+----------+-----+-----+
| id | username | balance | province | age | sex |
+----+-----------+---------+----------+-----+-----+
| 1 | 王宝强 | 120.02 | 湖北 | 29 | 1 |
+----+-----------+---------+----------+-----+-----+
1 row in set (0.00 sec)
11.5 结果集排序
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 order by 字段 排序关键词 |
示例 | select id,username, balance from money order by balance desc; |
示例说明 | 查询money表中的id,username,balance字段,按照余额进行降序排序 |
排序用到的关键词:
关键词 | 说明 |
---|---|
asc | 升序排列,从小到大(默认) |
desc | 降序排列,从大到小 |
在 select 出来之后的结果集中排序使用 order by ,其中 desc 和 asc 是排序顺序中的关键字。desc 表示按照字段进行降序排列,asc 表示升序排列,如果不写关键字默认升序排列。
mysql> select id,username, balance from money order by balance desc;
+----+-----------+---------+
| id | username | balance |
+----+-----------+---------+
| 10 | 赵本山 | 3456 |
| 4 | 井柏然 | 810 |
| 8 | 刘诗诗 | 456 |
| 6 | 成龙 | 313 |
| 2 | 范冰冰 | 260.23 |
| 12 | 郭德纲 | 212 |
| 3 | 黄晓明 | 150.86 |
| 7 | 杨幂 | 123 |
| 1 | 王宝强 | 120.02 |
| 11 | 汪峰 | 34.32 |
| 9 | 柳岩 | 23.4 |
| 5 | 李冰冰 | 20.15 |
+----+-----------+---------+
12 rows in set (0.00 sec)
11.6 多字段排序
order by 后面可以跟多个不同的字段排序,并且排序字段的不同结果集的顺序也不同,如果排序字段的值一样,则值相同的字段按照第二个排序字段进行排序。
类别 | 详细解示 | |
---|---|---|
基本语法 | select 字段 from 表 order by 字段1 排序关键词,… …字段n desc | asc; |
示例 | select id,username, balance from money order by balance desc,age asc; | |
示例说明 | 查询money表中的id,username,balance字段,按照余额进行降序排序,若余额全都一样,则再使用age进行升序排序 |
注:如果第一个字段已经将结果给排好。第二个字段排序字段不生效。本例中,第二个字段无效
mysql> select id,username, balance from money order by balance desc,age asc;
+----+-----------+---------+
| id | username | balance |
+----+-----------+---------+
| 10 | 赵本山 | 3456 |
| 4 | 井柏然 | 810 |
| 8 | 刘诗诗 | 456 |
| 6 | 成龙 | 313 |
| 2 | 范冰冰 | 260.23 |
| 12 | 郭德纲 | 212 |
| 3 | 黄晓明 | 150.86 |
| 7 | 杨幂 | 123 |
| 1 | 王宝强 | 120.02 |
| 11 | 汪峰 | 34.32 |
| 9 | 柳岩 | 23.4 |
| 5 | 李冰冰 | 20.15 |
+----+-----------+---------+
12 rows in set (0.00 sec)
11.7 结果集限制
对于查询或者排序后的结果集,如果希望只显示一部分而不是全部,使用 limit 关键字结果集数量限制。
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 limit 数量; |
示例 | select id,username, balance from money limit 5; |
示例说明 | 显示前五个用户 |
mysql> select * from money limit 5;
+----+-----------+---------+-----------+-----+-----+
| id | username | balance | province | age | sex |
+----+-----------+---------+-----------+-----+-----+
| 1 | 王宝强 | 120.02 | 湖北 | 29 | 1 |
| 2 | 范冰冰 | 260.23 | 山东 | 40 | 0 |
| 3 | 黄晓明 | 150.86 | 山东 | 40 | 1 |
| 4 | 井柏然 | 810 | 辽宁 | 27 | 1 |
| 5 | 李冰冰 | 20.15 | 黑龙江 | 43 | 0 |
+----+-----------+---------+-----------+-----+-----+
5 rows in set (0.00 sec)
11.8 限制结果集并排序
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 order by 字段 关键词 limit 数量 |
示例 | select id,username, balance from money order by balance desc limit 5; |
示例说明 | 按照钱来排序,显示前五个最有钱的用户 |
mysql> select id,username, balance from money order by balance desc limit 5;
+----+-----------+---------+
| id | username | balance |
+----+-----------+---------+
| 10 | 赵本山 | 3456 |
| 4 | 井柏然 | 810 |
| 8 | 刘诗诗 | 456 |
| 6 | 成龙 | 313 |
| 2 | 范冰冰 | 260.23 |
+----+-----------+---------+
5 rows in set (0.00 sec)
11.9 结果集区间选择
假设我从第0条开始取了3条记录。又想再从第3条开始取3条记录。再想从第6条开始取4条记录怎么办?
这时候就需要使用到结果集区间选择。
类别 | 详细解示 |
---|---|
基本语法 | select 字段 from 表 limit 偏移量,数量 |
示例 | select id,username, balance from money limit 0,3; |
示例说明 | 从第一条开始取三条记录 |
注:第一条记录为0。
mysql> select id,username, balance from money limit 0,3;
+----+-----------+---------+
| id | username | balance |
+----+-----------+---------+
| 1 | 王宝强 | 120.02 |
| 2 | 范冰冰 | 260.23 |
| 3 | 黄晓明 | 150.86 |
+----+-----------+---------+
3 rows in set (0.00 sec)
从第三条开始再取三条呢?
mysql> select id,username, balance from money limit 3,3;
+----+-----------+---------+
| id | username | balance |
+----+-----------+---------+
| 4 | 井柏然 | 810 |
| 5 | 李冰冰 | 20.15 |
| 6 | 成龙 | 313 |
+----+-----------+---------+
3 rows in set (0.00 sec)
通过上面的这个思路,显示就完成了分页。
每页显示10条记录,那么:
第1页为 limit 0,10
第2页为 limit 10,10
第3页为 limit 20,10
依此类推… …
11.10 统计类函数使用
如果我们想知道总用户数怎么办?
查询谁是数据表里的首富怎么办?
如果我们想知道用户的平均金额怎么办?
如果我们想知道所有用户的总金额怎么办?
统计类函数最常用的我们有四个:
函数 | 说明 |
---|---|
sum | 求和 |
count | 统计总数 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
注:当然你知道其他的mysql函数也可以使用。不过,在实际工作中,大公司的很多大中型项上很少使用,他们都有专门的计数服务器。因为,mysql的计算量本身很大,为了减少压力通常我们将实际的计算任务交给业务服务器或其他服务器来完成。
类别 | 详细解示 |
---|---|
基本语法 | select 函数(字段) from 表 |
示例 | select count(id) from money |
示例说明 | 查询money表的id总数 |
mysql> select count(id) from money;
+-----------+
| count(id) |
+-----------+
| 12 |
+-----------+
1 row in set (0.00 sec)
你还可以给字段取别名哟!使用as关键字。
mysql> select count(id) as zongshu from money;
+---------+
| zongshu |
+---------+
| 12 |
+---------+
1 row in set (0.00 sec)
11.11 分组 group by
我们拿金额表里面的省份进行分组数据,分组数据后你会发现。有相同的省份会去掉。即,一个省份为一个组。
类别 | 详细解示 |
---|---|
基本语法 | select * from 表 group by 字段 |
示例 | select * from money group by province; |
示例说明 | 按照地区进行分组 |
统计分组(分类)各总数:
mysql> select deptno, count(1) from emp group by deptno;
+--------+----------+
| deptno | count(1) |
+--------+----------+
| 1 | 1 |
| 2 | 5 |
| 3 | 1 |
| 5 | 4 |
+--------+----------+
4 rows in set (0.04 sec)
统计省份数量后再进行分组显示
mysql> select count(province),province from money group by province;
+-----------------+-----------+
| count(province) | province |
+-----------------+-----------+
| 3 | 北京 |
| 1 | 天津 |
| 3 | 山东 |
| 1 | 湖北 |
| 1 | 湖南 |
| 2 | 辽宁 |
| 1 | 黑龙江 |
+-----------------+-----------+
7 rows in set (0.00 sec)
11.12 在分组基础上进行统计
with rollup用的很少。这个知识点设置为了解级别。
它的主要功能是对于分组的数据进行统计后,再进行一次总数统计。
类别 | 详细解示 |
---|---|
基本语法 | select * from 表 group by 字段 with rollup |
示例 | select count(province),province from money group by province with rollup; |
示例说明 | 对分组的数再次进行统计 |
在上面的基础上统计总数,下例结果中,最后多了一个12 NULL。
mysql> select count(province),province from money group by province with rollup;
+-----------------+-----------+
| count(province) | province |
+-----------------+-----------+
| 3 | 北京 |
| 1 | 天津 |
| 3 | 山东 |
| 1 | 湖北 |
| 1 | 湖南 |
| 2 | 辽宁 |
| 1 | 黑龙江 |
| 12 | NULL |
+-----------------+-----------+
8 rows in set (0.00 sec)
11.13 结果再过滤having
having子句与where有相似之处但也有区别,都是设定条件的语句。
having 是筛选组 而where是筛选记录。
类别 | 详细解示 |
---|---|
基本语法 | select * from 表 group by 字段 having 条件 |
示例 | select count(province) as result ,province from money group by province having result >2; |
示例说明 | 对地区分组并统计总数,将分组结果中大于2的分组地区显示出来 |
mysql> select count(province) as result ,province from money group by province having result >2;
+--------+----------+
| result | province |
+--------+----------+
| 3 | 北京 |
| 3 | 山东 |
+--------+----------+
2 rows in set (0.00 sec)
11.14 整体使用SQL
我们在上面的语句中都是单一使用的某些语句,没有整体使用过。
我们现在将语句进行整合后,配合使用一次。整体的SQL语句配合使用的语法结构如下:
SELECT
[字段1 [as 别名1],[函数(字段2) ,]......字段n]
FROM 表名
[WHERE where条件]
[GROUP BY 字段]
[HAVING where_contition]
[order 条件]
[limit 条件]
注:上面的语句中可以[] 代表可选。
最终的语法总结如下:
关键词 | 说明 |
---|---|
select | 选择的列 |
from | 表 |
where | 查询的条件 |
group by | 分组属性 having 分组过滤的条件 |
order by | 排序属性 |
limit | 起始记录位置,取记录的条数 |
我们进行一次整体的给合使用,查询money表字段:id,username,balance,province 要求id>1 余额大于50,使用地区进行分组。我们使用用户id进行降序,要求只准显示3条。
最后将SQL语句写成,查询出来的结果如下:
mysql> select id,username,balance,province from money where id > 1 and balance > 50 group by province order by id desc limit 3;
+----+-----------+---------+----------+
| id | username | balance | province |
+----+-----------+---------+----------+
| 12 | 郭德纲 | 212 | 天津 |
| 7 | 杨幂 | 123 | 北京 |
| 4 | 井柏然 | 810 | 辽宁 |
+----+-----------+---------+----------+
3 rows in set (0.00 sec)
十二. 增删改查之更新记录
更新数据我们已经说过。需要修改内容,修改银行卡余额,修改装备信息的时候都需要使用到update,修改语句。
关键词:update
修改(也叫更新)语句的基本语语法如下:
类别 | 详细解示 |
---|---|
基本语法 | update 表名 set 字段1=值1,字段2=值2,字段n=值n where 条件 |
示例 | update money set balance=balance-500 where userid = 15; |
示例说明 | 修改money表,将balance余额减500。要求userid为15 |
假设我们有下面这一个表,表结构如下:
userid | username | balance |
---|---|---|
1 | 王宝强 | 50000.00 |
2 | 胡歌 | 150000000.00 |
15 | 马云 | 15000.00 |
16 | 陈赫 | 1234131.00 |
mysql> select * from emp where deptno=15;
+------+----------+----------+
| userid |username| balance |
+------+----------+----------+
| 15 | 马云 | 15000.00 |
+------+-------+-------------+
1 row in set (0.00 sec)
使用 update 语句进行记录更新
mysql> update money set balance=balance-500 where userid = 15;
Query OK, 1 row affected (0.35 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from emp where deptno=15;
+------+----------+----------+
| userid |username| balance |
+------+----------+----------+
| 15 | 马云 | 14500.00 |
+------+-------+-------------+
1 row in set (0.00 sec)
修改多个字段
mysql> update money set balance=balance-500,username='李文凯' where userid = 15;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from emp where deptno=15;
+------+----------+----------+
| userid |username| balance |
+------+----------+----------+
| 15 |王宝强 | 14500.00 |
+------+-------+-------------+
1 row in set (0.00 sec)
同时对两个表进行更新
类别 | 详细解示 |
---|---|
基本语法 | update 表1,表2 set 字段1=值1,字段2=值2,字段n=值n where 条件 |
示例 | update money m,user u m.balance=m.balance*u.age where m.userid=u.id; |
示例说明 | 修改money,将money表的别名设置为m;user表的别名设置为u;将m表的余额改为m表的 balance*用户表的age。执行条件是:m.userid = u.id |
mysql> update money m,user u m.balance=m.balance*u.age where m.userid=u.id;
十三. 增删改查之删除记录
使用关键词:delete
类别 | 详细解示 |
---|---|
基本语法 | DELETE FROM 表 [where 条件]; |
示例 | DELETE FROM user where id > 10; |
示例说明 | 删除掉用户表中id大于10的所有用户 |
user表,表结构如下:
userid | username | balance |
---|---|---|
1 | 王宝强 | 50000.00 |
2 | 胡歌 | 150000000.00 |
15 | 马云 | 15000.00 |
16 | 陈赫 | 1234131.00 |
mysql> DELETE FROM user where id = 1;
Query OK, 1 row affected (0.08 sec)
删除掉了id为1的,李文凯这一行的记录
清空表记录
delete和truncate是一样的,但它们有一点不同,那就是DELETE可以返回被删除的记录数,而TRUNCATE TABLE返回的是0。
如果一个表中有自增字段,使用truncate table 这个自增字段将起始值恢复成1.
类别 | 说明 |
---|---|
基本语法 | TRUNCATE TABLE 表名; |
示例 | TRUNCATE TABLE user; |
示例说明 | 清空表的数据,并且让自增的id从1开始自增 |
切记:
1.删除时一定要记住加上where条件,不然会清空掉整个表的记录。
2.删除重要数据前一定要备份、备份、备份。
十四. 数据控制语言DCL
创建库用户(注:可以针对一个用户增加多条权限。)
添加权限:类别 | 详细解示 |
---|---|
基本语法 | grant 权限 on 库.表 to ‘用户‘@’主机’ identified by ‘密码’; |
示例 | grant select, insert on test.* to ‘liwenkai‘@’localhost’ identified by ‘4311’; |
示例说明 | 给予liwenkai用户,在本机连接test库所有表的权限。操作的这些表具有查询和写入权限 |
删除权限:
类别 | 详细解示 |
---|---|
基本语法 | revoke 权限 on 库.表 from ‘用户‘@’主机’; |
示例 | revoke select, insert on test.* to ‘liwenkai‘@’localhost’ identified by ‘4311’; |
示例说明 | 给予liwenkai用户,在本机连接test库所有表的权限。操作的这些表具有查询和写入权限 |
参数说明:
符号 | 说明 |
---|---|
grant all | 在grant后接all说明给予所有权限 |
revoke all | 在revoke后接all说明删除所有权限 |
权限 on . | . 所明给予所有库所有表的操作权限 |
‘用户‘@’主机’ | 主机里面若为%。任意来源的主机均可以使用这个用户来访问 |
创建数据库用户liwenkai ,具有对test数据库中所有标的select / insert 权限
示例:增加权限
mysql> grant select, insert on test.* to 'liwenkai'@'localhost' identified by '4311';
Query OK, 0 rows affected (0.00 sec)
示例:移除权限
mysql> revoke insert on test.* from 'liwenkai'@'localhost';
Query OK, 0 rows affected (0.30 sec)
注:
上面的一些语句用的较少。你可以将知识点的掌握级别设置为了解级别。
更多的时候,权限设置项特别多,人们往往记不住具体的命令。更多 的时候人们使用专门的工具来操作权限。