本次讲到where字句中经常用到的集中较为复杂的搜索条件,包括组合的查询条件、IN运算符、NOT运算符、LIKE运算符和相关通配符。

  学习本节需要用到一下两张表:

  1. CREATE TABLE TEACHER
  2. (
  3. TNO INT NOT NULL, --教工号
  4. TNAME CHAR() NOT NULL, --教师姓名
  5. CNO INT NOT NULL, --课程号
  6. SAL INT, --工资
  7. DNAME CHAR() NOT NULL, --所在系
  8. TSEX CHAR() NOT NULL, --性别
  9. AGE INT NOT NULL --年龄
  10. )
  11. alter table TEACHER alter column SAL INT null
  12. INSERT INTO
  13. dbo.TEACHER
  14. ( TNO, TNAME, CNO, SAL, DNAME, TSEX, AGE )
  15. VALUES ( , -- TNO - int
  16. '', -- TNAME - char()
  17. , -- CNO - int
  18. , -- SAL - int
  19. '', -- DNAME - char()
  20. '', -- TSEX - char()
  21. -- AGE - int
  22. )
  23. SELECT * FROM dbo.TEACHER
  24. INSERT INTO dbo.TEACHER VALUES( ,'王永军',,,'计算机','女',)
  25. INSERT INTO dbo.TEACHER VALUES( ,'刘晓婧',,,'计算机','女',)
  26. INSERT INTO dbo.TEACHER VALUES( ,'高维',,,'电子工程','男',)
  27. INSERT INTO dbo.TEACHER VALUES( ,'李伟',,,'机械工程','女',)
  28. INSERT INTO dbo.TEACHER VALUES( ,'刘辉',,,'生物','女',)
  29. INSERT INTO dbo.TEACHER VALUES( ,'刘伟',,,'计算机','男',)
  30. INSERT INTO dbo.TEACHER VALUES( ,'刘静',,,'经济管理','男',)
  31. INSERT INTO dbo.TEACHER VALUES( ,'刘奕锴',,,'计算机','女',)
  32. INSERT INTO dbo.TEACHER VALUES( ,'高维',,,'经济管理','男',)
  33.  
  34. CREATE TABLE COURSE
  35. (
  36. CNO INT NOT NULL, --课程号
  37. CNAME CHAR() NOT NULL, --课程名称
  38. CTIME INT NOT NULL, --学时
  39. SCOUNT INT NOT NULL, --容纳人数
  40. CTEST SMALLDATETIME NOT NULL, --考试时间
  41. )
  42. SELECT * FROM dbo.COURSE
  43. INSERT INTO dbo.COURSE VALUES( ,'应用数学基础',,,'2006-7-10')
  44. INSERT INTO dbo.COURSE VALUES( ,'生物工程概论',,,'2006-7-8')
  45. INSERT INTO dbo.COURSE VALUES( ,'计算机软件基础',,,'2006-7-8')
  46. INSERT INTO dbo.COURSE VALUES( ,'计算机软件基础',,,'2006-6-28')
  47. INSERT INTO dbo.COURSE VALUES( ,'模拟电路设计',,,'2006-7-10')
  48. INSERT INTO dbo.COURSE VALUES( ,'机械设计实践',,,'2006-7-14')
  49. INSERT INTO dbo.COURSE VALUES( ,'生物化学',,,'2006-7-2')
  50. INSERT INTO dbo.COURSE VALUES( ,'数据库设计',,,'2006-7-1')
  51. INSERT INTO dbo.COURSE VALUES( ,'设计理论',,,'2006-6-30')
  52. INSERT INTO dbo.COURSE VALUES( ,'计算机入门',,,'2006-6-29')
  53. INSERT INTO dbo.COURSE VALUES( ,'数字电路设计基础',,,'2006-6-20')
  54. DROP TABLE dbo.COURSE

