Mysql学习08----查询数据

一. 单表查询

1.1 查询所有字段

(1)在select语句中使用(*)通配符查询所有字段

           select *from 表名;

(2)在select语句中指定所有字段

          select  f_id,s_id,f_name from fruits;

1.2 查询指定字段

(1)查询单个字段

          select 列名 from 表名;

(2)查询多个字段

          select 字段名1,字段名2,字段... n  from 表名;

1.3 查询指定记录

语法:

select 字段名1,字段名.....n from 表名  where  查询条件

1.4 带IN关键字的查询

使用in操作符,将所有检索条件用括号括起来,检索田间之间用逗号分隔开,只要满足条件范围内的一个值极为匹配项。

select name,id from user where id in(101,102) order by name;

1.5 带between and的范围查询

它用来查询某个范围内的值。

select name, price from fruits where price between 2 and 10.20;

将会返回2到10.20之间的所有水果

1.6 带like的字符匹配查询

(1) %匹配任意长度的字符,甚至包括零字符

          select id,name from fruits where name like 'b%';

(2)下划线一次只可以匹配任意一个字符。

1.7 查询空值

       select id,name from user where name is null;

1.8 带AND或者OR的多条件查询

       select id,price,name from frutis where id='23' and id='101' and price>=23;

1.9 查询结果不重复

       select distinct 字段名 from 表名;

1.10 对查询结果进行排序

(1)单列排序

           select name from user order by name;

(2)多列排序

           select name,price from fruits order by name,price;

            先以name后以price排序

(3)指定排序方向

         默认是按照字母升序排列,但是可以通过关键字DESC降序/ASC(升序)。

          select name from fruits order by price desc;

1.11 分组查询

[ group by 字段] [having <条件表达式>]

(1)创建分组

    假设有这样一个user表,对他进行group操作后:

 1 mysql> select *from user;
 2 +------+------+
 3 | id   | name |
 4 +------+------+
 5 |    1 | a    |
 6 |    2 | b    |
 7 |    3 | c    |
 8 |    1 | d    |
 9 |    1 | e    |
10 |    1 | f    |
11 |    3 | g    |
12 |    2 | m    |
13 +------+------+
14 8 rows in set (0.00 sec)
15 
16 mysql> select id,count(*) as total from user group by id;
17 +------+-------+
18 | id   | total |
19 +------+-------+
20 |    1 |     4 |
21 |    2 |     2 |
22 |    3 |     2 |
23 +------+-------+
24 3 rows in set (0.00 sec)
View Code

    (2)使用having过滤分组

        满足过滤条件的分组才会被显示

1 mysql> select id,count(*) as total from user group by id having total>2;
2 +------+-------+
3 | id   | total |
4 +------+-------+
5 |    1 |     4 |
6 +------+-------+
7 1 row in set (0.00 sec)
View Code

note: HAVING关键字和WHERE关键字都是用来过滤数据,它们之间最重要的一点区别就是HAVING在数据分组之后进行过滤来选择分组,而WHERE在分组之前用来选择记录。另外WHER排除的记录不再包括在分组中。

note: 当group by和order by合用的时候,先group by,再order by

举例:

加入有上面这样数据的一张表,执行下面操作有:

1.12 使用limit限制查询结果的数量

limit[位置偏移量,]  行数

位置偏移量指的是从表的第几条记录开始(索引从0开始)。行数代表返回的记录条数。

二. 使用聚合函数查询

select count(price) from order;

三.连接查询

 1. 内连接查询----INNER JOIN

假设有如下两个表a,b

 

进行如下操作,发现结果是一样的

连接查询不再是之前学习的只在一张表中进行操作了,它可以连接多个表进行操作。

Note: 自连接查询作为内连接的一种特殊连接。如果在一个连接查询中,涉及的两个表都是同一个表,这种查询称为自连接查询。它是指相互连接的表在物理上为同一张表,但是在逻辑上可以是两张表。

a1和a2采用了别名机制。防止二义性。

2. 外连接查询

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

LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。

RIGHT JOIN(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。

2.1 LEFT JOIN(左连接)

假设有两个表,customers和orders。现在想要查找客户对应的订单个数:

说明:这样就包含了左表customers中的所有行。

2.2 右连接-----RIGHT JOIN

原理类似左连接,只是包含了右表的所有行。

四. 子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询。在select查询中先计算子查询,子查询结果作为外层另一个查询的过滤条件,查询可以基于一个表或者多个表。子查询中常用的操作符有ANY(SOME)、ALL、IN、EXISTS。并且,子查询中可以使用比较运算符。

1. 带ANY、SOME关键字的子查询

ANY和SOME关键字是同义词,表示满足其中任意一个条件。ANY接在一个比较操作符的后面,表示若与子查询返回的任何值比较为true,则返回true

2. 带ALL关键字的子查询

区别于ANY和SOME,ALL需要同时满足所有内层查询的条件。

3. 带EXISTS关键字的子查询

比如两个表:

说明:因为b中没有等于27的行,因此exists的结果是false,因此外层查询不能执行;

note: not exists和exists的用法相反。

4. 带IN关键字的子查询

相当于or的含义。

note: not in和in的作用正好相反

五. 合并查询结果

利用union可以合并多条select语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。

union:删除重复记录

union all:不删除重复记录,并且也不对结果进行自动排序

note:还可以使用正则表达式进行查询

参考文献:

《Mysql5.7从入门到精通》

猜你喜欢

转载自www.cnblogs.com/Hermioner/p/10332075.html
今日推荐