详解MySql基本查询、连接查询、子查询、正则表达查询


本文整理自网络,侵删。

查询数据指从数据库中获取所需要的数据。查询数据是数据库操作中最常用,也是最重要的操作。用户可以根据自己对数据的需求,使用不同的查询方式。通过不同的查询方式,可以获得不同的数据。MySQL中是使用SELECT语句来查询数据的。在这一章中将讲解的内容包括。

1、查询语句的基本语法
2、在单表上查询数据
3、使用聚合函数查询数据
4、多表上联合查询
5、子查询
6、合并查询结果
7、为表和字段取别名
8、使用正则表达式查询

什么是查询?

怎么查的?

数据的准备如下:

create table STUDENT( 
STU_ID int primary KEY, 
STU_NAME char(10) not null, 
STU_AGE smallint unsigned not null, 
STU_SEX char(2) not null 
); 
insert into STUDENT values(2001,'小王',13,'男'); 
insert into STUDENT values(2002,'明明',12,'男'); 
insert into STUDENT values(2003,'红红',14,'女'); 
insert into STUDENT values(2004,'小花',13,'女'); 
insert into STUDENT values(2005,'天儿',15,'男'); 
insert into STUDENT values(2006,'阿猎',13,'女'); 
insert into STUDENT values(2007,'阿猫',16,'男'); 
insert into STUDENT values(2008,'阿狗',17,'男'); 
insert into STUDENT values(2009,'黑子',14,'男'); 
insert into STUDENT values(2010,'小玉',13,'女'); 
insert into STUDENT values(2011,'头头',13,'女'); 
insert into STUDENT values(2012,'冰冰',14,'女'); 
insert into STUDENT values(2013,'美丽',13,'女'); 
insert into STUDENT values(2014,'神乐',12,'男'); 
insert into STUDENT values(2015,'天五',13,'男'); 
insert into STUDENT values(2016,'小三',11,'男'); 
insert into STUDENT values(2017,'阿张',13,'男'); 
insert into STUDENT values(2018,'阿杰',13,'男'); 
insert into STUDENT values(2019,'阿宝',13,'女'); 
insert into STUDENT values(2020,'大王',14,'男');

然后这是学生成绩表,其中定义了外键约束

create table GRADE( 
STU_ID INT NOT NULL, 
STU_SCORE INT, 
foreign key(STU_ID) references STUDENT(STU_ID) 
); 
insert into GRADE values(2001,90); 
insert into GRADE values(2002,89); 
insert into GRADE values(2003,67); 
insert into GRADE values(2004,78); 
insert into GRADE values(2005,89); 
insert into GRADE values(2006,78); 
insert into GRADE values(2007,99); 
insert into GRADE values(2008,87); 
insert into GRADE values(2009,70); 
insert into GRADE values(2010,71); 
insert into GRADE values(2011,56); 
insert into GRADE values(2012,85); 
insert into GRADE values(2013,65); 
insert into GRADE values(2014,66); 
insert into GRADE values(2015,77); 
insert into GRADE values(2016,79); 
insert into GRADE values(2017,82); 
insert into GRADE values(2018,88); 
insert into GRADE values(2019,NULL); 
insert into GRADE values(2020,NULL); 

一、查询语句的基本语法

查询数据是指从数据库中的数据表或视图中获取所需要的数据,在MySQL中,可以使用SELECT语句来查询数据。根据查询条件的不同,数据库系统会找到不同的数据。
SELECT语句的基本语法格式如下:

SELECT 属性列表 
 FROM 表名或视图列表 
 [WHERE 条件表达式1] 
 [GROUP BY 属性名1 [HAVING 条件表达式2]] 
 [ORDER BY 属性名2 [ASC|DESC]] 

属性列表:表示需要查询的字段名。
表名或视图列表:表示即将进行数据查询的数据表或者视图,表或视图可以有多个。
条件表达式1:设置查询的条件。
属性名1:表示按该字段中的数据进行分组。
条件表达式2:表示满足该表达式的数据才能输出。
属性2:表示按该字段中的数据进行排序,排序方式由ASC或DESC参数指定。
ASC:表示按升序的顺序进行排序。即表示值按照从小到大的顺序排列。这是默认参数。
DESC:表示按降序的顺序进行排序。即表示值按照从大到小的顺序排列。

如果有WHERE子句,就按照“条件表达式1”指定的条件进行查询;如果没有WHERE子句,就查询所有记录。
如果有GROUP BY子句,就按照“属性名1”指定的字段进行分组;如果GROUP BY子句后面带着HAVING关键字,那么只有满足“条件表达式2”中指定的条件的记录才能够输出。GROUP BY子句通常和COUNT()、SUM()等聚合函数一起使用。
如果有ORDER BY子句,就按照“属性名2”指定的字段进行排序。排序方式由ASC或DESC参数指定。默认的排序方式为ASC。

二、在单表上查询数据

2.1、查询所有字段

代码如下:
select * from STUDENT;


2.2、按条件查询

(1) 比较运算符
> , < ,= , != (< >),>= , <=

select * from STUDENT where STU_AGE>13; 

in(v1,v2..vn) ,符合v1,v2,,,vn才能被查出
IN关键字可以判断某个字段的值是否在指定的集合中。如果字段的值在集合中,则满足查询条件,该纪录将被查询出来。如果不在集合中,则不满足查询条件。其语法规则如下:[ NOT ] IN ( 元素1, 元素2, …, 元素n )

select * from STUDENT where STU_AGE in(11,12); 

between v1 and v2 在v1至v2之间(包含v1,v2)
BETWEEN AND关键字可以判读某个字段的值是否在指定的范围内。如果字段的值在指定范围内,则满足查询条件,该纪录将被查询出来。如果不在指定范围内,则不满足查询条件。其语法规则如下:
[ NOT ] BETWEEN 取值1 AND 取值2

