MySQL学习——SQL查询语句(一)

查询数据是指从数据库中获取所需要的数据,查询数据是数据库操作中最常用也是最重要的操作,用户可以根据对数据的需求,使用不同的查询方式,通过不同的查询方式可以获得不同的数据,在MySQL中使用select语句进行查询,本篇内容主要包括:

1.查询语句的基本语法;

2.在单表上查询数据;

3.使用聚合函数查询数据;

4.多表联合查询;

5.子查询;

6.合并查询结果;

7.为表和字段取别名;

8.使用正则表达式查询;

1.基本查询语句

  select语句基本语法格式:

select 属性列表
         from  表名和视图列表
         where 条件表达式1
         group by  属性1   【HAVING  条件表达式2】
         order by  属性2  【ASC |  DESC】


注:属性列表参数表示需要查询的字段名,
      表名和视图列表 参数表示从哪查,可以有多个
      属性1 表示按该字段中的数据进行分组
      属性2 参数该字段中的数据进行排序(ASC 表示升序,DESC表示降序,默认升序)


例:

mysql> select num,d_id,name,age,sex,homeaddr from examplee;
+------+------+--------+------+------+----------+
| num | d_id | name | age | sex | homeaddr |
+------+------+--------+------+------+----------+
| 1 | 1001 | aa | 24 | w | abc |
| 3 | 1003 | cxsa | 25 | w | abc |
| 2 | 1002 | cxsa | 21 | m | abc |
| 4 | 1004 | ccdxsa | 27 | w | abc |
+------+------+--------+------+------+----------+
4 rows in set (0.00 sec)

mysql> select num,d_id,name,age,sex,homeaddr from examplee
-> where age<26
-> order by d_id DESC;
+------+------+------+------+------+----------+
| num | d_id | name | age | sex | homeaddr |
+------+------+------+------+------+----------+
| 3 | 1003 | cxsa | 25 | w | abc |
| 2 | 1002 | cxsa | 21 | m | abc |
| 1 | 1001 | aa | 24 | w | abc |
+------+------+------+------+------+----------+
3 rows in set (0.04 sec)

mysql>


2.单表查询

2.1 查询说有字段

1.列出表的所有字段
2.使用 * 查询所有字段


mysql> select * from examplee;
+------+------+--------+------+------+----------+
| num  | d_id | name   | age  | sex  | homeaddr |
+------+------+--------+------+------+----------+
|    1 | 1001 | aa     |   24 | w    | abc      |
|    3 | 1003 | cxsa   |   25 | w    | abc      |
|    2 | 1002 | cxsa   |   21 | m    | abc      |
|    4 | 1004 | ccdxsa |   27 | w    | abc      |
+------+------+--------+------+------+----------+
4 rows in set (0.00 sec)

mysql>

2.2 查询指定字段

mysql> select num from examplee;
+------+
| num  |
+------+
|    1 |
|    3 |
|    2 |
|    4 |
+------+
4 rows in set (0.00 sec)

mysql>

2.3 查询指定记录

#查询id=1001的数据
mysql> select * from examplee where d_id=1001;
+------+------+------+------+------+----------+
| num  | d_id | name | age  | sex  | homeaddr |
+------+------+------+------+------+----------+
|    1 | 1001 | aa   |   24 | w    | abc      |
+------+------+------+------+------+----------+
1 row in set (0.00 sec)

mysql>

注:where字句常用的查询条件

 

 2.4 带IN关键字的查询

  IN关键字可以判断某个字段的值是否在指定的集合中,如果满足查询条件该记录将被查出来,如果不满足则查询失败,查询无果

  格式:【NOT】 IN (元素1,元素2……元素n)

mysql> select * from examplee where d_id in(1001,1004);
+------+------+--------+------+------+----------+
| num  | d_id | name   | age  | sex  | homeaddr |
+------+------+--------+------+------+----------+
|    1 | 1001 | aa     |   24 | w    | abc      |
|    4 | 1004 | ccdxsa |   27 | w    | abc      |
+------+------+--------+------+------+----------+
2 rows in set (0.00 sec)

mysql>

mysql> select * from examplee where name not in('aa','cxsa');
+------+------+--------+------+------+----------+
| num  | d_id | name   | age  | sex  | homeaddr |
+------+------+--------+------+------+----------+
|    4 | 1004 | ccdxsa |   27 | w    | abc      |
+------+------+--------+------+------+----------+
1 row in set (0.00 sec)

