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的学生为同一个班的同学:

外连接查询

  连接查询将查询多个表中相关联的行,内连接时,返回查询结果集合中的仅是符合查询条件和连接条件的行。但有时需要包含没有关联的行中数据,即返回查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左连接)、右表(右连接)或两个边表中的所有数据行。外连接分为左外连接和右外连接;

  1. LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录
  2. 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关键字指定正则表达式的字符串匹配模式,a如下表列出了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‘;

  其它正则表达式的举例略,大家可以根据自己需求自行设计。

时间: 2024-10-12 21:48:20

Mysql数据库连接查询的相关文章

Mysql数据库连接、查询、记录集操作代码

Mysql数据库链接代码 function dbConnect($hostname,$username,$pass,$db_name,$pconnect =0) { $func=empty($pconnect) ? 'mysql_connect':'mysql_pconnect'; if(!$connect){ [email protected]$func($hostname,$username,$pass) or die("<font size='2'>Mysql_Error :

Python3.5 MySQL 数据库连接

Python3.5  MySQL 数据库连接 在本文中介绍 Python3 使用PyMySQL连接数据库,并实现简单的增删改查 为什么使用PyMySQL? PyMySQL是在Pyhton3.x版本中用于连接MySQL数据库的一个库,Python2中则使用mysqldb库. PyMySQL安装 在使用PyMySQL之前,需要确保安装PyMySQL库. 可以使用pip进行安装 pip install PyMySQL 数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TESTDB. 在

Python3 MySQL 数据库连接 -PyMySQL

Python 3  操作mysql http://www.runoob.com/python3/python3-mysql.html Python3 MySQL 数据库连接 本文我们为大家介绍 Python3 使用 PyMySQL 连接数据库,并实现简单的增删改查. 什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 p

mysql子查询慢的问题

当你在用explain工具查看sql语句的执行计划时,若select_type 字段中出现"DEPENDENT SUBQUERY"时,你要注意了,你已经掉入了mysql子查询慢的"坑"...下面我们来看一个具体的例子 有这样一条查询语句: SELECT gid,COUNT(id) as count FROM shop_goods g1 WHERE status =0 and gid IN (SELECT gid FROM shop_goods g2 WHERE si

Mysql——子查询

子查询的位置: select 中.from 后.where 中.group by 和order by 中无实用意义. 子查询分为如下几类: 1,标量子查询:返回单一值的标量,最简单的形式. 2,列子查询:返回的结果集是 N 行一列. 3,行子查询:返回的结果集是一行 N 列. 4,表子查询:返回的结果集是 N 行 N 列. 可以使用的操作符:= > < >= <= <> ANY IN SOME ALL EXISTS 标量子查询:是指子查询返回的是单一值的标量,如一个数字

mysql 怎么查询出,分组后的总条数。。。也就是有多少组数。。。。怎么写

SELECT COUNT(*) AS 多少组数FROM( SELECT id FROM 表 GROUP BY id) subQuery;Mysql,有一个表含有以下字段,uid 发帖人id,title 发帖标题,tc 发帖内容,time 发帖时间,用一条语句算出昨天发帖书大于10的,一共有多少人? select count(*) from (select distinct startperson_id,count(startperson_id) as num from apphome_finan

Mysql慢查询日志脚本

#!/bin/bash LOG=/diskb/mysql/slowlog/   #定义日志存储路径 DATE=`date +"%Y-%m-%d"`   #定义时间参数 user=root                                 #填写MySQL账户信息 passwd=123456 mysql -u$user -p$passwd -e "set global slow_query_log=0" #停止mysql慢查询日志 mysql -u$us

mysql慢查询日志分析工具mysqlsla

一.介绍    mysqlsla是一个分析mysql慢日志的工具,可以分析出慢查询的原因,包括执行某条sql出现的次数及在slow log数据的百分比.执行时间.等待销的时间等. 公司的数据库有很多慢查询日志,导致的系统的负载很高,而mysql慢查询日志文件内容格式不太好看,经推荐使用mysqlsla:使用方便,操作简单. 二.安装mysqlsla 系统环境 CentOS release 6.6 (Final) 2.6.32-504.el6.x86_64 官网已经不能下载,所需要的文件已在百度云

MySQL 列子查询及 IN、ANY、SOME 和 ALL 操作符的使用

列子查询是指子查询返回的结果集是 N 行一列,该结果通常来自对表的某个字段查询返回. 一个列子查询的例子如下: SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1) 该例子在前文<MySQL 子查询subquery语法与用法实例>已有解释及数据实例,在此不再赘述. 列子查询中使用 IN.ANY.SOME 和 ALL 操作符 由于列子查询返回的结果集是 N 行一列,因此不能直接使用 = > <