数据查询(上)

一、查询基础

1.查询和提取数据的过程

   客户端与服务器交互:应用程序与数据库管理系统往往并不在同一台机器上,如:手机上查询火车票的软件,这个软件并没有火车票的信息,而这个信息是存储在远程数据库当中(如:中国铁路集团的数据库),而不是存储在手机上的,但是我们可以通过手机去查询这个数据库,那么这个查询的过程就是客户端应用程序与服务器的一个交互过程。

      客户端应用程序               --------------发送查询请求----------->                SQL SERVER

                                              <------------查询结果集(简称结果集)----------

      

A B C D E F
           
           
           

     这个查询结果集的形状和表的形状是完全一样的,也是有行有列的一张二维表的形式,并且查询结果集当中所有列的长度是一样的。

2.SELECT语句简介

(1)语法:

         SELECT COL1,COL2,COL3,...COLn FROM 表名

        ① [WHERE CONDITIONS] // 查询条件(如果查询的是所有行的数据可以不用写该语句)

        ②[GROUP BY GROUP_BY_LIST] // 分组(将查询结果分组,并进行分组统计)

        ③[HAVING CONDITIONS] //查询条件(这条语句将统计结果作为条件)

        ④[ORDER BY ORDER_LIST [ASC|DESC]] // 排序(对查询结果进行排序,默认是ASC,升序排序)

二、简单查询

1.查询表的全部行和列

(1)概念:把数据表当中的所有数据全部都查询出来。

         示例:查询玩家表中全部的行和列

         select user_qq,user_name,user_sex,user_birthday,user_phone from users;   如果查询表的列的字段很多,我们可以用*来代替,即:select * from users;

2.查询表的部分列

(1)语法:只需要在select关键字后面写上要查询的列即可。

         示例:从玩家表中查询玩家QQ和玩家昵称

         select user_qq,user_name from users;

3.别名的使用

     当我们写了一条查询语句并且去执行这条查询语句的时候,产生的结果集当中每一列的名称都是真实的数据表当中列的名称。我们有的时候希望这个列的名称能够以另外的一种方式进行显示,我们就可以使用别名来满足这种需求。(这个时候数据表列的名称没有改变,只不过显示的时候用别名显示,此外可以省略AS关键字不写,同样可以实现此功能)

(1)示例:从玩家表中查询玩家QQ和昵称,并显示为“玩家QQ”和“玩家昵称”

         select user_qq as '玩家QQ',user_name as '玩家昵称' from users;也可以这样写:

         select user_qq '玩家QQ',user_name '玩家昵称' from users;

4.DISTINCT关键字

(1)作用:从查询结果集当中消除重复行。

         示例:查询参与了游戏的玩家QQ,要求参与了多个游戏的玩家不重复显示QQ号。

         select distinct user_qq from scores;

5.LIMIT关键字

(1)作用:指定结果集中数据的显示范围

          示例:显示玩家表中第3至第5条数据

          select * from users limit 2,3;(limit后面的第一个参数是起始位置,第二个参数是要显示的行数,如果不指定起始位置,默认从0行开始显示)

三、条件查询

1.普通条件查询

    前面的查询都是把所有的数据全部都查询出来,而条件查询只查询符合条件的数据,而不符合条件的数据就不会显示到结果集中。

(1)语法:SELECT COL_LIST FROM 表名 [WHERE CONDITION_EXPRESSION];

         示例:查询QQ号为12301的玩家信息

         select * from users where user_qq = '12301';

(2)比较运算符

含义

符号

等于

=

不等于

<>

大于

>

大于等于 >=
小于 <
小于等于 <=

     示例:查询分数大于2500分的数据 

      select * from scores where score > 2500;

(3)逻辑运算符

       

含义 符号
并且 AND
或者 OR

NOT

     示例:查询游戏编号为1且分数大于4000分的分数信息

       select * from scores where game_uid = 1 and score > 4000;

2.模糊查询

(1)用BETWEEN AND 关键字来查询特定范围内的信息

       示例1:查询分数在2500(含)到3000(含)的分数信息

       select * from scores where score between 2500 and 3000;

      示例2:查询分数不在2500(含)到3000(含)的分数信息

       select * from scores where score not between 2500 and 3000;

     示例3:查询1987年1月1日到1992年1月1日出生的玩家

      select * from users where user_birthday between '1987-01-01' and '1992-01-01';