数据表

  

  以下是各复杂条件的查询:

  1. ------组合查询条件
  2. --、and运算符 查询年龄大于30的女老师
  3. SELECT * FROM dbo.TEACHER WHERE AGE> AND TSEX='女'
  4.  
  5. --、多个and运算符 查询年龄大于30的计算机系女老师
  6. SELECT * FROM dbo.TEACHER WHERE AGE> AND TSEX='女' AND DNAME='计算机'
  7.  
  8. --、or运算符 查询计算机系和生物系女老师的姓名和工资
  9. SELECT TNAME,SAL,DNAME FROM dbo.TEACHER WHERE DNAME='计算机' OR DNAME='生物'
  10.  
  11. --、or and运算符混合使用 查询计算机系和生物系老师的姓名和工资
  12. SELECT TNAME,SAL,DNAME FROM dbo.TEACHER WHERE DNAME='计算机' OR DNAME='生物' AND TSEX='女' ORDER BY SAL
  13. SELECT TNAME,SAL,DNAME FROM dbo.TEACHER WHERE (DNAME='计算机' OR DNAME='生物') AND TSEX='女' ORDER BY SAL
  14. --AND OR 一起使用的时候,要注意运算符的优先级。AND要高于OR,所以第一条线执行AND,加上括号后才是正确的结果
  15. --、INNOT IN运算符使用 查询计算机系和生物系的所有信息
  16. SELECT * FROM dbo.TEACHER WHERE DNAME IN('计算机','生物')
  17. SELECT * FROM dbo.TEACHER WHERE DNAME NOT IN('计算机','生物')
  18. --使用IN有以下优点
  19. --、当选择条件很多时,采用IN运算符就显得很便捷,只需要在括号内用逗号间隔依次罗列即可,运行效率比OR运算符要高
  20. --2、使用IN运算符,其后面所列的条件可以使另一条SELECT语句,即子查询,如下:
  21. SELECT * FROM dbo.TEACHER WHERE DNAME IN(SELECT DNAME FROM dbo.TEACHER WHERE AGE>)
  22.  
  23. --、NOT BETWEEN运算符混合使用 查询年龄不在40~50岁的教师姓名,年龄,系,性别
  24. SELECT TNAME,AGE,DNAME,TSEX FROM dbo.TEACHER WHERE AGE NOT BETWEEN AND ORDER BY AGE
  25. --我们在用OR来得到相同的数据,相比之下,似乎OR更简洁,注意,MySQL不支持NOT运算符
  26. SELECT TNAME,AGE,DNAME,TSEX FROM dbo.TEACHER WHERE AGE< OR age> ORDER BY AGE
  27.  
  28. --、使用LIKE运算符查询
  29. SELECT * FROM dbo.TEACHER WHERE DNAME LIKE '计算机'
  30. --%通配符,表示任意字符匹配不计较字符的多少,可以在''中间任意位置使用,以XX开头或结尾或中间
  31. SELECT * FROM dbo.COURSE WHERE CNAME LIKE '%电路%' --中间有"电路"
  32. SELECT * FROM dbo.COURSE WHERE CNAME LIKE '%基础' --以“基础”结尾的
  33. SELECT * FROM dbo.COURSE WHERE CNAME LIKE '计算机%' --以“计算机”开头的
  34. SELECT * FROM dbo.COURSE WHERE CNAME LIKE '计算机%基础'
  35.  
  36. --_通配符,表示任意一个字符匹配,可以在''中间任意位置使用,以XX开头或结尾或中间
  37. -- _代表一个字符,__代表两个字符
  38. SELECT * FROM dbo.COURSE WHERE CNAME LIKE '__电路__' --中间带有“电路”的
  39. SELECT * FROM dbo.COURSE WHERE CNAME LIKE '____基础' --以“基础”结尾,且前面是四个字的
  40. SELECT * FROM dbo.COURSE WHERE CNAME LIKE '计算机__' --以“计算机”开头,两个字结尾的
  41. SELECT * FROM dbo.COURSE WHERE CNAME LIKE '计算机__基础' --中间两个字的
  42. SELECT * FROM dbo.COURSE WHERE CNAME LIKE '____' --查询四个字的系
  43.  
  44. --"[]"通配符用于指定一系列的字符,只要满足这些字符其中之一且位置出现在"[]"通配符的位置,字符串就满足查询条件
  45. SELECT * FROM dbo.COURSE WHERE CNAME LIKE '[模]%' --以“模“开头的
  46. SELECT * FROM dbo.COURSE WHERE CNAME LIKE '[^模]%' --加上"^"表示不以"模拟"开头的
  47.  
  48. ------以上三种通配符是可以自由组合使用的
      ------以上所有的运算符和条件查询都是可以组合使用的,根据实际情况选择适合的查询方法才是明智的选择

  

  我们再讲一个ESCAPE定义转义符:

    在使用LIKE关键字进行模糊查询的时候,“%”,“_”,“[]”,单独出现则会被认为是通配符。为了在字符数据类型的列中查询是否存在百分号(%),下划线(_),方括号([])字符,我们就需要一种方法告诉DBMS,将LIKE表达式中的这些字符看作实际值,而不是通配符。关键字ESCAPE允许确定一个转义字符,告诉DBMS,紧跟ESCAPE之后的字符是实际值。

  1. --增加两条数据
  2. INSERT INTO dbo.COURSE VALUES( ,'数字电路设计基础%',,,'2006-6-20')
  3. INSERT INTO dbo.COURSE VALUES( ,'_设计理论',,,'2006-6-30')
  4.  
  5. ----以下是将"M"后面的"%"作为实际值,也就是说查询的是以"%"结尾的数据
  6. SELECT * FROM dbo.COURSE WHERE CNAME LIKE '%M%' ESCAPE 'M'
  7.  
  8. ----以下是将"M"后面的"_"作为实际值,也就是说查询的是以"_"开头的数据
  9. SELECT * FROM dbo.COURSE WHERE CNAME LIKE 'M_%' ESCAPE 'M'

    

