一、查询基础
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 先出现的列它的优先级最高,以此类推,中间用逗号隔开,这条语句的意思是:先按编号升序排序,如果编号相同再按成绩降序排序。