MySQL数据库
课程目标:
1.如何使用MySQL数据库,主要是讲解基本的语法
2.如何设计数据库?
第一章 数据库简介
数据库的概念
在项目开发中,会存在很多的数据,例如用户注册的信息,商品的信息,对于这些信息,都需要使用一定的工具保存起来,用来存储项目开发中数据的工具被成数据库。但是,光有数据还不行,还要有管理数据库的工具,我们称之为数据库管理系统!
数据库系统 = 数据库管理系统 + 数据库 + 数据库管理员
DataBase System(DBS) = DataBase Management System(DBMS)+ DataBase Administrator(DBA)
官方定义:
数据库:对大量信息进行管理的高效解决方案,按照数据结构来组织,存储和管理数据的库!
通常一个web项目(一个网站)会使用一个数据库来存储其所有的动态数据!知道了数据库的功能后,那么在PHP进行网站开发的时候,我们应该选择什么样的数据库呢?
常见数据库分类
MySQL
开源、免费,对于个人以及中小型企业来说功能已经绰绰有余。
MariaDB
MariaDB数据库管理系统是MySQL的一个分支。
Percona
Percona Server为 MySQL 数据库服务器进行了改进,在功能和性能上较 MySQL 有着很显著的提升。该版本提升了在高负载情况下的 InnoDB 的性能、为 DBA 提供一些非常有用的性能诊断工具;另外有更多的参数和命令来控制服务器行为。
Oracle
数据库巨头、企业级数据库,历史悠久、功能强大,企业级应用需要付费。
Sql Server
微软的数据库系统、企业级数据库,历史悠久、功能强大,企业级应用需要付费。
DB2
IBM DB2 是美国IBM公司开发的一套关系型数据库管理系统,它主要的运行环境为UNIX(包括IBM自家的AIX)、Linux、IBM i(旧称OS/400)、z/OS,以及Windows服务器版本。
PostgreSQL
PostgreSQL是以加州大学伯克利分校计算机系开发的 POSTGRES,现在已经更名为PostgreSQL。
什么是MySQL?
MySQL是目前最流行的关系型数据库。由瑞典 MySQL AB 公司开发,目前属于 Oracle旗下公司。
MySQL开源免费、性能好,虽然和一些企业级的大型数据库相比功能有限,但是对于一般的中小型公司来说,它提供的功能已经绰绰有余了!
关系型数据库简介
所谓的关系型数据库,就是基于关系模型的数据库。在我们进行数据存储的时候,是需要按照一定的格式进行存储的,如果是将数据保存在一个由行和列形成的二维数据表的结构里面,并进行统一管理的工具则称为关系型数据库。这里的二维数据表一般被称为实体,表与表之间的关系被称为实体关系。
1.什么是实体呢?
答:实体是观念世界中描述客观事物的概念,可以是具体的事物,比如一本书、一个人、一条街等,也可以是抽象的事物,比如一种感受、一个订单等!
实体反应到数据库中,就是一张一张的二维表,比如我们现在的教室至少就有三种实体集:学生实体、教室实体、教师实体!于是,也就对应着数据库中的三张表:学生表、教师表、教室表!
思考:
假如为一个酒店管理系统设计一个数据库,需要哪些数据表?
客房表 员工表 客户表 订单表 物资表等
非关系型数据库简介
我们说的MySQL数据库是关系型数据库,现在也存在很多非关系型数据库NOSQL:Not Only SQL!其主要的特点如下:
- 使用键值对保存和表示数据库(有点类似于数组),没有行和列的表结构
- 不在使用SQL语句做查询
- 保存数据的介质是内存,所以数据库运行效率比关系型数据库高的多(关系型数据库保存数据库的介质是在磁盘
- 运行之后,会进行数据同步(将内存中的数据写入到磁盘)
我们以后会学习一款非关系型数据库:MongoDB,它是非关系型数据库中最强大,而且最像关系型数据库的一款产品!
MongoDB
非关系型的文档数据库。
Redis数据库
非关系型数据库。
第二章 MySQL软件架构
启动、关闭、重启
MySQL数据库是一个C/S架构的软件,使用之前需要先启动MySQL服务器端,然后就可以使用MySQL客户端来连接服务器进行操作。我们使用的PHPstudy集成开发环境提供了图形化的操作界面,按照下面的操作即可。
MySQL客户端连接MySQL服务器
注意:同qq、微信、游戏客户端一样,也需要账号和密码等认证信息才能连接上数据库服务器!
注意:
MySQL的客户端有很多,除了软件自身携带的一个,PHP也要扮演MySQL客户端的角色,另外,还有很多图形化用户界面的客户端工具,比如phpmyadmin、Navicat for MySQL等。
- 切换到MySQL安装目录下的bin目录,使用命令行客户端工具进行连接
2.可以使用MySQL的客户端程序连接到MySQL服务器上进行操作
mysql -uroot -P3306 -hlocalhost -p
注意:也可以省略掉主机和端口号,缺省值为localhost和3306
mysql -uroot -p
注意:PHPstudy中,MySQL的超级管理员root的密码为 root
操作流程概图
MySQL的帮助命令
我们可以通过输入help或者\h来显示MySQL的帮助信息!
MySQL的注释符
MySQL的注释也分成了单行注释和多行注释:
单行注释:
注释内容
-- 注释内容(注意,两个—之后有一个空格)
多行注释:
/* 注释内容 */
演示效果:
第三章 SQL语言
什么是SQL?
SQL:结构化查询语言(Structured Query Language)简称SQL,是一种特殊的编程语言,主要用在关系型数据库中用来对数据进行查询、添加、修改、删除等操作。
分类
思考:
如果现在要往一个数据库里面存放数据,需要有哪些准备工作?
1.要创建一个新的数据库
2.再创建一张数据表
3.定义这张表的结构(有哪些字段,字段是什么类型,有没有主键等)
所以,数据库的第一种操作语言就是DDL
DDL
DDL:Data Definition Language,数据定义语言!
主要是用来定义和维护数据库的各种对象(比如库、表、索引和视图等),也可以说操作的层次是在数据库和表的逻辑结构和存储结构上面,并没有对表中的实际的数据进行操作!
主要的操作关键字:create、drop、alter等
DML
DML:Data manipulation Language,数据操作语言
主要是对表中的记录进行增删改查的操作!
其中,“查询”部分,又称为DQL(Data Query Language),数据查询语言!
主要的操作关键字:insert、delete、update、select等
DCL
DCL:Data Control Language,数据控制语言
主要是对数据库进行统一控制和统一管理的工作,比如并发控制、存取控制、安全控制等;具体的有:数据库的权限管理,数据的备份与恢复等!
例如:常见的查询操作
mysql > select * from sh_admin;
第四章 数据库操作
一个数据库软件中的数据是以库、表、记录的结构进行保存的,在数据库里面有如下的几个概念:库、表、记录、字段。需要注意的是:
1.MySQL中可以创建多个库
2.每个库中可以创建多张表
3.每个表中可以保存多条记录
4.每条记录由多个字段组成
概念的介绍:
1.库:创建一个数据库,里面可以管理多张表
2.表:不同的数据保存在不同的表里面。比如:用户表、商品表、栏目表
3.记录:表中可以存在多条记录。比如:网站注册功能实际上就是向用户表中插入一条记录
4.字段:每个记录由多个字段组成。比如:每个用户有:用户名、密码、年龄、email、手机等字段
对于一个数据库的操作,基本可以分为如下几个:
- 创建数据库
- 查看都有哪些数据库
- 删除数据库,注意:数据库中所有的表都会全都删除,慎用!!!
- 切换数据库,使用哪个数据
- 查看数据库中的表
创建数据库(增)
语法:
create database DatabaseName[数据库选项]
其中,关于数据库选项,主要是设置字符集和校对规则,关于该知识点,在字符集这章进行讲解。
实操演示:
每当在创建一个数据库,则会在数据库的data目录创建一个与之同名的文件夹。
数据库命名规则:
- 数据库名是否区分大小写取决于当前的操作系统!我们的原则是:就认为区分大小写!
- 原则上数据库名可以使用任意的字符,甚至是中文,但是一些特殊字符,比如纯数字,特殊符号,以及mysql内部的关键字,应该使用标识符限定符反引号来包裹!(反引号就是键盘左上角,破浪线``),告知服务器此处只是一个名字,而不是特殊的操作!
查看数据库(查)
对于数据库的查看,我们可以查看MySQL帮我们管理了哪些数据库,同时我们也可以查看数据库创建的语句。
语法:
show databases;
实操演示:
语法:
show create database DatabaseName;
实操演示:
删除数据库(删)
语法:
drop database DatabaseName
注意:
删除数据库一定要慎重!因为整个数据库文件夹都会被删除,其中包括所有的数据表以及数据表中所有的数据!过程默认的是不可逆的!
实操演示:
修改数据库(改)
需要注意:数据库的名并不能通过SQL语句进行修改,只能修改数据库的数据库选项信息,如果确实要修改,我们到时候可以使用其他的强大的客户端直接图形化界面修改即可。
第五章 数据表操作
一个库里面可以有多个表,数据都是数据在表中的,所以我们在操作数据之前需要先创建表,然后把数据存到表中,所以在操作数据表之前,应该选择默认的数据库!有如下两种方式:
1.显示的指定数据库
2.隐式的指定数据库
创建数据表(增)
语法:
create table 表名
(
字段名1 字段类型 其他属性 ,
字段名2 字段类型 其他属性 ,
........ ........ ......... ,
字段名n 字段类型 其他属性
)engine=引擎名 default charset=编码;
1.每个字段都必须指定数据类型,字段与数据类型之间以空格分隔!
2.字段与字段之间用逗号分隔,但最后一个字段不能有逗号!
3.表选项其实就是规定表的字符集(默认的是utf8)和存储引擎(暂时用默认,后面讲)
4.表名的命名规则和库名基本一样!
查看数据表(查)
关键字:show
1.查看当前数据库下有哪些数据表
2.查看数据表的创建语句
3.查看数据表的表结构
删除数据表(删)
关键字:drop
如果删除一个不存储的表,会报错,所以,还有一个比较完整的语法形式,也就是说,在删除之前会进行一次判断,判断这张表是否存在,如果存在就删除,如果不存在,这条sql指令既不执行也不其作用!
- 清空表中数据,表还在,只清空数据,并且id会重置
语法:truncate tableName;
3.删除表及表中数据
语法:dorp table tableName;
修改数据表(改)
思考:
表中有哪些地方可以修改?
1.表名
2.字段类型,字段名、增加字段、删除字段等,统称为列定义
3.表选项
添加一个字段
alter table 表名 add 新字段名 新字段类型 其他属性
删除一个字段
alter table 表名 drop column 字段名;
修改表字段【change:字段名也修改 , modify:字段名不改】
alter table 表名 change 原字段名 新字段名 新字段类型 其他属性;【修改字段名、类型、属性】
alter table 表名 modify 原字段名 亲字段类型 其他属性;【只修改类型、属性】
修改表名
alter table 原表名 rename 新表名;
字段属性
使用字段属性,可以更详细、准确定义表中的字段,一般也起到约束作用,常见的字段属性如下:
1.not null:字段不能为空,如果一个字段是必须要添加的就使用这个,一般都需要使用这个属性约束
2.signed:称为有符号数,代表可以出现负数,如果是unsigned,称为无符号数据,代表只能只有正数,同时该约束只能用在数字类型上
3.default:默认值,可以为某些字段设置默认值,当插入数据是,如果不填写,则使用该默认值进行填充
4.comment:字段注释
5.auto_increment:自增
a)一般表中都有个id字段,我们可以让MySQL自动帮我们让ID字段从1开始自动的增长
b)加这个属性的如下要求的:
i.一个表中只能有一个自增字段
ii.字段类型必须是一个整数
iii.自增的字段必须设置成主键
字段类型
分类
和PHP一样,MySQL也支持自己的一些数据类型,在MySQL中,数据都是保存在字段里面的,所以,MySQL数据类型其实就是字段类型或列类型!
MySQL中也有三大数据类型:
整数
整数类型有五种:tinyint、smallint、mediumint、int、bigint
需要注意的几点:
- 究竟选择哪种类型?我们的原则是:够用就行了!因为占用的内存越小,效率越高!
- 可以使用unsigned来控制是否有正负,如果不写,缺省值是有符号的!
- MySQL不会进行类型的自动转换!
- 可以指定数据显示的最小宽度,以达到统一显示的目的,一般使用zerofill来进行前导零填充,如果指定的宽度比原数据的宽度小,不影响原数据的输出!
- MySQL中其实也支持bool类型,但其实就是tinyint(1)的别名!
浮点数
float:小数
decimal:小数
字符串
varchar:0~65535字节
char:0~255字符
时间
date:2017-10-10
datetime:2017-10-10 10:10:10
int:存时间戳,不同的时区时间不一样,所以最好数据库中存时间戳,在显示时再根据不同的时区转化成时间格式
枚举
enum
数据表操作
插入数据
单条记录插入
1.只插入几个字段的数字
2.为所有字段插入数据,可以省略表名后面的小括号,ID给null就可以自增
批量数据插入
可以使用一个insert插入多条,这样的性能比执行多个insert要好的多,多个值用,隔开:
语法:
insert into tableName values
(valu11, value12, value13),
(valu22, value23, value24),
(valu32, value3, value34);
查询数据
查询语句
可以使用select 语句查询出表中的数据。
语法:(【】中括号的部分代表可选项,可以没有)
select 字段1,字段2,.....
from 表名
【where 查询条件
group by 分组字段名
order by 排序字段名 排序方式【asc|desc】
limit 起始记录,记录数】
字段操作
获取所有字段的字段值
获取部分字段的值,则将需要获取的字段使用逗号进行分割
条件查询
、<、>=、<=、<>
- between ... and ...
- like是模糊查询的意思,主要用在字符串查询,可以使用通配符% 来匹配0~多个任意字符
- in 在某个范围内
- not in 不在某个范围内
- is null 和 is not null
- and 与操作,同时满足多个条件时
- or 或操作只要有一条件满足就取出数据
分组
可以使用group by 根据某一个字段分组。如果SQL语句上有where必须放到where后面
分组之后,只会返回该组中的第一条的记录,一般分组是需要聚合函数一起配合使用的。
排序
可以使用order by 根据多个字段排序,如果有group by 要放在group by 的后面
排序方式:
asc:升序
desc:降序
先根据年龄降序排序,如果年龄相同的按分数升序排序
限制记录数
使用limit只取某几条,limit 必须放在最后
语法:limit 【开始位置】,长度,其中开始位置是可选值,如果没有填写默认是下标为0开始获取。
例如:
limit 5; 相对于:limit 0,5; 代表获取前5条记录
limit 5,10; 代表从第6条记录开始取,取10条
聚合函数
需要注意的是,聚合函数一般在数据统计的时候使用,常见的聚合函数如下:
count:总的记录数
sum:把某个字段所有的值求和
avg:求平均值
min:最小值
max:最大值
说明:如果没有分组这几个函数计算的是所有记录的值,如果分组了,是对每个组进行统计
修改数据
修改
update可以修改1条或者多条记录,修改了多少条主要取决于where后面的条件。
语法:
update 表名
set 字段1=值1,字段2=值2.......
where 条件语句
相关操作演示:
1.将用户表名称为 caoyang 的用户的年龄改为24
2.将用户表主键ID为12的用户的名称改为Andy
3.将用户表主键ID为12的用户的名称改为Andy 邮箱改为gogery@163.com
4.把主键ID为1,3,5三条记录的年龄都改为24
删除数据
删除
可以使用delete删除一条或者多条记录,取决于where后面的条件。
语法:
delete from 表名 where 条件语句;
相关操作演示:
1.删除用户表名称为 caoyang 的用户
2.删除用户表id为12的用户
3.删除用户表id大于12的用户
4.删除用户表中所有的数据
注意:删除所有数据之后,如果再插入数据,ID继续自增不会从1开始,如果希望删除所有数据之后ID重新从1开始,则需要使用使用 truncate 表名 来清空表中数据。
表结构的设计
制作一个项目的流程:
1.需求分析【明确都有哪些功能以及每个功能是什么样的?】
2.找UI【用户界面】设计师使用photoshop软件做出效果图
3.前端页面设计师,使用HTML+CSS+JAVASCRIPT技术根据图片制作成静态页
4.写程序:
a)设计数据库【建表】
b)选择使用PHP框架
c)编码完成表的操作
d)把数据库中的数据和设计的页面结合起来
根据需求设计表结构是一个高级程序必备的能力:
注册功能:
表名:用户表-member
字段:用户名,手机,密码,头像,昵称,年龄,性别等等
如果有人注册了,原理就是PHP接收用户提交的数据并且执行SQL把数据插入到member表中:
如果有两个人注册了那么数据库就有两条记录:
发表日志
表名:blog
字段:标题,内容,权限
其中user_id字段我们一般叫它是外键,用这个字段来关联会员表!
说明:用哪个字段来关联都可以,只是我们一般都是使用ID字段来关联【因为特点:1. 每个ID都不同 2.简单的数字】
会员表和日志表的关系
两个表有三种关系:1:1 , 1:多 : 多对多。
现在会员表和日志表是1对多的关系:
1个会员 : 多个日志
练习:
1再创建一个分类表,管理分类
- 把分类和日志关联起来【写日志时要选择属于哪个分类】
总结:现在我们要做的日志项目至少需要三个张表:会员表【注册】、日志【发表日志】、分类表【管理日志分类】
提示:a.会员和日志有关系。 b.日志和分类。 c.会员和分类。
总结:以下三个表能完成:注册/登录、分类管理、日志管理。
思考:以上分类表和日志表是什么关系?
一个分类 : 多个日志 : 1:多
一个日志 :一个分类 : 1:1
总结: 1:多
扩展:两个表的关系由功能决定。比如上面这个日志功能改成一个日志可以同时属于多个分类。
一个分类 : 多个日志 : 1:多
一个日志 :多个分类 : 1:多
总结: 多:多
练习1:如果再添加一个日志可以被评论的用户评论的功能需要怎么修改表结构?
练习2:如果再添加一个好友功能【比较难先不管】?
多表查询
起别名
可以使用as起别名,as可以省略。
字段起别名
简写:as可以省略,可以在字段后面加一个空格然后写别名,最终显示的是别名
也可以为表起别名【现在看不出什么效果,先记住这个语法】
外连接
可以同时连接多个表:
语法:
select 字段
from 表1
left join 表2 on 连接条件
left join 表3 on 连接条件
.......
where 条件
group by 分组字段
order by 排序字段 asc|desc
limit 起始记录,记录条数
实例:以下三个表的数据:写SQL取出所有的日志,以及日志作者的名字
结果:
连用户表把用户名取出来了:
例2:以下表结构:写SQL取出所有的日志,以及日志所在的分类的名字
这样写:
练习
以下三个表:
练习1:写SQL语句取出所有的日志的ID和标题,以及每个日志的作者的名字以及所在分类的名字。
左外连【用这种】
select a.id,a.title,b.username,c.type_name
from blog a
left join member b on a.user_id=b.id
left join type c on a.type_id=c.id
多个查询
select a.id,a.title,b.username,c.type_name
from blog a,member b,type c
where a.user_id=b.id and a.type_id=c.id
多表查询
语法:
select 字段
from 表1,表2,表3,.....
where 关联条件
group by 分组字段
order by 排序字段 asc|desc
limit 起始记录,记录条数
以下例子就是blog连type表的写法:【1. 所有表名直接用,隔开。 2,表的关联写到where里】
外链和多表有啥区别?
- left join时:【left join左边的表是主表,那么主表中的数据一定会都取出来,右边的是从表,如果有对应的数据就取出来,如果没有就返回null,但不会影响主表的数据】
2 . 多表用,号查询时不是主、从关系,必须满意where条件的数据才能取出来,因为4,5,6这三个日志的type_id=0,无法和type表相关联所以无法满足where条件所以就取不出来。
字符集
http://www.qqxiuzi.cn/bianma/guobiaoma.php
思考:首先,我们考虑下为什么会存在那么多的字符集?
答:其实这是一个历史遗留的问题,如果全世界的字符集只有一个该多好,至少不会出现乱码的问题。那么为什么会出现这么多呢,因为在计算机发展的过程中,因为人们的语言各不相同,需要将各种语言的文字编码成计算机理解的二进制编码,则就存在了很多的字符集!
以中文为例:
gb2312:简体中文最早的编码,国标码,编码了6000左右的汉字
gbk:对gb2312的一种扩展,全面兼容gb2312,编码了2万多汉字
big5:俗称大五码,中国繁体字的编码,主要是港澳台使用
Unicode:全世界统一的编码,编码了100多万个字符,但是所有的字符都是占用4个字节!
utf-8:全面兼容Unicode,对Unicode的一种改进,不同的字符占用不同的字节!
我们可以使用show charset;命令查看当前MySQL服务器支持哪些字符集:
中文使用的最多的编码有两种:
gbk:一个汉字占用2个字节!
utf8:一个汉字占用3个字节!
思考:为什么会出现乱码?
如果两个软件所采用的默认字符集不同,又没有进行相应的转换或说明,就会出现乱码!
思考:数据库服务器中哪些地方需要设置字符集?
安装数据库软件的时候:我们选择的是utf8
创建新数据库的时候:通过设置库选项也可以设置字符集,default charset gbk|utf8|其他
创建新数据表的时候:通过设置表选项也可以设置字符集,default charset gbk|utf8|其他
定义表的字段的时候,也可以设置字符集(一般都不设置),default charset gbk|utf8|其他
注意:
以上都是数据库系统自己内部存放数据的时候设置的字符集,无论怎么设置,在服务器内部都不会出现乱码等字符集问题,因为服务器内部不同的字符集之间会进行自动转换!
那么,为什么会出现乱码呢?那是因为MySQL客户端自身也有自己的字符编码!
如果数据库服务器与客户端之间的默认的字符集设置不一样,互相通信的时候就会有乱码产生!
比如:对于cmd下的客户端,只支持gbk编码:
此时,我们应该告知服务器当前客户端所采用的默认的编码格式:
通过命令:set names gbk;
那么服务器在发送给客户端数据之前,首先就会将数据转换为客户端所支持的gbk编码!
思考:
如果以后使用PHP操作MySQL,应该怎么设置?
set names utf8;
思考:还有什么地方会出现乱码?
解决:
所以,所谓的三码合一(浏览器端、web服务器端、MySQL服务器编码),不是指将三个地方默认的字符集都统一成一致!而是通过某些命令使得它们在通信的时候能够识别彼此!
校对规则
校对规则都基于字符集的,每一套字符集都有与之相关的校对规则!
概念
校对规则是指当对字段进行排序的时候,先后次序问题!
比如:a B c究竟应该怎么排序呢?
不区分大小写: a B c
区分大小写:此时就要考虑字母的ASCII码,应该是:B(66) a c
也就是说,排序的规则不一样,排列出来的效果肯定也不一样!
再比如:如何是中文,该如何排序呢?(1. 姓的字母顺序 2. 笔画)
张三
李四
王五
我们可以通过show collation;命令来查看当前数据库有哪些排序规则:
如果只想看一utf8开头的字符集,可以使用模糊查询:
模糊查询关键字:like
MySQL的通配符:
_ : 可以代表任意的单个字符
% :可以代表任意的字符
常见的有:
ci结尾的:不区分大小写(针对英文)
cs结尾的:区分大小写(针对英文)
bin结尾:二进制编码比较
注意:
- utf8不支持中文比较,但是gbk支持(比较拼音)
- 修改校对规则的语法为:
mysql> alter database testdb collate utf8_bin;
由于校对规则都是基于字符集的,所以修改了相关校对规则之后,可能会自动的修改了默认的字符集:
mysql> alter database testdb default collate latin1_danish_ci;
- 一般我们只需要了解校对规则的含义就行了,如果没有特殊的要求,一般就使用默认的校对规则,不需要刻意的去更改!
联合查询
关键字:union
语法形式
select 语句1
union [union选项]
select 语句2
union [union选项]
select 语句3
............
所谓的联合查询,就是将多个查询结果进行纵向上的拼接,也就是select语句2的查询结果需要放在select语句1查询结果的后面!很显然,联合查询的结果总记录数增加了,但是字段数量并没有增加!
既然是多个查询记录的拼接,所以联合查询有一个最基本的语法,就是各个查询语句结果的字段数应该是一致的,比如,不能一个3列,另一个是4列!
这里的union选项跟以前学习的select选项的可选值是一样的,只是默认值不一样:
all:显示全部记录
distinct:去重,也是默认值!(select选项的默认值是all)
比如:
当然,上面的查询结果在实际应用中毫无意义!
注意:
使用union查询最重要的是所有select语句的字段数是一样的,但是类型可以不一样,而且永远只显示第一个select语句的字段名,但是在实际的运用中,通常各个select语句的字段类型保持一致!
那么,为什么要有union查询?意义何在?
union应用
union主要应用在以下的几种情形:
第一,获得数据的条件,在同一个select语句中存在业务逻辑的冲突,或者很难在同一个逻辑中(同一个sql语句)实现,这个时候,往往需要拆分成多个逻辑,也就是使用多条select语句分别实现!然后再将查询的结果拼接到一起!
比如:
现在要查询上面php_student表中,高老庄中的成绩score最高的一个,以及花果山中score最低的一个,如何实现?
需要注意的地方:
1,联合查询中如果要使用order by子句,那么必须要对各个select语句加上一对括号()
2,如果联合查询中使用了order by子句,还必须搭配上limit子句才能生效!当然,如果想显示全部的数据,常用的做法就是在limit的后面加上一个很多的数,比如:99999
第二,如果一个项目的某个数据表的数据量特别的大,往往会导致数据查询的效率比较低,此时,可以采用某种方式或规律对数据表进行“水平分割”,此时,每张数据表的结构是一样的,只是存放的数据不一样!
案例:
存储手机用户的信息?
首先,可以根据不同的市区放在不同的表中
然后,如果此时需要查询某个省内的所有潜在的vip客户(月消费在300元以上的),此时,可以分别查询各个市区的数据,然后再进行拼接(使用union查询语句)