mysql>

2.5 带 BETWEEN AND的范围查询

  between and关键字可以判断某个字段的值是否在指定的范围内,

  格式:【NOT】 BETWWEN 取值1 AND 取值2

mysql> select * from examplee where age between 15 and 25;
+------+------+------+------+------+----------+
| num  | d_id | name | age  | sex  | homeaddr |
+------+------+------+------+------+----------+
|    1 | 1001 | aa   |   24 | w    | abc      |
|    3 | 1003 | cxsa |   25 | w    | abc      |
|    2 | 1002 | cxsa |   21 | m    | abc      |
+------+------+------+------+------+----------+
3 rows in set (0.00 sec)

mysql>


mysql> select * from examplee where age not between 15 and 25;
+------+------+--------+------+------+----------+
| num  | d_id | name   | age  | sex  | homeaddr |
+------+------+--------+------+------+----------+
|    4 | 1004 | ccdxsa |   27 | w    | abc      |
+------+------+--------+------+------+----------+
1 row in set (0.00 sec)

mysql>

2.6 带LIKE的字符匹配查询

  LIKE关键字可以匹配字符串是否相等,意思就是长得像……

  格式: 【NOT】 LIKE ‘字符串’

mysql> select * from examplee where name like 'a%';
+------+------+------+------+------+----------+
| num  | d_id | name | age  | sex  | homeaddr |
+------+------+------+------+------+----------+
|    1 | 1001 | aa   |   24 | w    | abc      |
+------+------+------+------+------+----------+
1 row in set (0.00 sec)

mysql>



注:‘%’可以代表任意长度的字符串,长度可以为0
    ‘—’只能表示单个字符

2.7 查询空值

 IS NULL 关键字可以用来判断字段的值是否为空

格式:IS 【NOT】 NULL

mysql> select * from examplee where homeaddr is null;
Empty set (0.00 sec)

mysql>

2.8 带AND的多条件查询

mysql> select * from examplee where d_id=1001 and sex like 'w';
+------+------+------+------+------+----------+
| num  | d_id | name | age  | sex  | homeaddr |
+------+------+------+------+------+----------+
|    1 | 1001 | aa   |   24 | w    | abc      |
+------+------+------+------+------+----------+
1 row in set (0.00 sec)

mysql>


mysql>
mysql> select * from examplee where d_id<1004 and age>24 and sex='w';
+------+------+------+------+------+----------+
| num  | d_id | name | age  | sex  | homeaddr |
+------+------+------+------+------+----------+
|    3 | 1003 | cxsa |   25 | w    | abc      |
+------+------+------+------+------+----------+
1 row in set (0.00 sec)

mysql>

  

2.9 带OR的多条件查询

mysql> select * from examplee where d_id<1002 or sex like 'w';
+------+------+--------+------+------+----------+
| num  | d_id | name   | age  | sex  | homeaddr |
+------+------+--------+------+------+----------+
|    1 | 1001 | aa     |   24 | w    | abc      |
|    3 | 1003 | cxsa   |   25 | w    | abc      |
|    4 | 1004 | ccdxsa |   27 | w    | abc      |
+------+------+--------+------+------+----------+
3 rows in set (0.00 sec)

mysql>


mysql> select * from examplee where num in(1,2,3) or age between 20 and 27 or homeaddr like 'a%';
+------+------+--------+------+------+----------+
| num  | d_id | name   | age  | sex  | homeaddr |
+------+------+--------+------+------+----------+
|    1 | 1001 | aa     |   24 | w    | abc      |
|    3 | 1003 | cxsa   |   25 | w    | abc      |
|    2 | 1002 | cxsa   |   21 | m    | abc      |
|    4 | 1004 | ccdxsa |   27 | w    | abc      |
+------+------+--------+------+------+----------+
4 rows in set (0.00 sec)

mysql>

2.10 查询结果不重复

  如果表中的某些字段上没有唯一性约束,这些字段可能存在重复的值

  select 语句中使用 DISTINCT关键字来消除重复的记录

  格式: select DISTINCT 属性名

mysql>
mysql> select DISTINCT d_id from examplee;
+------+
| d_id |
+------+
| 1001 |
| 1003 |
| 1002 |
| 1004 |
+------+
4 rows in set (0.00 sec)

mysql>