Sql Server的艺术(二) SQL复杂条件搜索的更多相关文章

  1. SQL Server优化技巧——如何避免查询条件OR引起的性能问题

    原文:SQL Server优化技巧--如何避免查询条件OR引起的性能问题 之前写过一篇博客"SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析",里面介绍了OR可能会引起 ...

  2. SQL Server中常用的SQL语句(转):

    SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主 ...

  3. 【SQL Server 学习系列】-- sql 随机生成中文名字

    原文:[SQL Server 学习系列]-- sql 随机生成中文名字 ,) )) -- 姓氏 ,) )) -- 名字 INSERT @fName VALUES ('赵'),('钱'),('孙'),( ...

  4. SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager

    SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager http://www.systoolsgroup.co ...

  5. 如何转换SQL Server 2008数据库到SQL Server 2005

        背景介绍: 公司一套系统使用的是SQL SERVER 2008数据库,突然一天收到邮件,需要将这套系统部署到各个不同地方(海外)的工厂,需要在各个工厂部署该数据库,等我将准备工作做好,整理文档 ...

  6. [转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine)

    [转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine) http://blogs.technet. ...

  7. 使用CASE表达式替代SQL Server中的动态SQL

    原文:使用CASE表达式替代SQL Server中的动态SQL 翻译自: http://www.mssqltips.com/sqlservertip/1455/using-the-case-expre ...

  8. 引用:初探Sql Server 执行计划及Sql查询优化

    原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想 ...

  9. SQL Server 复制 - 发布订阅(SQL Server 数据同步)

    原文:SQL Server 复制 - 发布订阅(SQL Server 数据同步) SQL Server的同步是通过SQL Server自带的复制工具来实现的,分发布和订阅2大步. A,复制-发布 发布 ...

  10. sql server 查询log日志 sql语句

    xp_readerrorlog 一共有7个参数: 1. 存档编号 2. 日志类型(1为SQL Server日志,2为SQL Agent日志) 3. 查询包含的字符串 4. 查询包含的字符串 5. Lo ...

随机推荐

  1. 微信小程序--合法域名校验出错

    第一次做小demo的时候遇到一个问题,合法域名校验出错: 第一步:登陆微信公众号平台--个人中心--设置--开发设置--服务器域名(一个月只有5次修改机会一定要珍惜) 第二步 打开微信开发者工具,有个 ...

  2. 使用JSON JavaScriptSerializer进行反序列化和序列化时报错,字符的长度超出了MaxJsonLength的长度

    文章参考:https://www.cnblogs.com/wangfuyou/p/6046307.html 1.解决办法是在web.config增加如下节点到<configuration> ...

  3. burpsuite截断上传webshell

    1.先设置好代理127.0.0.1 8080 2.开启截断模式 3.上传文件会被burp截断 4.在hex下找到你上传的webshell的16进制编码 5.把.后面的源码改为00 点击forward上 ...

  4. CSS基础之盒子模型及浮动布局

    盒模型 谈到盒模型,有经验的小伙伴一定滚瓜烂熟,无非就是 内容(content).填充(padding).边框(border).边界(margin): 这些属性我们可以把它转移到我们日常生活中的盒子( ...

  5. string::npos的一些说明

    一.定义 std:: string ::npos的定义: static const size_t npos = -1; 表示 size_t 的最大值( Maximum value for size_t ...

  6. c语言基础学习09_关于复合类型的复习

    =============================================================================struct A{ char array[10 ...

  7. UEP-级联下拉

    级联查询在UEP中采用动态下拉的形式,cascadeid为关键字,注意jsp页面的id的相互嵌套关系, 数据库字段的数值的设置,和动态下拉SQL语句的书写. <td align="ce ...

  8. Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)

    一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法 ...

  9. LockSupport理解

    一.背景 在看并发包源码的时候看见过LockSupport,今天恰巧看到LockSupport字眼,于是看下jdk1.7中的源码结构.想着它应该是运用多线程的锁工具的,到底似乎怎么实现的呢? 二.使用 ...

  10. 最小生成数之Kruskal算法

    描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了--但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个数量并没有特别的大. 所以问题变成 ...