Sql Server的艺术(二) SQL复杂条件搜索
本次讲到where字句中经常用到的集中较为复杂的搜索条件,包括组合的查询条件、IN运算符、NOT运算符、LIKE运算符和相关通配符。
学习本节需要用到一下两张表:
- CREATE TABLE TEACHER
- (
- TNO INT NOT NULL, --教工号
- TNAME CHAR() NOT NULL, --教师姓名
- CNO INT NOT NULL, --课程号
- SAL INT, --工资
- DNAME CHAR() NOT NULL, --所在系
- TSEX CHAR() NOT NULL, --性别
- AGE INT NOT NULL --年龄
- )
- alter table TEACHER alter column SAL INT null
- INSERT INTO
- dbo.TEACHER
- ( TNO, TNAME, CNO, SAL, DNAME, TSEX, AGE )
- VALUES ( , -- TNO - int
- '', -- TNAME - char()
- , -- CNO - int
- , -- SAL - int
- '', -- DNAME - char()
- '', -- TSEX - char()
- -- AGE - int
- )
- SELECT * FROM dbo.TEACHER
- INSERT INTO dbo.TEACHER VALUES( ,'王永军',,,'计算机','女',)
- INSERT INTO dbo.TEACHER VALUES( ,'刘晓婧',,,'计算机','女',)
- INSERT INTO dbo.TEACHER VALUES( ,'高维',,,'电子工程','男',)
- INSERT INTO dbo.TEACHER VALUES( ,'李伟',,,'机械工程','女',)
- INSERT INTO dbo.TEACHER VALUES( ,'刘辉',,,'生物','女',)
- INSERT INTO dbo.TEACHER VALUES( ,'刘伟',,,'计算机','男',)
- INSERT INTO dbo.TEACHER VALUES( ,'刘静',,,'经济管理','男',)
- INSERT INTO dbo.TEACHER VALUES( ,'刘奕锴',,,'计算机','女',)
- INSERT INTO dbo.TEACHER VALUES( ,'高维',,,'经济管理','男',)
- CREATE TABLE COURSE
- (
- CNO INT NOT NULL, --课程号
- CNAME CHAR() NOT NULL, --课程名称
- CTIME INT NOT NULL, --学时
- SCOUNT INT NOT NULL, --容纳人数
- CTEST SMALLDATETIME NOT NULL, --考试时间
- )
- SELECT * FROM dbo.COURSE
- INSERT INTO dbo.COURSE VALUES( ,'应用数学基础',,,'2006-7-10')
- INSERT INTO dbo.COURSE VALUES( ,'生物工程概论',,,'2006-7-8')
- INSERT INTO dbo.COURSE VALUES( ,'计算机软件基础',,,'2006-7-8')
- INSERT INTO dbo.COURSE VALUES( ,'计算机软件基础',,,'2006-6-28')
- INSERT INTO dbo.COURSE VALUES( ,'模拟电路设计',,,'2006-7-10')
- INSERT INTO dbo.COURSE VALUES( ,'机械设计实践',,,'2006-7-14')
- INSERT INTO dbo.COURSE VALUES( ,'生物化学',,,'2006-7-2')
- INSERT INTO dbo.COURSE VALUES( ,'数据库设计',,,'2006-7-1')
- INSERT INTO dbo.COURSE VALUES( ,'设计理论',,,'2006-6-30')
- INSERT INTO dbo.COURSE VALUES( ,'计算机入门',,,'2006-6-29')
- INSERT INTO dbo.COURSE VALUES( ,'数字电路设计基础',,,'2006-6-20')
- DROP TABLE dbo.COURSE
数据表
以下是各复杂条件的查询:
- ------组合查询条件
- --、and运算符 查询年龄大于30的女老师
- SELECT * FROM dbo.TEACHER WHERE AGE> AND TSEX='女'
- --、多个and运算符 查询年龄大于30的计算机系女老师
- SELECT * FROM dbo.TEACHER WHERE AGE> AND TSEX='女' AND DNAME='计算机'
- --、or运算符 查询计算机系和生物系女老师的姓名和工资
- SELECT TNAME,SAL,DNAME FROM dbo.TEACHER WHERE DNAME='计算机' OR DNAME='生物'
- --、or and运算符混合使用 查询计算机系和生物系老师的姓名和工资
- SELECT TNAME,SAL,DNAME FROM dbo.TEACHER WHERE DNAME='计算机' OR DNAME='生物' AND TSEX='女' ORDER BY SAL
- SELECT TNAME,SAL,DNAME FROM dbo.TEACHER WHERE (DNAME='计算机' OR DNAME='生物') AND TSEX='女' ORDER BY SAL
- --AND OR 一起使用的时候,要注意运算符的优先级。AND要高于OR,所以第一条线执行AND,加上括号后才是正确的结果
- --、IN和NOT IN运算符使用 查询计算机系和生物系的所有信息
- SELECT * FROM dbo.TEACHER WHERE DNAME IN('计算机','生物')
- SELECT * FROM dbo.TEACHER WHERE DNAME NOT IN('计算机','生物')
- --使用IN有以下优点
- --、当选择条件很多时,采用IN运算符就显得很便捷,只需要在括号内用逗号间隔依次罗列即可,运行效率比OR运算符要高
- --2、使用IN运算符,其后面所列的条件可以使另一条SELECT语句,即子查询,如下:
- SELECT * FROM dbo.TEACHER WHERE DNAME IN(SELECT DNAME FROM dbo.TEACHER WHERE AGE>)
- --、NOT BETWEEN运算符混合使用 查询年龄不在40~50岁的教师姓名,年龄,系,性别
- SELECT TNAME,AGE,DNAME,TSEX FROM dbo.TEACHER WHERE AGE NOT BETWEEN AND ORDER BY AGE
- --我们在用OR来得到相同的数据,相比之下,似乎OR更简洁,注意,MySQL不支持NOT运算符
- SELECT TNAME,AGE,DNAME,TSEX FROM dbo.TEACHER WHERE AGE< OR age> ORDER BY AGE
- --、使用LIKE运算符查询
- SELECT * FROM dbo.TEACHER WHERE DNAME LIKE '计算机'
- --%通配符,表示任意字符匹配不计较字符的多少,可以在''中间任意位置使用,以XX开头或结尾或中间
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE '%电路%' --中间有"电路"的
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE '%基础' --以“基础”结尾的
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE '计算机%' --以“计算机”开头的
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE '计算机%基础'
- --_通配符,表示任意一个字符匹配,可以在''中间任意位置使用,以XX开头或结尾或中间
- -- _代表一个字符,__代表两个字符
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE '__电路__' --中间带有“电路”的
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE '____基础' --以“基础”结尾,且前面是四个字的
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE '计算机__' --以“计算机”开头,两个字结尾的
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE '计算机__基础' --中间两个字的
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE '____' --查询四个字的系
- --"[]"通配符用于指定一系列的字符,只要满足这些字符其中之一且位置出现在"[]"通配符的位置,字符串就满足查询条件
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE '[模]%' --以“模“开头的
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE '[^模]%' --加上"^"表示不以"模拟"开头的
- ------以上三种通配符是可以自由组合使用的
------以上所有的运算符和条件查询都是可以组合使用的,根据实际情况选择适合的查询方法才是明智的选择
我们再讲一个ESCAPE定义转义符:
在使用LIKE关键字进行模糊查询的时候,“%”,“_”,“[]”,单独出现则会被认为是通配符。为了在字符数据类型的列中查询是否存在百分号(%),下划线(_),方括号([])字符,我们就需要一种方法告诉DBMS,将LIKE表达式中的这些字符看作实际值,而不是通配符。关键字ESCAPE允许确定一个转义字符,告诉DBMS,紧跟ESCAPE之后的字符是实际值。
- --增加两条数据
- INSERT INTO dbo.COURSE VALUES( ,'数字电路设计基础%',,,'2006-6-20')
- INSERT INTO dbo.COURSE VALUES( ,'_设计理论',,,'2006-6-30')
- ----以下是将"M"后面的"%"作为实际值,也就是说查询的是以"%"结尾的数据
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE '%M%' ESCAPE 'M'
- ----以下是将"M"后面的"_"作为实际值,也就是说查询的是以"_"开头的数据
- SELECT * FROM dbo.COURSE WHERE CNAME LIKE 'M_%' ESCAPE 'M'
Sql Server的艺术(二) SQL复杂条件搜索的更多相关文章
- SQL Server优化技巧——如何避免查询条件OR引起的性能问题
原文:SQL Server优化技巧--如何避免查询条件OR引起的性能问题 之前写过一篇博客"SQL SERVER中关于OR会导致索引扫描或全表扫描的浅析",里面介绍了OR可能会引起 ...
- SQL Server中常用的SQL语句(转):
SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主 ...
- 【SQL Server 学习系列】-- sql 随机生成中文名字
原文:[SQL Server 学习系列]-- sql 随机生成中文名字 ,) )) -- 姓氏 ,) )) -- 名字 INSERT @fName VALUES ('赵'),('钱'),('孙'),( ...
- SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager
SQL Server恢复软件SysTools SQL Recovery/SysTools SQL Server Recovery Manager http://www.systoolsgroup.co ...
- 如何转换SQL Server 2008数据库到SQL Server 2005
背景介绍: 公司一套系统使用的是SQL SERVER 2008数据库,突然一天收到邮件,需要将这套系统部署到各个不同地方(海外)的工厂,需要在各个工厂部署该数据库,等我将准备工作做好,整理文档 ...
- [转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine)
[转]如何写出高效能TSQL -深入浅出SQL Server Relational Engine (含 SQL 2014 in-memory Engine) http://blogs.technet. ...
- 使用CASE表达式替代SQL Server中的动态SQL
原文:使用CASE表达式替代SQL Server中的动态SQL 翻译自: http://www.mssqltips.com/sqlservertip/1455/using-the-case-expre ...
- 引用:初探Sql Server 执行计划及Sql查询优化
原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想 ...
- SQL Server 复制 - 发布订阅(SQL Server 数据同步)
原文:SQL Server 复制 - 发布订阅(SQL Server 数据同步) SQL Server的同步是通过SQL Server自带的复制工具来实现的,分发布和订阅2大步. A,复制-发布 发布 ...
- sql server 查询log日志 sql语句
xp_readerrorlog 一共有7个参数: 1. 存档编号 2. 日志类型(1为SQL Server日志,2为SQL Agent日志) 3. 查询包含的字符串 4. 查询包含的字符串 5. Lo ...
随机推荐
- 微信小程序--合法域名校验出错
第一次做小demo的时候遇到一个问题,合法域名校验出错: 第一步:登陆微信公众号平台--个人中心--设置--开发设置--服务器域名(一个月只有5次修改机会一定要珍惜) 第二步 打开微信开发者工具,有个 ...
- 使用JSON JavaScriptSerializer进行反序列化和序列化时报错,字符的长度超出了MaxJsonLength的长度
文章参考:https://www.cnblogs.com/wangfuyou/p/6046307.html 1.解决办法是在web.config增加如下节点到<configuration> ...
- burpsuite截断上传webshell
1.先设置好代理127.0.0.1 8080 2.开启截断模式 3.上传文件会被burp截断 4.在hex下找到你上传的webshell的16进制编码 5.把.后面的源码改为00 点击forward上 ...
- CSS基础之盒子模型及浮动布局
盒模型 谈到盒模型,有经验的小伙伴一定滚瓜烂熟,无非就是 内容(content).填充(padding).边框(border).边界(margin): 这些属性我们可以把它转移到我们日常生活中的盒子( ...
- string::npos的一些说明
一.定义 std:: string ::npos的定义: static const size_t npos = -1; 表示 size_t 的最大值( Maximum value for size_t ...
- c语言基础学习09_关于复合类型的复习
=============================================================================struct A{ char array[10 ...
- UEP-级联下拉
级联查询在UEP中采用动态下拉的形式,cascadeid为关键字,注意jsp页面的id的相互嵌套关系, 数据库字段的数值的设置,和动态下拉SQL语句的书写. <td align="ce ...
- Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)
一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法 ...
- LockSupport理解
一.背景 在看并发包源码的时候看见过LockSupport,今天恰巧看到LockSupport字眼,于是看下jdk1.7中的源码结构.想着它应该是运用多线程的锁工具的,到底似乎怎么实现的呢? 二.使用 ...
- 最小生成数之Kruskal算法
描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了--但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个数量并没有特别的大. 所以问题变成 ...