(2)SQL模式

        通配符:是一种万能符号,它可以表示某一范围内的任一数据,通过使用通配符可以设定某种格式的查询条件。 SQL的模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零个字符)。在 MySQL中,SQL的模式缺省是忽略大小写的。下面显示一些例子。注意在你使用SQL模式时,你不能使用=或!=;而使用LIKE或NOT LIKE比较操作符。

    ① %:表示任意个或多个字符。可匹配任意类型和长度的字符

      示例1:查询所有姓孙的玩家信息

        select * from users where user_name like '孙%';

      示例2:查询所有非姓孙的玩家信息

       select * from users where user_name not like '孙%';

     示例3:查询玩家昵称中含有a的玩家信息

      select * from users where user_name like '%a%';

     示例4:查询玩家昵称中不含a的玩家信息

      select * from users where user_name not like '%a%';

   ② _:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句(_可以代表一个中文字符)

     示例5:查询玩家昵称长度为4并且第二个字符是w,第四个字符是r的玩家信息

      select * from users where user_name like '_w_r';

    示例6:只找出“唐三藏”这样u_name为三个字且中间一个字是“三”的;

      SELECT * FROM [user] WHERE u_name LIKE ‘_三_’;

(3)正则模式

      由MySQL提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。

    ①扩展正则表达式的一些字符是:

        “.”匹配任何单个的字符。(单字节字符),一个字符类“[…]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的一个范围,使用一个“-”。“[a-z]”匹配任何小写字母,而“[0-9]”匹配任何数字。“ * ”匹配零个或多个在它前面的东西。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。正则表达式是区分大小写的,但是如果你希望,你能使用一个字符类匹配两种写法。例如,“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。如果它出现在被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。

     i. 字符 ‘^' 查询以特定字符或字符串开头的记录

       select * from user where email regexp '^a';

     ii. 字符 '$' 查询以特定字符或字符串结尾的记录

        select * from user where email regexp '0$';

     iii. 用符号“.”来代替字符串中的任意一个字符(测试时与结果不符,测试环境:MySQL)

        select * from user where email regexp 'a.c'; // 查询邮箱 a、c 之间有一个字符的记录,'.' 相当于是一个占位符。如果写成 REGEXP ‘a..c' , 即a、c之间有两个点,则表示邮箱中 a、c 之间要有两个字符。

     iv. 使用“*”匹配多个字符

         select * from user where email regexp 'm*'; // 查询所有邮箱中有 m 的记录。

    v. 用字符“+”表示紧跟的字符

       select * from user where email regexp '^am+'; // 查询邮箱字母 a开头, a后面紧跟字母 m 的记录。其中'+' 表示紧跟字符。

    vi. “|” 分隔条件匹配指定字符串

      select * from user where email regexp 'qq.com|163.com'; // 正则表达式可以匹配指定的字符串,字符串之间使用 “|” 分隔。

   vii. “[]” 表示集合匹配指定字符串中的任意一个

      select * from user where email regexp '[az]';// ”[]“ 指定一个集合,以上表示查询邮箱中带有 a或z或两者都有的邮箱。也可以用来匹配数字集合,比如 [0-9] 表示集合区间所有数字,[a-z] 表示集合区间所有字母。

   viii. “[^]”匹配指定字符以外的字符(测试时与结果不符,测试环境:MySQL)

   select * from user where email regexp '[^a-d1-3]'; // 如上匹配邮箱中不包含 a、b、c、d 且 不包含 1、2、3 的记录。

  viiii. 使用{n,} 或 {n,m} 来指定字符串连接出现的次数(测试时与结果不符,测试环境:MySQL)

   select * from user where email regexp 'b{2}'; // 表示字母 b 至少出现 2 次。

   select * from user where email regexp 'ba{1,3}'; // 表示字符串 ba 至少出现1次,至多出现3次。

(3)查询空值的运算符

      如果说某一个字段上它的值为空,我们想要查询这样的数据,我们可以这样做:

   示例1:查询生日为空的玩家信息

      select * from users where user_birthday is null; (这里说明一下:想要查询空值不能使用=、LIKE,只能使用IS这个关键字来查询)

  示例2:查询生日不为空的玩家信息

    select * from users where user_birthday is not null;

四、对查询结果排序

1.对指定列进行排序

(1)概念:所谓的对指定列进行排序指的是单列排序。

(2)单列排序要素:①排序依据(如:成绩,身高)②排序方式(如:升序、降序)

(3)语法:SELECT COL_LIST FROM 表名 ORDER BY ORDER_BY_LIST [ASC][DESC]; // 说明:ASC是排序的默认方式,如果是升序排序,可以省略不写。

(4)示例:查询分数表中游戏编号为1的所有分数信息,并按照分数升序(降序)排序。

         select * from scores where game_uid = 1 order by score asc/desc;

2.多列排序

(1)多列排序要点:①排序依据;②排序方式;③优先级(多个列参与排序,要优先考虑某个列的排列级别)

名次 国家/地区 金牌数 银牌数 铜牌数
1 中国 51 21 29
2 美国 36 38 36
3 俄罗斯

23

21 28
4 英国 19 13 15
5 德国 16 10 15

示例1:查询分数表所有信息,并按照游戏编号的升序和分数降序排序。

           select * from scores order by game_uid asc, score desc;// 说明:ORDER BY 先出现的列它的优先级最高,以此类推,中间用逗号隔开,这条语句的意思是:先按编号升序排序,如果编号相同再按成绩降序排序。

猜你喜欢

转载自blog.csdn.net/weixin_42051619/article/details/83721392