2.11 对查询结果进行排序

从表中查询出来的数据可能是无序的,或者其排序顺序不是用户所期望的顺序,为了使查询结果满足用户的需求,可以使用 order by关键字记录进行排序;

  格式:ORDER BY 属性名 【ASC(升序) | DESC(降序)】

mysql>
mysql> select * from examplee;
+------+------+--------+------+------+----------+
| num  | d_id | name   | age  | sex  | homeaddr |
+------+------+--------+------+------+----------+
|    1 | 1001 | aa     |   24 | w    | abc      |
|    3 | 1003 | cxsa   |   25 | w    | abc      |
|    2 | 1002 | cxsa   |   21 | m    | abc      |
|    4 | 1004 | ccdxsa |   27 | w    | abc      |
+------+------+--------+------+------+----------+
4 rows in set (0.00 sec)

mysql> select * from examplee order by age ASC;
+------+------+--------+------+------+----------+
| num  | d_id | name   | age  | sex  | homeaddr |
+------+------+--------+------+------+----------+
|    2 | 1002 | cxsa   |   21 | m    | abc      |
|    1 | 1001 | aa     |   24 | w    | abc      |
|    3 | 1003 | cxsa   |   25 | w    | abc      |
|    4 | 1004 | ccdxsa |   27 | w    | abc      |
+------+------+--------+------+------+----------+
4 rows in set (0.00 sec)

mysql>


mysql>
mysql> select * from examplee order by d_id ASC,age DESC;
+------+------+--------+------+------+----------+
| num | d_id | name | age | sex | homeaddr |
+------+------+--------+------+------+----------+
| 1 | 1001 | aa | 24 | w | abc |
| 2 | 1002 | cxsa | 21 | m | abc |
| 3 | 1003 | cxsa | 25 | w | abc |
| 4 | 1004 | ccdxsa | 27 | w | abc |
+------+------+--------+------+------+----------+
4 rows in set (0.00 sec)

mysql> update examplee set d_id = 1001 where num = 2;
Query OK, 1 row affected (0.09 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from examplee order by d_id ASC,age DESC;
+------+------+--------+------+------+----------+
| num | d_id | name | age | sex | homeaddr |
+------+------+--------+------+------+----------+
| 1 | 1001 | aa | 24 | w | abc |
| 2 | 1001 | cxsa | 21 | m | abc |
| 3 | 1003 | cxsa | 25 | w | abc |
| 4 | 1004 | ccdxsa | 27 | w | abc |
+------+------+--------+------+------+----------+
4 rows in set (0.00 sec)

mysql>

 

2.12 分组查询

group by 关键字可以将查询结果按某个字段或者多个字段进行分组,字段相等的为一组

格式: GROUP BY 属性名 【HAVING 条件表达式】【WITH ROLLUP】

mysql> select sex,count(*) from examplee group by sex;
+------+----------+
| sex  | count(*) |
+------+----------+
| m    |        1 |
| w    |        3 |
+------+----------+
2 rows in set (0.00 sec)

mysql>

 

2.13 用limit限制查询结果的数量(俩中方式)

 查询数据时,可能会查出很多的记录,而用户需要的记录可能只是很少一部分,这就需要来限制查询结果的数量。

1.不指定初始位置
查询examplee表的所有记录,但只显示前俩条;

mysql> select * from examplee limit 2;
+------+------+------+------+------+----------+
| num  | d_id | name | age  | sex  | homeaddr |
+------+------+------+------+------+----------+
|    1 | 1001 | aa   |   24 | w    | abc      |
|    3 | 1003 | cxsa |   25 | w    | abc      |
+------+------+------+------+------+----------+
2 rows in set (0.00 sec)

mysql>


2.指定初始位置:
limit  关键字可以指定从哪条记录开始显示,并且可以指定显示多少条记录;
  格式:limit  初始位置,记录数




mysql> select * from examplee limit 1,2;
+------+------+------+------+------+----------+
| num  | d_id | name | age  | sex  | homeaddr |
+------+------+------+------+------+----------+
|    3 | 1003 | cxsa |   25 | w    | abc      |
|    2 | 1001 | cxsa |   21 | m    | abc      |
+------+------+------+------+------+----------+
2 rows in set (0.00 sec)

mysql>

  

posted @ 2017-12-06 20:45  葫芦七娃  阅读(651)  评论(0编辑  收藏  举报