Mysql数据库连接查询
| Mysql数据库连接查询 |
- 连接是关系数据库模型的主要特点。连接查询是关系数据库中最主要的查询,主要包括内连接、外连接等。通过连接运算可以实现多个表查询。当查询数据时,通过连接操作查询出存放在多个表中的不同实体信息。当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的表进行连接查询。如下将介绍多表之间的内连接查询、外连接查询以及复合条件连接查询。
| 内连接查询 |
内连接(inner join)使用比较运算符进行表间列数据的比较操作,并列出这些表中与连接条件相匹配的数据行,并组合成新的记录。新建学生表、班级表,在两个表之间实现连接查询。其中tb_class中的主键id为tb_student的外键,表结构如下:

表中数据如下:

表的连接查询语句为:SELECT tb_student.*,tb_class.name FROM tb_student,tb_class WHERE tb_student.classID=tb_class.id; 或 SELECT tb_student.*,tb_class.name FROM tb_student INNER JOIN tb_class ON tb_student.classID=tb_class.id;

如果在一个连接查询中,涉及到的两个表都是同一个表,这种查询称为自连接查询,自连接是一种特殊的内连接,它是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表。如下是对tb_student表的查询,查询和id为1的学生为同一个班的同学:

| 外连接查询 |
连接查询将查询多个表中相关联的行,内连接时,返回查询结果集合中的仅是符合查询条件和连接条件的行。但有时需要包含没有关联的行中数据,即返回查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左连接)、右表(右连接)或两个边表中的所有数据行。外连接分为左外连接和右外连接;
- LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录
- RIGHT JOIN(右连接):返回包括右表中所有记录和左表中连接字段相等的记录
- LEFT JOIN 左连接
左连接的结果包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果行中右表的所有选择列表列均为空值。如下是学生表和班级表,查询所有学生所在班级的名称,包括还没有给分配班级的学生。

左连接语句为:SELECT tb_student.name,tb_class.name FROM tb_student LEFT OUTER JOIN tb_class ON tb_student.classID=tb_class.id;


- RIGHT JOIN 右连接
右连接是左连接的反向连接,将返回右表的所有行,如果右表的某行在左表中没有匹配项,左表将返回空值,如下图所示,tb_student表中没有计算机5班的学生,故计算机5班前学生名为空。

| 子查询 |
子查询是指一个查询语句嵌套在另一个查询语句内部的查询,在SELECT子句中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。子查询中常用的操作符有ANY(SOME)、ALL、IN、EXISTS。子查询可以添加到SELECT、UPDATE和DELETE语句中,而且可以进行多层嵌套。子查询中也可以使用比较运算符,如“<”、“<=”、“>”、“>=”和“!=”等。本节将介绍如何在SELECT语句中嵌套子查询。
- 带ANY、SOME关键字的子查询
ANY和SOME关键字是同义词,表示满足其中任一条件,他们允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层子查询中的任何一个比较条件,就返回一个结果作为外层查询的条件。ANY关键字接在一个比较操作符的后面,表示若与子查询返回的任何值比较为TRUE,则返回TRUE。如下是是查询比学号为1学生最低成绩(86)高的所有成绩列表:
SQL查询语句为:SELECT * FROM tb_score WHERE grade> ANY(SELECT grade FROM tb_score WHERE sID=1);

- 带ALL关键字的子查询
关键字ALL与ANY和SOME不同,使用ALL时需要同时满足内层查询的条件,例如,将如上的例子中的ANY改为ALL,则查询比学号为1的学生成绩(86,90)都高的成绩,则如上可看出查询出结果为空。
- 带EXISTS关键字的子查询
EXISTS关键字后面的参数是一个任意的子查询,系统对子查询进行运算以判断它是否返回行,如果至少返回一行,那么EXISTS的结果为TRUE,此时外层查询语句将进行查询;如果子查询没有返回任何行,那么EXISTS返回的结果为FALSE,此时外层语句将不进行查询。

- 带IN关键字的子查询
IN关键字进行子查询时,内层查询语句金金返回一个数据列,这个数据列里的值将提供给外层查询语句进行比较操作。如下两条语句分别查询学生的语文成绩、查询2班学生的所有成绩:
查询学生语文成绩:SELECT sID,grade FROM tb_score WHERE cID IN (SELECT id FROM tb_course WHERE name='语文');

查询2班学生的所有成绩:SELECT sID,cID,grade FROM tb_score WHERE sID IN (SELECT id FROM tb_student WHERE classID=2);

| 合并查询 |
利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时两个表对应的列数和数据类型必须相同。各个SELECT语句之间使用UNION或UNION ALL关键字分隔。UNION不使用关键字ALL执行时,删除重复记录,所有返回行都是唯一的;使用关键字ALL的作用是不删除重复行也不对结果进行自动排序。
如查询1号课程且大于80分和4号学生的成绩:SELECT sID,grade FROM tb_score WHERE grade>80 AND cID=1 UNION SELECT sID,grade FROM tb_score WHERE sID=4;SELECT sID,grade FROM tb_score WHERE grade>80 AND cID=1 UNION ALL SELECT sID,grade FROM tb_score WHERE sID=4;


