前言
本文主要记录的就是有关数据库的操作基础以及相关内容,在安全中sql注入是OWASP top10中的存在,那么相关的数据库知识是最重要的,一个企业的根基也在于此,所以数据库可以说是必须掌握的。
而这里又以mysql为例,毕竟mysql是广泛通用的语言,其环境搭建也异常简单,比如利用phpstudy即可完成。
第一章 MySQL是什么?
MySQL数据库简称MySQL,是一款由瑞典MySQL AB公司开发并且应用广泛的数据管理系统,MySQL数据库因其体积小、速度快、总体拥有成本低受到很多的热捧。现在,MySQL的所有者世界上最著名的数据库企业——Oracle所有。
MySQL的应用,在国内的企业包括:百度、阿里、腾讯、新浪、搜狐、网易等等企业,全部都在使用MySQL数据库。
MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。
由于MySQL是开放源代码的,因此任何人都可以在GPL的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。
PHP与很多数据库结合都很紧密。由于,PHP和MySQL都是开源免费的。所以PHP一直对于MySQL等数据库都有很好的支持。
第二章 数据库的五个基本单位
- 数据库服务器
- 数据库
- 数据表
- 数据字段
- 数据行
我们现在来对上面的五个基本单位进行说明:
数据库服务器:是指用来运行数据库服务的一台电脑。在中小型企业通常为一台。在数据存储量计算量很大的时候可以存在多台。多台数据库服务器共同来存储或计算。由于数据安全非常重要,我们经常会对数据库服务器里面的数据进经备份。
数据库:一个数据库服务器里面有可以有多个数据库。主要用来分类使用。我们可以建立交通信息数据库、游戏数据库、酒店开房数据库... ...
主要用来将各个不同用途的数据,按照业务进行大块的划分。
数据表:例如在游戏数据库中。根据这一款游戏又分为了不同的数据表。专门用来区分游戏不同的数据。例如:用户数据(用户、密码);人物数据;所有装备和装备信息;用户的充值信息;药品、魔力药水信息...
...等
数据字段:也叫数据列。就是我们日常所见表格里面的列。在表格中,我们会将一张用户表分成多个列。如下(表一)所示:用户编号、用户名、性别、年龄是字段。在真正的数据库中数据字段需要换成英文需要写成:id、username、sex、年龄。
数据行:真正的数据存在每一个表的行里面。字段(列)划分出来了一个表应该按照什么样的格式存数据。而行,是真正的数据。每一行需要遵循数据字段(列)的规范和要求进行存入数据。
例如:
用户编号 | 用户名 | 性别 | 年龄 |
---|---|---|---|
1 | 李文凯 | 男 | 18 |
2 | 景田 | 女 | 16 |
3 | 宁泽涛 | 男 | 22 |
第三章 Mysql连接数据库
方法一
安装后,可以在开始菜单的列表中找到MySQL Command Line 点击操作的命令行终端操作。效果如图:
方法二
如果加入到了windows的环境变量中,可以在命令行下直接操作。 在命令行下,通过以下命可以连接到数据库服务器:
mysql -h localhost -u root -p
上面的命令中: mysql 表示 mysql数据库启动工具。
参数说明:
参数 | 说明 |
---|---|
-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次。
第四章 Mysql数据库操作
一、创建数据库
类别 | 详细解示 |
---|---|
基本语法 | CREATE DATABASE 数据库名; |
示例 | CREATE DATABASE PHP; |
示例说明 创建一个数库,数据库的名字为PHP
示例:
CREATE DATABASE PHP;
Query OK, 1 row affected (0.00 sec)
“Query OK” 表示上面的命令执行成功,所有的 DDL 和 DML(不包 括 SELECT)操作执行成功后都显示“Query OK”,这里理解为执行成功就可以了;“1 row affected” 表示操作只影响了数据库中一行的记录,“0.00 sec”则记录了操作执行的时间。
二、查看数据库
基本语法 show databases;
示例说明 显示当前服务器的所有数据库
注意:
show是指显示
database 是指数据库
databases 是数据库的复数形式,指全部数据库。
示例:
SHOW DATABASES;
三、选中数据库
基本语法 use 库名;
示例 use PHP
示例说明 使用数据库PHP
注意:
use 是指使用;
库名 是存在当前数据库系统中的具体的数据库的名称;
示例:
use PHP;
Database changed
四、查看数据库中的表
进入到库后我们可以看这个库里面有多少个数据表。
基本语法 show tables;
示例说明 显示当前数据库下所有的表
使用use 进入到某个数据库后可以使用show tables
示例,查看当前数据库的表:
show tables;
五、删除数据库
基本语法 DROP DATABASE 库名;
示例 DROP DATABASE PHP;
示例说明 删除一个数库,数据库的名字为liwenkai
注意:
drop 是汉语可以翻译为指掉下来,不要了的意思
database 是指库
库名 是指要删掉的库的名称
示例:
DROP DATABASE PHP;
Query OK, 0 rows affected (0.01 sec)
【切记】注:数据库删除后,下面的所有数据都会全部删除,所以删除前一定要慎重并做好相应的备份。
第五章 Mysql数据表操作
一、创建表
基本语法
CREATE TABLE表名(字段名1 字段类型,....字段名n 字段类型n);
示例
CREATE TABLE user(username varchar(20),password varchar(32));
示例说明
创建一个表名叫user的表,第一个字段为username、表的字段类型为varchar长度为32个长度。第二个字段为password,类型也为varchar,长度也为32个长度。
注释:
int,代表整型。float,代表浮点。char和varchar代表字符串即可。
其他示例:
mysql> CREATE TABLE emp(
ename varchar(10),
hiredate date,
sal float(10,2),
deptno int(2)
);
Query OK, 0 rows affected (0.63 sec)
二、查看表字段结构信息
基本语法
desc 表名;
示例
desc emp
示例说明
查看emp表的表结构
DESC emp;
三、查看表创建语句
类别 详细解示
基本语法 SHOW CREATE TABLE表名 G;
示例 SHOW CREATE TABLE emp G;
示例说明 查看表emp的创建语句
执行完整示例:
SHOW CREATE TABLE emp G;
上面表的创建 SQL 语句中,除了可以看到表定义以外,还可以看到表的 engine(存储引擎) 和 charset(字符集)等信息。“G”选项的含义是使得记录能够按照字段竖着排列,对于内 容比较长的记录更易于显示。
四、删除表
基本语法 DROP TABLE 表名;
示例 DROP TABLE emp;
示例说明 删除表emp
DROP TABLE emp;
Query OK, 0 rows affected (0.34 sec)
注:删除表。表和数据均会丢失,请勿必删除重要表之前备份数据。
五、指定表引擎和字符集
在创建表最后,我们常用MyISAM或者InnoDB引擎。在指定引擎时,我们可以使用:
ENGINE=InnoDB
指定表默认字符集(可在创建表的同时指定默认字符集),只需要添加:
DEFAULT CHARSET=utf8
实例如下:
CREATE TABLE emp (
useraname varchar(10) DEFAULT NULL,
password date DEFAULT NULL, )ENGINE=InnoDB DEFAULT CHARSET=utf8;
第六章 Mysql数据字段操作
一、查看表结构
mysql> desc user;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| username | varchar(10) | YES | | NULL | |
| password | varchar(32) | YES | | NULL | |
| createtime | int(10) | YES | | NULL | |
| createip | int(10) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
二、修改表字段类型 modify
基本语法 alter table 表名 modify 字段名 varchar(20);
示例 alter table user modify username varchar(20);
示例说明 将user表的username的类型改为varchar(20)
我们执行一下,看看结果:
mysql> alter table user modify username varchar(20);
Query OK, 0 rows affected (0.48 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc user;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| username | varchar(20) | YES | | NULL | |
| password | varchar(32) | YES | | NULL | |
| createtime | int(10) | YES | | NULL | |
| createip | int(10) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
三、增加表字段
基本语法 alter table 表名 add column 字段名 类型;
示例 alter table user add column age int(3);
示例说明 添加一个字段为age,类型为整型长度为3
mysql> alter table emp add column age int(3);
Query OK, 0 rows affected (0.40 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc user;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| username | varchar(20) | YES | | NULL | |
| password | varchar(32) | YES | | NULL | |
| createtime | int(10) | YES | | NULL | |
| createip | int(10) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
我们刚刚学了增加字段。如果你仔细实验发现每次都是增加在最后面,如何在第一个增加或者在指字字段之后增加呢?
(补充,将添加的字段加到第一个:)ALTER TABLE 表名 ADD column 字段名 字段类型 first;
基本语法 ALTER TABLE 表名 ADD column 字段名 字段类型 AFTER 字段名;
示例 ALTER TABLE user ADD column email VARCHAR(60) AFTER createip;
示例说明 user表中,在createip后增加一个字段为email,类型为varchar,长度为60
ALTER TABLE user ADD email VARCHAR(60) AFTER createip;
Query OK, 0 rows affected (0.40 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc user;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| username | varchar(20) | YES | | NULL | |
| password | varchar(32) | YES | | NULL | |
| createtime | int(10) | YES | | NULL | |
| createip | int(10) | YES | | NULL | |
| email | varchar(60) | YES | | NULL | |
| age | int(3) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
示例 ALTER TABLE user ADD id INT(10) FIRST;
示例说明 user表中在最开始的位置增加一个字段为id,类型为int,长度为10
四、删除表字段
基本语法 alter table 表名 drop column 字段名;
示例 alter table user drop column age;
示例说明 在user表中删除字段age
mysql> alter table user drop column age;
Query OK, 0 rows affected (0.27 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc user;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| username | varchar(20) | YES | | NULL | |
| password | varchar(32) | YES | | NULL | |
| createtime | int(10) | YES | | NULL | |
| createip | int(10) | YES | | NULL | |
| email | varchar(60) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
五、表字段改名
基本语法 alter table 表名 change 字段原名 字段新名 字段类型;
示例 alter table user change email em varchar(60);
示例说明 在user表中将字段中的email字段名字为em
详细示例:
mysql> alter table user change email em varchar(60);
Query OK, 0 rows affected (0.38 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc user;
+----------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| username | varchar(20) | YES | | NULL | |
| password | varchar(32) | YES | | NULL | |
| createtime | int(10) | YES | | NULL | |
| createip | int(10) | YES | | NULL | |
| em | varchar(60) | YES | | NULL | |
+----------+---------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
六、修改表字段排列顺序
在前的字段增加和修改语句(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)
七、修改表名
类别 详细解示
基本语法 alter table 旧表名 rename 新的表名;
示例 alter table user rename new_user;
示例说明 将user表名改为new_user
mysql> alter table user rename new_user;
Query OK, 0 rows affected (0.35 sec)
mysql> desc new_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)
第七章 Mysql数据类型
MySQL中存的是数据。只要是数据,我们就会规定数据的类型。在表的字段中规定了使用的是某个数据类型。那么,在插入的数据中就要使用对应的数据类型。并且,遵守数据类型的长度要求。
整型
MySQL数据类型 | 所占字节 | 值范围 |
---|---|---|
Tinyint=bool | 1字节 | -128~127 |
smallint | 2字节 | -32768~32767 |
mediumint | 3字节 | -8388608~8388607 |
int | 4字节 | 范围-2147483648~2147483647 |
bigint | 8字节 | +-9.22*10的18次方 |
整型的长度不同,在实际使用过程也就不同。
浮点类型
MySQL数据类型 | 所占字节 | 值范围 |
---|---|---|
float(m, d) | 4字节 | 单精度浮点型,m总个数,d小数位 |
double(m, d) | 8字节 | 双精度浮点型,m总个数,d小数位 |
decimal(m, d) | decimal是存储为字符串的浮点数 |
字符类型
MySQL数据类型 | 所占字节 | 值范围 |
---|---|---|
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个字节的定长字节符串 |
时间类型
MySQL数据类型 | 所占字节 | 值范围 |
---|---|---|
date | 3字节 | 日期,格式:2014-09-18 |
time | 3字节 | 时间,格式:08:42:30 |
datetime | 8字节 | 日期时间,格式:2014-09-18 08:42:30 |
timestamp | 4字节 | 自动存储记录修改的时间 |
year | 1字节 | 年份 |
复合类型
MySQL数据类型 | 说明 | 举例 |
---|---|---|
set | 集合类型 | set(“member”, “member2″, … “member64″) |
enum | 枚举类型 | enum(“member1″, “member2″, … “member65535″) |
一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。
第八章 Mysql字符集
英文字符集:
字符集 | 说明 | 字节长度 |
---|---|---|
ASCII | 美国标准信息交换代码 | 单字节 |
GBK | 汉字内码扩展规范 | 双字节 |
unicode | 万国码 | 4字节 |
UTF-8 | Unicode的可变长度字符编码 | 1到6个字节 |
ASCII
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)
实际工作中要使用的编码
gbk_chinese_ci | 简体中文, 不区分大小写 |
---|---|
utf8_general_ci | Unicode (多语言), 不区分大小写 |
注意:
mysql在写utf-8的时候写的是utf8。不加中间的中横线。
第九章 Mysql索引
假如你用新华字典来查找“张”这个汉字,不使用目录的话,你可能要从新华字典的第一页找到最后一页,可能要花二个小时。字典越厚呢,你花的时间就越多。现在你使用目录来查找“张”这个汉字,张的首字母是z,z开头的汉字从900多页开始,有了这条线索,你查找一个汉字可能只要一分钟,由此可见索引的重要性。
索引用于快速找出在某个列中有一特定值的行
当然索引也不易过多,索引越多写入,修改的速度越慢。因为,写入修改数据时,也要修改索引。
一、MySQL的索引类型
普通索引:最基本的索引,它没有任何限制
唯一索引:某一行启用了唯一索引则不准许这一列的行数据中有重复的值。针对这一列的每一行数据都要求是唯一的
主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户ID。类似于书中的页码
全文索引:对于需要全局搜索的数据,进行全文索引
普通索引
基本语法
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字段增加主键索引
创建表时也可以声明索引
创建表时可在创建表语句后加上对应的类型即可声明索引:
PRIMARY KEY(字段)
INDEX [索引名] (字段)
FULLTEXT [索引名] (字段)
UNIQUE[索引名] (字段)
注:中括号中的索引名,代表可选。
整体示例如下:
CREATE TABLE test (
id INT NOT NULL ,
username VARCHAR(20) NOT NULL ,
password INT NOT NULL ,
content VARCHAR(20) ,
PRIMARY KEY (id),
INDEX pw (password),
UNIQUE (username),
FULLTEXT (content)
) ENGINE = InnoDB;
第十章 增删改查之插入记录
一、插入记录有两种个基本语法
插入基本语法一
基本语法 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)字段顺序为值的顺序。
按照基本语法二写上表中的插入语句:
INSERT INTO user(username,sex) values('oldboy',10);
基本语法变形:一次插入多条记录
INSERT INTO user(username,password,sex)
values('黄晓明', 'abcdef', 1),
( 'angelababy', 'bcdeef', 0),
( '陈赫', '123456', 1),
('王宝强', '987654', 1);
二、基础查询
创建表的语句如下:
CREATE TABLE IF NOT EXISTS money (
uid int(11) NOT NULL,
username varchar(30) NOT NULL,
password char(32) NOT NULL,
age tinyint unsigned NOT NULL,
sex tinyint not null
) ENGINE = InnoDB DEFAULT CHARSET=utf8;
基本语法 select * from 表;
示例 select * from money;
示例说明 查询money表中所有字段中的所有结果
注:”*” 是一种正则表达式的写法,表示匹配所有,上面的查询语句和下面的是等价:
mysql> select * from money;
三、指定字段查询
基本语法 select 字段 from 表;
示例 select id,username, balance from money;
示例说明 查询money表中id,username, balance字段中的所有结果
mysql> select id,username, balance from money;
四、查询单个字段不重复记录 distinct
基本语法 select distinct 字段 from 表;
示例 select distinct age deptno from money;
示例说明 查询money表中年龄唯一的所有结果
mysql> select distinct age deptno from money;
五、条件查询 where
基本语法 select 字段 from 表 where where条件;
示例 select * from money where age = 29;
示例说明 查询money表中年龄为29的所有结果
mysql> select * from money where age = 29;
六、where后可接的条件
比较运算符结果集中将符合条件的记录列出来。上面的例子中,where 后面的田间是一 个字段的 ‘=’。
除此之外,还可以使用>、<、>=、<=、!=等比较运算符;
符号 说明
'>' 大于
'<' 小于
'>=' 大于等于
'<=' 小于等于
'!=' 不等于
'=' 等于
七、逻辑运算符
多个条件还可以使用 or 、 and 等逻辑运算符进行多条件联合查询
or 或者
and 并且
我们来看一下多个条件的例子:
示例 select * from money where id <10 and province='湖北';
说明 查询所有字段 要求id小于10 并且province='湖北'
mysql> select * from money where id <10 and province='湖北';
八、结果集排序
基本语法 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;
九、结果集限制
对于查询或者排序后的结果集,如果希望只显示一部分而不是全部,使用 limit 关键字结果集数量限制。
基本语法 select 字段 from 表 limit 数量;
示例 select id,username, balance from money limit 5;
示例说明 显示前五个用户
mysql> select * from money limit 5;
十、限制结果集并排序
基本语法 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;
十一、统计类函数使用
如果我们想知道总用户数怎么办?
查询谁是数据表里的首富怎么办?
如果我们想知道用户的平均金额怎么办?
如果我们想知道所有用户的总金额怎么办?
统计类函数最常用的我们有四个:
函数 | 说明 |
---|---|
sum | 求和 |
count | 统计总数 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
注:当然你知道其他的mysql函数也可以使用。不过,在实际工作中,大公司的很多大中型项上很少使用,他们都有专门的计数服务器。因为,mysql的计算量本身很大,为了减少压力通常我们将实际的计算任务交给业务服务器或其他服务器来完成。
基本语法 select 函数(字段) from 表
示例 select count(id) from money
示例说明 查询money表的id总数
mysql> select count(id) from money;
你还可以给字段取别名哟!使用as关键字。
mysql> select count(id) as zongshu from money;
查询平均金额
mysql> select avg(balance) from money;
查询总金额
mysql> select sum(balance) from money;
查询最大金额
mysql> select max(balance) from money;
查询最小金额
mysql> select min(balance) from money;
十二、分组 group by
我们拿金额表里面的省份进行分组数据,分组数据后你会发现。有相同的省份会去掉。即,一个省份为一个组。
基本语法 select * from 表 group by 字段
示例 select * from money group by province;
示例说明 按照地区进行分组
mysql> select * from money group by province;
统计分组(分类)各总数:
mysql> select deptno, count(1) from emp group by deptno;
统计省份数量后再进行分组显示
mysql> select count(province),province from money group by province;
在分组基础上进行统计
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;
结果再过滤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;
整体使用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;
第十一章 Mysql多表联合查询
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表数据:
INSERT INTO user(uid,username,password) values('1','jintian','123456');
INSERT INTO user(uid,username,password) values('2','zhangsha','1234f56');
INSERT INTO user(uid,username,password) values('3','wangwu','1234fs56');
INSERT INTO user(uid,username,password) values('4','lisi','123s456');
INSERT INTO user(uid,username,password) values('5','xiaotian','123d456');
INSERT INTO user(uid,username,password) values('6','wangfei','123f456');
INSERT INTO user(uid,username,password) values('7','oldboy','123w456');
INSERT INTO user(uid,username,password) values('8','oldboyww','123w45ee6');
order_goods数据如下:
INSERT INTO order_goods(oid,uid,name,buytime) values('1','7','opper','12345622');
INSERT INTO order_goods(oid,uid,name,buytime) values('2','2','iphone','1234356');
INSERT INTO order_goods(oid,uid,name,buytime) values('3','4','xieli','12342756');
INSERT INTO order_goods(oid,uid,name,buytime) values('4','3','lisi','12322456');
INSERT INTO order_goods(oid,uid,name,buytime) values('5','5','juzi','12344456');
INSERT INTO order_goods(oid,uid,name,buytime) values('6','6','tianmiju','12322456');
INSERT INTO order_goods(oid,uid,name,buytime) values('7','1','xiangjiao','12311456');
注意:在上表order_goods表中uid是指user表中的uid字段。上表中oid为1的数据行,uid为7的用户。为user表中uid为7的用户:oldboy。该用户购买了商品为xiangjiao。购买时间buytime为一个unix时间戳。
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;
解释:u.uid ,u.username as username 取别名
o.oid,o.uid,o.name as shopname 取别名
user u 将user定义别名为u
order_goods o 将order_goods定义别名为o
外连接:
基本语法 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;
右连接:
包含所有的右边表中的记录甚至是右边表中没有和它匹配的记录
基本语法 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;
子查询
有时候,当我们查询的时候,需要的条件是另外一个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);
示例2:
mysql> select * from user where uid in (select uid from order_goods);
记录联合
使用 union 和 union all 关键字,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示。两者主要的区别是把结果直接合并在一起,而 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;
第十二章 Mysql增删改查之更新记录
更新记录
更新数据我们已经说过。需要修改内容,修改银行卡余额,修改装备信息的时候都需要使用到update,修改语句。
money表数据结构:
CREATE TABLE IF NOT EXISTS money (
uid int(11) NOT NULL,
username varchar(30) NOT NULL,
balance DECIMAL(9,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
money表数据:
INSERT INTO money(uid,username,balance) values('1','zhangsai','15000.22');
INSERT INTO money(uid,username,balance) values('2','zhangsa','16000.22');
INSERT INTO money(uid,username,balance) values('3','lisi','17000.22');
INSERT INTO money(uid,username,balance) values('4','wangwu','18000.22');
修改(也叫更新)语句的基本语语法如下:
基本语法 update 表名 set 字段1=值1,字段2=值2,字段n=值n where 条件
示例 update money set balance=balance-500 where userid = 15;
示例说明 修改money表,将balance余额减500。要求userid为15
假设我们有下面这一个表,表结构如下:
mysql> select * from money where username='lisi';
使用 update 语句进行记录更新
mysql> update money set balance=balance-500 where uid = 15;
同时对两个表进行更新
基本语法 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.password where m.uid=u.uid;
使用 delete 删除记录
基本语法 DELETE FROM 表 [where 条件];
示例 DELETE FROM user where id > 10;
示例说明 删除掉用户表中id大于10的所有用户
mysql> DELETE FROM money where uid='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开始自增
【切记】
删除时一定要记住加上where条件,不然会清空掉整个表的记录。
删除重要数据前一定要备份、备份、备份。
第十三 Mysql 权限操作
添加权限
类别 详细解示
基本语法 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)
注:
上面的一些语句用的较少。你可以将知识点的掌握级别设置为了解级别。
更多的时候,权限设置项特别多,人们往往记不住具体的命令。更多的时候人们使用专门的工具来操作权限。
补充:
查看用户权限
查看当前用户权限:
show grants;
查看其它用户权限:
show grants for 'test'@'localhost';
刷新权限
flush privileges;
总结
以上便是本文的相关内容,不足的还望指教。