呼市网站建设,手机排行榜中关村,wordpress本地化,网站一年多少钱前面一章介绍了基础的一个条件的查询#xff0c;如果多条件#xff0c;涉及到逻辑运算#xff0c;and or 之类的。就是高级一点的条件查询。本章来介绍复杂的条件搜索表达式。 AND运算符
AND运算符只有当两边操作数均为True时#xff0c;最后结果才为True。人们使用AND描述…前面一章介绍了基础的一个条件的查询如果多条件涉及到逻辑运算and or 之类的。就是高级一点的条件查询。本章来介绍复杂的条件搜索表达式。 AND运算符
AND运算符只有当两边操作数均为True时最后结果才为True。人们使用AND描述“与”而且的关系即当满足第一个条件而且还要满足第二个条件时才会通过审核。看下面的几个例题子。
组合两个条件这两个条件是“而且”的关系使用AND运算符连接。
student表中查询1997年出生的所有女生并将结果按出生日期升序排序。运行环境为MySQL。
SELECT *
FROM student
WHERE birthday1997/01/01
AND birthday1998/01/01
AND sex女
ORDER BY birthdayOR运算符
OR运算符只有当两边操作数均为False时最后结果才为False只要一边是True则最后结果为True。根据OR的这种运算规则人们使用OR描述“或”或者的关系即当满足任何一个条件就可以通过审核。
从student表中查询中文系的所有学生和外语系的所有学生并将结果按学号升序排序。
分析两个条件的关系其实是“或”因为满足任何一个条件就可以通过审核。
SELECT * FROM student
WHERE institute中文系 OR institute外语系
ORDER BY ID; AND和OR混合
WHERE子句中可以包含任意数量的AND和OR运算符并且允许两者结合使用。下面的例题组合了AND和OR两个运算符解决了一个查询任务。
从student表中查询中文系和外语系的所有女生。
分析前面已经介绍了查询中文系和外语系的学生需要使用OR运算符又因为要查询这两个系的女生所以还得需要AND运算符。编写如下SELECT语句。
SELECT *
FROM student
WHERE institute中文系
OR institute外语系
AND sex女
ORDER BY ID;这样会进去了一个男生。因为优先执行了AND然后才是OR。所以要改为下面的
SELECT *
FROM student
WHERE (institute中文系 OR institute外语系)
AND sex女
ORDER BY ID;才是对的。 IN运算符
从course表中查询学分为2、3、4的课程的信息并按学分降序课号升序排序。
SELECT * FROM course
WHERE credit IN (2,3,4)
ORDER BY credit DESC, ID; 从student表中查询中文系、外语系和计科系的所有学生并按院系降序排列。
SELECT * FROM student
WHERE institute IN (中文系,外语系,计科系)
ORDER BY CONVERT(institute USING GBK) DESC; 反in运算 NOT IN。
从student表中查询除中文系、外语系和计算机系以外的其它系的学生并按院系降序排列。
SELECT * FROM student
WHERE institute NOT IN (中文系,外语系,计科系)
ORDER BY CONVERT(institute USING GBK) DESC; IN运算符最大优点是其后条件列表集合中可以放置其它SELECT语句即子查询。下面通过一个例子演示这些优点。从score表中查询所有学生的“心理学”的考试成绩和平时成绩并按考试成绩降序排列当考试成绩相同时按平时成绩降序排列。 分析因为Score表中没有课名只有课号因此必须从Course表中找到“心理学”的课号然后根据这一课号从Score表中查询考试成绩和平时成绩。 SELECT s_id AS 学号, result1 AS 考试成绩, result2 AS 平时成绩 FROM score
WHERE c_id IN (SELECT ID FROM course WHERE course心理学)
ORDER BY result1 DESC, result2 DESC; in 后面的子句代表筛选出心理学这个课程的ID。相当于是嵌套语句。 NOT运算符 NOT运算符的作用是对其后的表达式求反。
下面介绍NOT运算符的使用方法。从student表中查询来源地不是北京和广东的所有学生。
SELECT * FROM student
WHERE NOT (origin北京市 OR origin广东省); 从student表中查询出生日期不在19971998之间包含1997和1998的所有学生。
SELECT * FROM student
WHERE birthday NOT BETWEEN 1997/01/01 AND 1998/12/31模糊查询
类似于正则表达式比如只知道学生名字里面含有‘三’要去查询。此时要用上通配符。
结合使用LIKE运算符和通配符可以对表进行模糊查询即仅仅使用查询内容的一部分查询数据库中存储的数据。当然LIKE运算符也可以单独使用单独使用时其功能与等于运算符相同。不过需要注意的是LIKE运算符只支持字符型数据。
从student表中查询中文系所有学生的信息并按学号升序排序。
SELECT * FROM student
WHERE institute LIKE 中文系
ORDER BY ID;LIKE改成号也一样的效果。
但是后面用上通配符就不一样了。 通配符“%”
在SQL语言中使用百分号%通配符代表0个或多个字符。下面的表7.1中列出了几个典型的例子供读者参考。 百分号%通配符举例 说明 匹配字符串举例 a% 代表头字母为“a”的所有字符串 “a”、“abc”、“amer mend uu?”等 %NBA% 代表含有“NBA”的所有字符串 “NBA 篮球明星”、“进入NBA的姚明”、“巴特尔与NBA”等 %nm 代表最后两个字母为“nm”的所有字符串 “nm”、“123nm” A%Z 代表头字母为“A”最后一个字母为“Z”的所有字符串 “AZ”、“ABCDZ”、“A1212DFAFZ”等 %1983% 代表含有1983的字符串或者日期时间型数据 “生于1983年”、03/20/1983 示例演示
首先插入两条数据方面演示
INSERT INTO student(ID,name,sex,birthday)
VALUES(0011,周三丰,男,1999/12/20),(0012,三宝,男,1998/05/15);从student表中查询所有姓名中包含“三”字的学生信息。
SELECT * FROM student WHERE name LIKE %三%; 如果将“%三%”中的第一个“%”去掉则查询结果会是什么呢
SELECT * FROM student WHERE name LIKE 三%; 如果将“%三%”中的最后一个“%”去掉则查询结果会是什么呢
SELECT * FROM student WHERE name LIKE %三; 使用“%”通配符查询日期型数据
使用“%”通配符查询日期时间型数据会很方便例如查询1983年出生的所有学生查询9月份出生的所有学生等。下面通过几个例题介绍查询日期时间型数据的具体方法。
从student表中查询出生于1998年的所有学生。
SELECT * FROM student WHERE birthday LIKE %1998%; 从student表中查询出生于9月份的所有学生。
SELECT * FROM student WHERE birthday LIKE %-09-%; 在MySQL环境下从student表中查询1997年9月份出生的所有学生。
SELECT * FROM student WHERE birthday LIKE 1997%09%; “_”通配符
%”通配符可以代表0个或多个字符但是它不能代表指定个数的字符。
例如需要查询姓“周”且名字由两个字组成的所有学生。如果使用“%”则只能查询所有姓“周”的学生而并不能确定名字只有两个字。而‘周_’就表示只有两个字
SELECT * FROM student WHERE name LIKE 周_; 如果是两个__那么就会查询出张三丰。
从student表中查询名字最多由两个字组成的所有学生。
SELECT * FROM student WHERE name LIKE __; 注意LIKE后有两个“_”通配符。 注意 “_”通配符也可以不与字符组合而单独使用 正则表达式
在WHERE子句的条件中还可以使用正则表达式不同数据库环境中使用正则表达式的方式不同
在SQL环境下可以直接用中插号“[]”括起来放在LIKE后面的条件表达式中即可。而MySQL则需要使用关键字REGEXP、Oracle则需要使用REGEXP_LIKE正则表达式函数实现 举例 说明 [NR]% 代表以 “N”或“R” 字母开头的所有字符串 [a-d]%ing 代表以“a”、“b”、“c”、“d”字母开头以“ing”结尾的所有字符串 [c-emn]% 代表以“c”、“d”、“e”、“m”和“n”字母开头的所有字符串 N[^B]% 代表以 “N”字母开头并且第二个字母不是“B”的所有字符串 %197[5-9]% 代表19751979 等五个数字 [1][012]% 代表10、11、12等三个数字
例如从student表中查询姓张、李或周的所有学生并按姓名升序排序。
在MySQL环境中执行以下语句
SELECT * FROM student
WHERE name REGEXP ^[张李周]
ORDER BY CONVERT(name USING GBK); 从student表中查询名字里面不含有三六七的所有学生并按姓名降序排序。
在MySQL环境中执行以下语句
SELECT * FROM student
WHERE name NOT REGEXP [三七六]
ORDER BY CONVERT(name USING GBK) DESC; 转义字符‘\’
如果运行环境为MySQL或Oracle时则使用反斜杠\作为转义字符。仍旧要查询最后两个字符为百分之五5%的所有字符串在Oracle中编写其LIKE语句为
LIKE %5\%
此时需要注意反斜杠作为转义字符时应当先将其激活。激活的方法为在SQL Plus中使用如下命令。
set escape \ ;
定义了转义字符后再看一个例子例如要查询所有包含“SQBT_999”的字符串则其LIKE语句为
LIKE %SQBT\_999%