| 正则表达式 |
正则表达式通常被用来检索或替换那些符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。例如从一个文本文件中提取电话号码,查找一篇文章中重复淡出或者替换用户输入的某些敏感词语等等,这些地方都可以使用正则表达式。MySQL中使用REGEXP关键字指定正则表达式的字符串匹配模式,如下表列出了REGEXP操作符中常用匹配列表。
| 选项 | 说明 | 例子 | 匹配值实例 |
| ^ | 匹配文本的开始字符 | '^b'匹配以字母b开头的字符串 | book,big,banana,bike |
| $ | 匹配文本的结束字符 | 'st$'匹配以st结尾的字符串 | test,resist,rest,persist |
| . | 匹配任何单个字符 | 'b.t'匹配任何b和t之间一个字符 | bit,bat,but,bite |
| * | 匹配零个或多个在它前面的字符 | 'f*n'匹配字符n前面有任意个字符f | fn,fan,faan,fit |
| + | 匹配前面的字符1或多次 | 'ba+'匹配以b开头后紧跟至少有一个a | ba,bay,bare,battle |
| <字符串> | 匹配包含指定的字符串的文本 | 'ha' | happy,hacker,hackman |
| [字符集合] | 匹配字符集合中任何一个字符 | '[xz]'匹配x或者z | dizzy,zebra,x-ray,extra |
| [^] | 匹配不在括号中的任何字符 | '[^abc]'匹配任何不包含a、b和c的字符串 | desk,fox,file |
| 字符串{n,} | 匹配前面的字符串至少n次 | b{2}匹配两个或者更多个b | bb,bbb,bbbb |
| 字符串{n,m} | 匹配前面字符串至少n次,至多m次。如果n=0,此参数为可选参数 | b{2,4}匹配最少2个,最多4个b | bb,bbb,bbbb |
选择学生表中information列中首字母为z的行:SELECT * FROM tb_student WHERE information REGEXP '^z';

其它正则表达式的举例略,大家可以根据自己需求自行设计。
Mysql数据库连接查询的更多相关文章
- Mysql数据库连接、查询、记录集操作代码
Mysql数据库链接代码 function dbConnect($hostname,$username,$pass,$db_name,$pconnect =0) { $func=empty($pcon ...
- mysql datetime查询异常
mysql datetime查询异常 异常:Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp (2011 ...
- Python实现Mysql数据库连接池
python连接Mysql数据库: python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接mysql数据库请求时,都是独立的去请求访问,相当浪费资源,而且访 ...
- node+mysql 数据库连接池
1. 什么是数据库连接池? 数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个池,由程序动态地对池中的连接进行申请,使用和释放. 2. 使用数据库连接池原理及优点是什么? 数据库连接池 ...
- python MySQL慢查询监控
MySQL慢查询会话监控 #!/usr/bin/python # -*- coding: UTF-8 -*- from email.mime.text import MIMEText from ema ...
- python3 实现mysql数据库连接池
首先声明一下,这篇博客进行了通过自己的代码方式,加上这篇博客,最后总结出这段代码.参考博客连接:http://blog.csdn.net/zbc1090549839/article/details/5 ...
- Python3.5 MySQL 数据库连接
Python3.5 MySQL 数据库连接 在本文中介绍 Python3 使用PyMySQL连接数据库,并实现简单的增删改查 为什么使用PyMySQL? PyMySQL是在Pyhton3.x版本中用 ...
- Python3 MySQL 数据库连接 -PyMySQL
Python 3 操作mysql http://www.runoob.com/python3/python3-mysql.html Python3 MySQL 数据库连接 本文我们为大家介绍 Pyt ...
- SpringBoot15 sell01 项目创建、MySQL数据库连接、日志配置、开发热部署、商品信息模块
项目软件版本说明: jdk: 1.8 springboot: 2.0.1 mysql: 5.7 1 项目创建 创建一个SpringBoot项目即可,创建是勾选 web jpa mysql 这三个依赖就 ...
随机推荐
- $.when().done().then()的用法
jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. ...
- Ubuntu Apache2 配置解析
转自:http://www.cnblogs.com/ylan2009/archive/2012/02/25/2368028.html Ubuntu的Apache 2.4 之后的版本的配置文件是 / ...
- mysql基础-- 一条请求执行多条SQL语句
最近做一个数据库初始化工具的时候发现了这个问题,就是在一个Statement中执行一条SQL语句的时候可以正确执行,如果同时执行多条,就会报SQL语法错误,伤透了脑筋. 经过网上查找,发现有两种解决办 ...
- Eclipse 的 git 插件操作 "代码提交"以及"代码冲突"
面向对象:曾经使用过SVN的同学. (因为Git 它 可以说是双重的SVN (本地一个服务器,远程一个服务器)),提交代码要有两次步骤,先提交到本地服务器,再把本地服务器在提交到远程服务器. 所以连S ...
- LPC1768基本输入输出GPIO使用
LPC1788通用IO口的控制包含了一些基本的组件,比如设置推挽输出,开漏输出,上拉电阻等,我们今天来看看. 首先使用GPIO要打开GPIO的系统时钟 LPC_SC->PCONP |= (1 ...
- easyui-01 怎么样使用easyui
console.info();在控制台打印. 1.引入 <script type="text/javascript" src="../../jquery-easyu ...
- 查看Linux最近重启的时间
最近实验室老是掉电,想查看服务器什么时候重启的,于是在网上找了一些资料.有两种方式可以查看服务器重启. (1) who -b (2) last reboot |head -1
- 家用计费系统ER图
家用计费系统研发开始.在此记录自己的开发过程.
- 【转】sql语句的优化分析
开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索 ...
- xdebug.var_display_max_data
Xdebug Display Full Details on var_dump() Xdebug is an excellent addition to a PHP developers arsena ...