MySQL的基本查询,详细的解释连接查询、子查询、正则表达式查询

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



1。查询语句的基本语法。

2。查询单个表上的数据

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

4、多表联合查询

5、子查询

6。合并查询结果

7。为表和字段取别名

8。使用正则表达式查询



什么是查询



你怎么检查



数据的准备工作如下:


创建表学生(
stu_id主关键字,
stu_name char(10)不为空,
stu_age SmallInt符号不空,
stu_sex char(2)不为空
);
插入学生值(2001,王晓,13,男性);
插入学生的值(2002,明明,12,男);
插入学生的值(2003,红色的红色,14,女性);
插入学生的价值观(2004,'花',13,'女性');
插入学生值(2005,Tian Er,15,男性);
插入学生的价值观(2006,打猎,13,女性);
插入学生值(2007, 16,阿毛里,男性);
插入学生的价值观(2008, 17,'狗','男性');
插入学生的价值观(2009,'黑儿子',14,'男性');
插入学生的价值观(2010, 13,'翡翠','女性');
插入学生的价值观(2011,'头',13,'女性');
插入学生的价值观(2012,必应,14,女性);
插入学生的价值观(2013,'美丽',13,'女性');
插入学生价值观(2014, 12、神乐、男性);
插入学生值(2015,第五天,13,男性);
插入学生的价值观(2016,'小三',11,'男性');
插入学生的价值观(2017,啊张,13,'男性');
插入学生的值(2018,13,Adger,男);
插入学生的价值观(2019,宝贝,13,女性);
插入学生的价值观(2020,'国王',14,'男性');



然后这是学生得分表,它定义外键约束。


创建表级别(
stu_id INT NOT NULL,
stu_score int,
外键(stu_id)参考学生(stu_id)
);
插入等级值(2001,90);
插入等级值(2002,89);
插入等级值(67);
插入等级值(2004,78);
插入等级值(2005,89);
插入等级值(地理研究);
插入等级值(2007,99);
插入等级值(2008,87);
插入等级值(70);
插入等级值(2010,71);
插入等级值(2011,56);
插入等级值(2012,85);
插入等级值(2013,65);
插入等级值(2014,66);
插入等级值(2015,77);
插入等级值(2016,79);
插入等级值(2017,82);
插入等级值(2018,88);
插入到等级值(2019,NULL);
插入到等级值(2020,NULL);


首先,查询语句的基本语法



查询数据是指从数据库中的数据表或视图中获取所需的数据,在MySQL中,SELECT语句可以用来查询数据,根据查询条件的不同,数据库系统会发现不同的数据。

SELECT语句的基本语法格式如下:


选择属性列表
从表名或视图列表
{条件表达式1 }
{按属性分组1 {有条件表达式2 }
{按属性名2 | } } { ASC DESC


属性列表:需要查询的字段的名称。

表名或视图列表:将要查询数据的数据表或视图,表或视图可以有多个表。

条件表达式1:设置查询的条件。

属性名称1:表示该字段中的数据分组。

条件表达式2:显示满足表达式的数据可以输出。

性质2:代表排序字段中的数据排序方法,并指定由ASC或DESC参数。

ASC:订单是按升序排序的,也就是说,这些值是按小到大的顺序排列的,这是默认参数。

属性:顺序是按照降序进行排序,排序的值从大到小。

如果有WHERE子句,则根据条件表达式1中指定的条件进行查询;如果没有WHERE子句,则查询所有记录。

如果有一个组BY子句,它将根据属性名1指定的字段进行分组。如果有关键字后面跟着组子句,那么只能输出满足条件表达式2中指定条件的记录。

如果有一个订单的条款,在属性名称2中指定的字段进行排序。排序方法由ASC或DESC参数中指定的默认排序是ASC。

两。查询单个表上的数据



2.1。查询所有字段


复制代码代码如下:从学生中选择*;




2.2。查询条件

(1)比较运算符

> < < > >。


选择*从学生那里stu_age > 13;


(V1,V2,在VN),符合V1,V2,,,VN可以发现

in关键字可以确定字段的值是否在指定的集合中。如果字段的值在集合中,则满足查询条件,并且记录将被查询。如果它不在集合中,则查询条件不满足。它的语法规则如下:(元素1,元素2,元素n){不}。


选择*从学生那里stu_age在(11,12);



在V1和V2之间的V1和V2之间(包括V1、V2)

中间和关键字可以判断字段的值是否在指定的范围内。如果字段的值在指定的范围内,则查询条件被满足,记录将被查询。如果不在指定的范围内,则查询条件不满足。其语法规则如下:

{介于值1和值2之间的{ }




选择*从学生那里stu_age 13和15之间;




(2)逻辑运算符


不是(!)逻辑是不是


选择*从学生那里stu_age不(13,14,16);





或(| |)或逻辑

关键字也可以用于组合多个查询条件,但与关键字不同,当使用关键字时,这样的记录将被查询,只要满足这些查询条件中的一个。如果没有满足这些查询条件,这样的记录将被排除。关键字或关键字的语法规则如下:

条件表达式1或条件表达式2 {或条件表达式}

在此,或可用于连接两个条件表达式。此外,可以同时使用多个或键,以便可以连接更多条件表达式。


选择*从学生那里stu_id2015;



和()逻辑和

关键字和关键字可用于组合多个查询条件。当使用关键字和关键字时,将同时查询满足所有查询条件的记录。如果其中一个查询条件未满足,则将排除这样的记录:

条件表达式1和条件表达式2 {和条件表达式}

在这一点上,可以连接两个条件表达式,而且可以同时使用多个键和键,从而可以连接更多的条件表达式。
(3)模糊查询
像图像
类似的关键词可以匹配一个字符串是否相等,如果一个字段的值与指定的字符串匹配,查询满足条件的记录,并将查询。如果它不符合指定的字符串,查询条件不满足,它的语法规则如下:{不}如弦不可选参数,再加上没有表明匹配字符串不与指定的字符串匹配,满足条件;字符串代表指定匹配的字符串,而字符串必须加单引号或者双引号。
通配符:
%的任意字符


选择*从学生那里stu_name像国王;

表示国王结束时的任何匹配。



选择*从学生那里stu_name像‘%;

代表任何一个的开始



_单个字符
例如,插入


选择*从学生那里stu_name像‘%;


然后


选择*从学生那里stu_name像‘%;


查询的结果是空的。



但如果未来两_符号




选择*从学生那里stu_name像'_下__;

查询的结果不是空的。


字符串参数的值可以是一个完整的字符串,也可以包含百分比(%)或下划线(_)通配符。两者之间有很大的差异

%可以表示任意长度的字符串,长度可以是0;

_只能代表一个字符。

如果你想要的名称,只有两个字记录姓氏匹配,后面一个字必须有两_符号。因为汉字是两个字,一个_符号代表的只有一个人物。



(4)空值查询



空关键字可用于确定字段的值是否为空值(NULL)。如果字段的值为空值,则满足查询条件,并记录查询。如果字段的值不是空值,则查询条件不满足。其语法规则如下:

{ }是否为空

在这里,不是一个可选参数,也不表明字段满足条件时,它不是一个空值。

NULL是一个整体,是不能被取代的。



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

3.1、分组分组

如下:


选择stu_sex从学生组*;

没有条件的话,每组只有第一部分。

如果你想看集团的内容,您可以添加groub_concat




选择stu_sex,group_concat(stu_name)从学生群体的stu_sex;




3.2。一般来说,组需要与统计函数(聚合函数)一起使用才有意义。

先准备一些数据:




创建表员工(
emp_name char(10)不为空,
emp_salary int unsigned不空,
emp_dep char(10)不为空
);
插入员工价值('xiao王,5000,销售部);
插入员工价值(国王一点王,6000,销售部);
插入员工价值(工作不,7000,销售部);
插入雇员值(3000,每个人,资源);
插入员工价值(满头,4000,人力资源部);
插入员工价值(三人,5500,人力资源部);
插入员工价值(花,14500,人力资源部);
插入员工价值(‘玉',15000,研发部);
插入员工价值('bar ',12000,研发部);
插入员工价值观(笨笨、13000、研发部);
插入员工价值观(我是天才,15000,研发部门);
插入员工价值观(不言,6000,审计部);
插入员工价值('person,5000,审计部);
插入员工价值观(不知道,4000,审计部);



MySQL中的五个统计函数:

(1)max:求最大值

谋求各部门最高工资:




选择emp_name,emp_dep,max(emp_salary)从员工的emp_dep组;




(2)min:最小值

谋求各部门的最高工资:




选择emp_name,emp_dep,min(emp_salary)从员工的emp_dep组;




(3)求和:求和和

总结各部门的工资总额:




选择emp_dep,和(emp_salary)从员工的emp_dep组




(4)AVG:平均值

寻找各部门的平均工资




选择emp_dep,AVG(emp_salary)从员工的emp_dep组;




(5)计数:总行数

每个部门的工资超过一定数额的人数。




选择emp_dep,计数(*)从员工那里emp_salary > = 500组emp_dep;




3.3、现场有条件的公司,使用具有语句过滤分组数据

子句的功能是过滤满足条件的组。这是在分组后过滤数据。在这种情况下,它通常包含一组函数。它通过使用条件来显示特定的组,也可以使用多个分组标准来分组。

带子句已经限制在SELECT语句中定义的列和聚合表达式中。一般来说,您需要通过在SELECT子句中重复聚合函数表达式来引用聚合值,如SELECT语句中所做的那样。


代码复制代码如下:选择emp_dep,AVG(emp_salary),group_concat(emp_name)从员工的emp_dep集团有。

找一个平均工资超过6000的部门,列出部门里的所有人员。




四、多表联合查询

多表的联合查询分为内部连接查询和外部连接查询。

(1)隐式内部连接查询


复制代码代码如下:选择student.stu_id,student.stu_name,student.stu_age,student.stu_sex,grade.stu_score从学生、年级学生。stu_id = grade.stu_id,等级;
查找超过90分的学生信息:


(2)显式内部连接查询


复制代码代码如下:选择student.stu_id,student.stu_name,student.stu_age,student.stu_sex,从学生内部联接级,grade.stu_score加入,


用法:选择…表1关于条件表达式的内部联接表2

(3)外部连接查询

左连接。左连接查询。

用法:选择…在表1中,关于条件表达式的左连接表2

这意味着表1中的数据不能为空,但其对应表2的数据可以为空。


复制代码代码如下:选择student.stu_id,student.stu_name,student.stu_age,student.stu_sex,grade.stu_score学生左连接级,左;


右连接正好相反,用法相同。

当使用左连接时,左侧连接操作符的左侧和内部信息将被查询,右侧的记录也不会填充空白(null)。右连接;内部连接仅在合适的条件下才会显示。

全连接()

完整的外部连接返回左表和右表中的所有行。当一行与另一表中的行不匹配时,另一表的选择列表列包含空值。如果表之间有匹配,则整个结果集行包含基表的数据。

价值。

当属于两个表的至少一个行符合连接条件时,内联返回到该行。内部连接消除了与另一个表中的任何行不匹配的行。外部连接返回至少一个表中的from子句或

视图的所有行,只要这些行符合任何位置或具有搜索条件。检索左表外部引用的所有行,以及右行引用的右表的所有行。

部分连接中的两个表的所有行都将返回。



五、子查询

选择一个查询作为另一个查询的条件

语法:select * from表1当条件1(选择..从表2条件2)

1,结合在




选择*从学生那里stu_id在(选择stu_id年级在stu_score > 85);


查找超过85分的学生信息



2,结合存在

的存在和不存在运营商只测试子查询返回的数据线。如果是,存在是真实的,不存在将假。




选择*从学生那里存在(选择stu_id年级在stu_score > = 100);



如果学生的分数大于100,所有学生的信息将被查询。



3,所有,任何,和一些子查询

任何运营商和所有运营商的一个常见用途是组合相对查询一个数据的例子的测试结果,测试是否比较价值与全部或部分的子查询返回的值。例如,如果比较值小于或等于每一个值的子查询返回的,< =所有会是真的。如果比较值小于或等于任何值的子查询返回,<=任何会是真的。有些是同义词吗。




选择stu_id从哪里stu_score<67级;



只要学校的数字比上面任何一个都大,就会显示出来:


复制代码如下:选择*从学生那里stu_id任何(选择stu_id级=在stu_score<67);



六。合并查询结果

合并查询的结果是将多个SELECT语句的查询结果合并在一起,在某些情况下,需要合并几个SELECT语句的结果来显示。

使用联合关键字时,数据库系统将所有查询结果合并在一起,然后删除相同的记录:




选择语句1
联盟的所有|
选择语句2
联盟的所有|的…
选择语句n;


七,排序和抓取

7.1,订单由

(1)按价格顺序按升序排列

(2)降序降序 / /订单价格

(3)按升序、默认顺序订购价格。

(4)按顺序排列,效率不高。




SELECT * FROM等级在80阶的stu_score stu_score >;



默认值是升序,

也可以用这种方式写。




SELECT * FROM级,stu_score > 80阶的stu_score ASC;



结果如下:



如果你想转换成降序:




SELECT * FROM级,stu_score > 80阶的stu_score desc;



7.2、限制



限制{偏移量,}

偏移量偏移量,可选的,不写等于0,N

去掉条目

拿前5分




选择stu_score DESC LIMIT 5级阶*;



得分最低的前5分


选择stu_score ASC限制5级阶*;





10点15分排名5分


选择stu_score DESC LIMIT 10,5从等级秩序*



八。为表和字段取别名



用在列表中




选择stu_id学号、评分stu_score年级;



当表的名称很长时,在查询中直接使用表名是不方便的。此时,您可以为表取一个别名。使用这个别名替换表的名称。

MySQL中表的别名的基本形式如下:

表列表的别名


复制代码代码如下:选择s.stu_id,s.stu_name,s.stu_age,s.stu_sex,从学生、G级,级g.stu_score,


九。使用正则表达式查询



正则表达式是一种在某一类的字符串模式匹配。例如,正则表达式可以用来查询字符串包含任何字母A,B,和C与更强大的正则表达式字符查询查询功能比较,更灵活。正则表达式可以应用到非常复杂的查询。

在MySQL中,正则表达式关键字用于查询匹配的正则表达式,基本形式如下:

属性名的正则表达式匹配


使用前插入一些数据:




插入学生的价值(2022,'12wef ',13,男);
插入学生的价值(2023,'faf_23 ',13,男);
插入学生的值(2024,13,'fafa ','女');
插入学生的价值(2025,'ooop ',14,男);
插入学生的价值(2026,'23oop ',14,男);
插入学生的价值(2027,'woop89 ',14,男);
插入学生的价值(2028,'abcdd ',11,男);


(1)可以与字符或字符串匹配的记录,字符为。

打听所有的头




选择*从学生那里stu_name regexp的^ O;



开始数




选择*从学生那里stu_name regexp的^ { 0-9 };


(2)可以使用字符$在特定字符或字符串的结尾匹配的记录。

在数字的结尾




选择*从学生那里stu_name regexp的{ 0-9 } $;



(3)当正则表达式用于查询时,可以使用字符串中的任何字符代替它。




选择*从学生那里stu_name regexp的^ W…{ 0-9 } $;


在W开始时,数字结束,中间有4个。


(4)使用方括号({ })

字符集可以由所需的查询字符组成。只要在记录中包含方括号中的任何字符,记录将被查询。

例如,包含A、B和C的三个字母中的任何一个都可以通过abc查询。

使用方括号可以指定集合的间隔。

{ }代表从a-z A-Z的所有信件;

{ }表示0-9的所有数字0-9;

{ a-z0-9 }表示所有小写字母和数字都包括。

{ a-za-z }表示匹配所有的字母。

选择*从学生那里{ }0-9a-z stu_name regexp;

用数字和小写字母查询所有这些单词


{字符集的使用可以与外部指定字符}字符匹配。

(5){ }表示出现的次数。



在正则表达式中,字符串{米}指示字符串出现m次连续;字符串{m,n}指示字符序列至少出现m次至少和最多N倍。例如,AB { 2 }指示字符串AB连续出现两次。AB {二}指示字符串AB的出现至少两次至少四次。

O出现2次




选择*从学生那里stu_name regexp'o { 2 };



(6)+表示较少发生

FA至少出现一次




选择*从学生那里stu_name regexp(FA)+;




小心 uff1a

正则表达式可以匹配字符串,当表中的记录包含这个字符串,记录可以查询。如果指定多个字符串,需要通过一个符号|分离。只是匹配任何这些字符串,每个字符串之间和|空间。因为,在查询过程中,数据库系统还将利用空间为特征。所以你不能找到你想要的东西。

在正则表达式中,*和+可以匹配符号前面的字符数。但是,+表示至少一个字符,而*可以表示零字符。



以上就是这篇文章的全部内容,希望大家能喜欢。