MySQL学习之数据库查询

时间:2024-03-16 15:03:10

数据库查询

一、基本查询语句

Select

{* |<字段列表>}      

[

From <table1>,<table2>……

[where <expr>]

[group by <group by definition>]           //显示出来按字段分组

[having <expression> {{<operator><expression>}......}]    

[order by <order by definition>]   //显示出来的顺序ASC,DESC

[limit [<offset>,]<row count>]    //每次显示查询出来的数据条数

]

 

Select [字段1,字段2,……,字段n]

From [表或视图]

Where [查询条件];

二、单表查询

1、select语句查询所有字段(用*、自己指定所有字段

Select * from table_name;

Select 字段1,字段2,……,字段n from table_name;

一般情况下不用*,因为在指定的情况下可以节省输入查询语句的时间,只有在不知道字段名的情况下才用*

2、查询单个、或多个字段

Select 字段1  from table_name;

Select 字段1,字段2, from table_name;

3. 查询指定纪录

Select 字段1,字段2,字段3……

From table_name

Where 查询条件

其中查询条件判断符有:=/<>/!=/</<=/>/>=/between

3、带有in的关键字

in用来查询指定范围内的条件记录,所有检索调价用括号括起来,用逗号隔开

Select s_id,f_name,f_price from fruits where s_id in(101,102) order by f_name;

Not in 用来检索不再指定范围内的记录

4、between and 的范围查询

5、Like的查询

1)百分号通配符%’匹配任意长度的字符,甚至包括零字符

Select f_id,f_name from fruits where f_name like’b%’;//b开头的字符

Like ‘%g%’——含有g

2) 下划线通配符’_’,一次只能匹配任意一个字符

Select f_id,f_name from fruits where f_name like’_____b’;//匹配长度为5且以b为结尾的字符

6、查询空字符

 Select * from table_name where 字段名 is null

 Select * from table_name where 字段名 is not null //查找不为空的

7、带有and的多条件查询

8、带有or的多条件查询

9、对查询结果进行排序

1)单列排序 select * from table_name order by 字段名;

2)多列排序 select * from table_name order by 字段1,字段2;——首先排序的是第一列,如果第一列相同再按第二列进行排序

3)指定排序方向——默认情况下是升序,ASCDESC是降序

10、分组查询

分组查询是对数据按照某个或者多个字段进行分组,group by

[Group by 字段] [having <条件表达式>]
1)创建分组

Group by通常和集合函数一起使用,如max(),min(),count(),sum(),avg();

Select s_id,count(*) as total from fruits group by s_id;

2)使用having过滤分组

Select s_id,group_concat(f_name) as names from fruits group by s_id having count(f_name)>1;

Havingwhere都是用来过滤数据,二者区别

Having是在数据分组之后进行过滤来选择分组,where是分组之前用来选择记录的

3)在group by子句中使用with rollup(with rollup用于统计记录数量

4)多字段分组

5)Group byorder by一起使用

需要注意的是group by中使用rollup时,不能使用order by子句对结果进行排序。Rolluporder by是互相排斥的

11、limit限制查询结果数量

Limit [位置偏移量,] 行数

Select * from table_name 4;//查询表中的前四条记录

Select * from table_name 3,5;//查询从第4条记录开始5条记录

三、使用聚合函数查询

1、Avg():返回某列的平均值

2、Count():返回某列的行数

count(*):回表中总的行数,不管某列有数值或为空值

count(字段名):计算指定列的总行数,计算忽略空值的行

3、Max():返回某列的最大值

4、Min():返回某列的最小值

5、Sum():返回某列值的和:在计算时忽略列值为null的行

 

四、连接查询

连接是关系数据库模型中的主要特点,连接查询是关系数据库中的主要查询,主要包括内连接、外连接等,通过连接运算符可以实现多个表查询。

1、内连接查询(inner join

使用比较运算符进行表间某些列数据的比较操作,并列出这些表中与连接条件相匹配的数据行组合成新的记录。

2、外连接查询left join/right join

1)左连接:返回左表中的所有记录右表连接字段相等的记录

2)右连接:返回右表中的所有记录左表连接字段相等的记录

3)复合条件连接查询:在连接的基础上添加过滤条件

连接比较及其区别:(下图来自网络,侵权删)

 MySQL学习之数据库查询MySQL学习之数据库查询

五、子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询,子查询的操作符all(some),all,in,exists.

1)带有any/all/关键字的查询

Select num1 form table1 where num1>any(select num2 from table2);——any:只要大于子查询结果中的任意一个就行。

Select num1 form table1 where num1>all(select num2 from table2);——all:大于子查询的所有结果。

2)exists关键字查询

Exists关键字后面的参数是任意一个子查询,系统对子查询运算判断它是否返回行,如果至少返回一行,那么结果为true,此时外层查询语句进行查询

 

Not exists关键字与exists 返回结果相反,如果至少返回一行,那么结果为false,外层语句不再进行查询。

 

Existsnot exists结果只取决于是否会返回行,而不取决于这些行的内容,成功与否决定是否进行外层查询。

3)in关键字的子查询

内层查询语句仅仅返回一个数据列,这个数据列里的值将提供外层查询语句进行比较操作。

4)带有比较运算符的子查询

 

6、合并查询结果

Union关键字可以合并多条select语句。

Union不适用关键字all,执行时会删掉重复的记录,所有的返回结果唯一的

Union使用关键字all,执行时不会删掉重复的记录也不会对结果进行自动排序。

Select s_id,f_name,f_price from fruits where f_price<5.2

Union all

Select s_id,f_name,f_price from fruits where s_id in(103,101);

 

7、为表或字段取别名

1)为表取别名 table_name as tablename1;

2)为字段名取别名 列名 as 列名1

8、使用正则表达式regexp

1)^查询以特定的字符或字符串开头的记录

Select * from fruits where f_name regexp ‘^b’;//查询以b开头

2)’$’查询以特定的字符或字符串结尾的记录

Select * from fruits where f_name regexp ‘y$’;//查询以y结尾

3)使用’.’匹配任何一个字符

4)使用*’、‘+匹配多个字符

5)匹配指定的字符串 regexp ‘指定的字符串

Likeregexp的区别:like匹配的字符串在文本中间出现这找不到它,而regexp在文本内部进行匹配,如果被匹配的字符在文本内部出现也能找到。

6)匹配指定字符中的任意一个

[字符集合]——只匹配字符集合中任何一个字符,即为所查找的文本

7)匹配指定字符以外的

[^字符集合]——匹配在字符集合之外的字符

8)使用{n,}/{n,m}来制定字符串连续出现的次数

n至少匹配n次前面的字符,

{n,m}——不少于n次,不多于m

Select * from fruits where f_name regexp ‘ba{1,3}’;

 MySQL学习之数据库查询

解惑:

1、Distinct 应用于所有的列

2、Order by可以和limit使用吗?——可以使用,但是limit必须在order by后面使用。

3、什么时候使用引号?——单引号是用来限定字符串,如果将值与字符串类型列进行比较,则需要限定引号,而用来与数值进行比较则不需要限定引号。

4、where子句中必须使用圆括号吗?——任何时候使用andor操作符的where子句,都应该使用圆括号明确操作顺序。

5、为什么使用通配符格式正确,却没有查找出符合条件的记录?——MySQL在存储字符串时可能不小心把两端带有空格字符串保存到记录中,解决方法是使用trim函数将空格符号删除再进行匹配。