select * from STUDENT where STU_AGE between 13 and 15; 

(2)逻辑运算符

not ( ! ) 逻辑非

select * from STUDENT where STU_AGE NOT IN(13,14,16); 


or ( || ) 逻辑或
OR关键字也可以用来联合多个条件进行查询,但是与AND关键字不同。使用OR关键字时,只要满足这几个查询条件的其中一个,这样的记录将会被查询出来。如果不满足这些查询条件中的任何一个,这样的记录将被排除掉。OR关键字的语法规则如下:
条件表达式1 OR 条件表达式2 [ …OR 条件表达式n ]
其中,OR可以用来连接两个条件表达式。而且,可以同时使用多个OR关键字,这样可以连接更多的条件表达式。

select * from STUDENT where STU_ID<2005 OR STU_ID>2015; 

and ( && ) 逻辑与
AND关键字可以用来联合多个条件进行查询。使用AND关键字时,只有同时满足所有查询条件的记录会被查询出来。如果不满足这些查询条件的其中一个,这样的记录将被排除掉。AND关键字的语法规则如下:
条件表达式1 AND 条件表达式2 [ … AND 条件表达式n ]
其中,AND可以连接两个条件表达式。而且,可以同时使用多个AND关键字,这样可以连接更多的条件表达式。

(3)模糊查询

like 像

LIKE关键字可以匹配字符串是否相等。如果字段的值与指定的字符串相匹配,则满足查询条件,该纪录将被查询出来。如果与指定的字符串不匹配,则不满足查询条件。其语法规则如下:[ NOT ] LIKE '字符串' “NOT”可选参数,加上 NOT表示与指定的字符串不匹配时满足条件;“字符串”表示指定用来匹配的字符串,该字符串必须加单引号或双引号。

通配符:

% 任意字符

select * from STUDENT where STU_NAME LIKE '%王'; 
表示匹配任何以王结尾的

select * from STUDENT where STU_NAME LIKE '阿%'; 
表示匹配任何以阿开头的

_ 单个字符

比如说插入

select * from STUDENT where STU_NAME LIKE '阿%'; 

然后

select * from STUDENT where STU_NAME LIKE '阿%'; 

查询的结果为空

但是如果下后面加两个_符号

select * from STUDENT where STU_NAME LIKE '_下__'; 
查询结果不为空

“字符串”参数的值可以是一个完整的字符串,也可以是包含百分号(%)或者下划线(_)的通配字符。二者有很大区别
“%”可以代表任意长度的字符串,长度可以为0;
“_”只能表示单个字符。
如果要匹配姓张且名字只有两个字的人的记录,“张”字后面必须要有两个“_”符号。因为一个汉字是两个字符,而一个“_”符号只能代表一个字符。

(4)空值查询

IS NULL关键字可以用来判断字段的值是否为空值(NULL)。如果字段的值是空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。其语法规则如下:
IS [ NOT ] NULL
其中,“NOT”是可选参数,加上NOT表示字段不是空值时满足条件。
IS NULL是一个整体,不能将IS换成”=”.

三、使用聚合函数查询数据

3.1、group by 分组
如下:

select * from STUDENT group by STU_SEX; 
不加条件,那么就只取每个分组的第一条。

如果想看分组的内容,可以加groub_concat

select STU_SEX,group_concat(STU_NAME) from STUDENT group by STU_SEX;

3.2、一般情况下group需与统计函数(聚合函数)一起使用才有意义
先准备一些数据:

create table EMPLOYEES( 
EMP_NAME CHAR(10) NOT NULL, 
EMP_SALARY INT unsigned NOT NULL, 
EMP_DEP CHAR(10) NOT NULL 
); 
insert into EMPLOYEES values('小王',5000,'销售部'); 
insert into EMPLOYEES values('阿小王',6000,'销售部'); 
insert into EMPLOYEES values('工是不',7000,'销售部'); 
insert into EMPLOYEES values('人人乐',3000,'资源部'); 
insert into EMPLOYEES values('满头大',4000,'资源部'); 
insert into EMPLOYEES values('天生一家',5500,'资源部'); 
insert into EMPLOYEES values('小花',14500,'资源部'); 
insert into EMPLOYEES values('大玉',15000,'研发部'); 
insert into EMPLOYEES values('条条',12000,'研发部'); 
insert into EMPLOYEES values('笨笨',13000,'研发部'); 
insert into EMPLOYEES values('我是天才',15000,'研发部'); 
insert into EMPLOYEES values('无语了',6000,'审计部'); 
insert into EMPLOYEES values('什么人',5000,'审计部'); 
insert into EMPLOYEES values('不知道',4000,'审计部'); 

mysql中的五种统计函数:
(1)max:求最大值
求每个部门的最高工资:

select EMP_NAME,EMP_DEP,max(EMP_SALARY) from EMPLOYEES group by EMP_DEP;

(2)min:求最小值
求每个部门的最仰工资:

select EMP_NAME,EMP_DEP,min(EMP_SALARY) from EMPLOYEES group by EMP_DEP; 

(3)sum:求总数和
求每个部门的工资总和:

select EMP_DEP,sum(EMP_SALARY) from EMPLOYEES group by EMP_DEP 

阅读剩余部分

相关阅读 >>

压缩包版mysql怎么卸载

mysql中光标如何书写

mysql如何构造慢查询

mysql5.6主从复制(mysql数据同步配置)

mysql 如何去掉毫秒值

centos下mysql安装图文教程

mysql中存储引擎innodb与myisam的详解

细说mysql死锁与日志二三事

mysql查询最大值语句是什么

mysql中如何配置ssl_key和ssl-cert与ssl-ca的路径以及建立ssl连接的实例

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...