sql 取出一个字符串中最后一个特殊字符的右边的字符

SQL如何取出一个字符串中最后一个特殊字符右边的字符,例如:10*20*300,怎样得到300?

使用reverse配合charindex来实现。 

reverse是把字符串倒置,然后通过charindex来获取倒置之后第一个*的位置,然后使用substring函数进行字符串截取,截取后再使用reverse倒置回来即可。 
以下为例子 
declare @str varchar(20) 
set @str = '10*20*300' 
select reverse(substring(reverse(@str),1,charindex('*',reverse(@str)) - 1))

转载于:https://www.cnblogs.com/xiaojian1/p/6506111.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第1章 数据库入门  1.1 数据库概述   1.1.1 数据库数据库管理系统   1.1.2 数据库能做什么   1.1.3 主流数据库管理系统介绍  1.2 数据库基础概念   1.2.1 Catalog   1.2.2 表(Table)   1.2.3 列(Column)   1.2.4 数据类型(DataType)   1.2.5 记录(Record)   1.2.6 主键(PrimaryKey)   1.2.7 索引(Index)   1.2.8 表关联   1.2.9 数据库的语言——SQL   1.2.10 DBA与程序员 第2章 数据表的创建和管理  2.1 数据类型   2.1.1 整数类型   2.1.2 数值类型   2.1.3 字符相关类型   2.1.4 日期时间类型   2.1.5 二进制类型  2.2 通过SQL语句管理数据表   2.2.1 创建数据表   2.2.2 定义非空约束   2.2.3 定义默认值   2.2.4 定义主键   2.2.5 定义外键   2.2.6 修改已有数据表   2.2.7 删除数据表   2.2.8 受限操作的变通解决方案 第3章 数据的增、删、改  3.1 数据的插入   3.1.1 简单的INSERT语句   3.1.2 简化的INSERT语句   3.1.3 非空约束对数据插入的影响   3.1.4 主键对数据插入的影响   3.1.5 外键对数据插入的影响  3.2 数据的更新   3.2.1 简单的数据更新   3.2.2 带WHERE子句的UPDATE语句   3.2.3 非空约束对数据更新的影响   3.2.4 主键对数据更新的影响   3.2.5 外键对数据更新的影响  3.3 数据的删除   3.3.1 简单的数据删除   3.3.2 带WHERE子句的DELETE语句 第4章 数据的检索  4.1 SELECT基本用法   4.1.1 简单的数据检索   4.1.2 检索出需要的列   4.1.3 列别名   4.1.4 按条件过滤   4.1.5 数据汇总   4.1.6 排序  4.2 高级数据过滤   4.2.1 通配符过滤   4.2.2 空值检测   4.2.3 反义运算符   4.2.4 多值检测   4.2.5 范围值检测   4.2.6 低效的“WHERE 1=1”  4.3 数据分组   4.3.1 数据分组入门   4.3.2 数据分组与聚合函数   4.3.3 HAVING语句  4.4 限制结果集行数   4.4.1 MySQL   4.4.2 MS SQL Server 2000   4.4.3 MS SQL Server 2005   4.4.4 Oracle   4.4.5 DB2   4.4.6 数据库分页  4.5 抑制数据重复  4.6 计算字段   4.6.1 常量字段   4.6.2 字段间的计算   4.6.3 数据处理函数   4.6.4 字符串的拼接   4.6.5 计算字段的其他用途  4.7 不从实体表取的数据  4.8 联合结果集   4.8.1 简单的结果集联合   4.8.2 联合结果集的原则   4.8.3 UNION ALL   4.8.4 联合结果集应用举例 第5章 函数  5.1 数学函数   5.1.1 求绝对值   5.1.2 求指数   5.1.3 求平方根   5.1.4 求随机数   5.1.5 舍入到最大整数   5.1.6 舍入到最小整数   5.1.7 四舍五入   5.1.8 求正弦值   5.1.9 求余弦值   5.1.10 求反正弦值   5.1.11 求反余弦值   5.1.12 求正切值   5.1.13 求反正切值   5.1.14 求两个变量的反正切   5.1.15 求余切   5.1.16 求圆周率π值   5.1.17 弧度制转换为角度制   5.1.18 角度制转换为弧度制   5.1.19 求符号   5.1.20 求整除余数   5.1.21 求自然对数   5.1.22 求以10为底的对数   5.1.23 求幂  5.2 字符串函数   5.2.1 计算字符串长度   5.2.2 字符串转换为小写   5.2.3 字符串转换为大写   5.2.4 截去字符串左侧空格   5.2.5 截去字符串右侧空格   5.2.6 截去字符串两侧的空格   5.2.7 取子字符串   5.2.8 计算子字符串的位置   5.2.9 从左侧开始取子字符串   5.2.10 从右侧开始取子字符串   5.2.11 字符串替换   5.2.12 得到字符的ASCII码   5.2.13 得到一个ASCII码数字对应的字符   5.2.14 发音匹配度  5.3 日期时间函数   5.3.1 日期、时间、日期时间与时间戳   5.3.2 主流数据库系统日期时间类型的表示方式   5.3.3 取得当前日期时间   5.3.4 日期增减   5.3.5 计算日期差额   5.3.6 计算一个日期是星期几   5.3.7 取得日期的指定部分  5.4 其他函数   5.4.1 类型转换   5.4.2 空值处理   5.4.3 CASE函数  5.5 各数据库系统独有函数   5.5.1 MySQL的独有函数   5.5.2 MS SQL Server的独有函数   5.5.3 Oracle的独有函数 第6章 索引与约束  6.1 索引  6.2 约束   6.2.1 非空约束   6.2.2 唯一约束   6.2.3 CHECK约束   6.2.4 主键约束   6.2.5 外键约束 第7章 表连接  7.1 表连接简介  7.2 内连接(INNER JOIN)  7.3 不等值连接  7.4 交叉连接  7.5 自连接  7.6 外部连接   7.6.1 左外部连接   7.6.2 右外部连接   7.6.3 全外部连接 第8章 子查询  8.1 子查询入门   8.1.1 单值子查询   8.1.2 列值子查询  8.2 SELECT列表的标量子查询  8.3 WHERE子句的标量子查询  8.4 集合运算符与子查询   8.4.1 IN运算符   8.4.2 ANY和SOME运算符   8.4.3 ALL运算符   8.4.4 EXISTS运算符  8.5 在其他类型SQL语句的子查询应用   8.5.1 子查询在INSERT语句的应用   8.5.2 子查询在UPDATE语句的应用   8.5.3 子查询在DELETE语句的应用 第9章 主流数据库SQL语法差异解决方案  9.1 SQL语法差异分析   9.1.1 数据类型的差异   9.1.2 运算符的差异   9.1.3 函数的差异   9.1.4 常用SQL的差异   9.1.5 取元数据信息的差异  9.2 消除差异性的方案   9.2.1 为每种数据库编写不同的SQL语句   9.2.2 使用语法交集   9.2.3 使用SQL实体对象   9.2.4 使用ORM工具   9.2.5 使用SQL翻译器  9.3 CowNewSQL翻译器   9.3.1 CowNewSQL支持的数据类型   9.3.2 CowNewSQL支持的SQL语法   9.3.3 CowNewSQL支持的函数   9.3.4 CowNewSQL的使用方法 第10章 高级话题  10.1 SQL注入漏洞攻防   10.1.1 SQL注入漏洞原理   10.1.2 过滤敏感字符   10.1.3 使用参数化SQL  10.2 SQL调优   10.2.1 SQL调优的基本原则   10.2.2 索引   10.2.3 全表扫描和索引查找   10.2.4 优化手法  10.3 事务   10.3.1 事务简介   10.3.2 事务的隔离   10.3.3 事务的隔离级别   10.3.4 事务的使用  10.4 自动增长字段   10.4.1 MySQL的自动增长字段   10.4.2 MS SQL Server的自动增长字段   10.4.3 Oracle的自动增长字段   10.4.4 DB2的自动增长字段  10.5 业务主键与逻辑主键  10.6 NULL的学问   10.6.1 NULL与比较运算符   10.6.2 NULL和计算字段   10.6.3 NULL和字符串   10.6.4 NULL和函数   10.6.5 NULL和聚合函数  10.7 开窗函数   10.7.1 开窗函数简介   10.7.2 PARTITION BY子句   10.7.3 ORDER BY子句   10.7.4 高级开窗函数  10.8 WITH子句与子查询 第11章 案例讲解  11.1 报表制作   11.1.1 显示制单人详细信息   11.1.2 显示销售单的详细信息   11.1.3 计算收益   11.1.4 产品销售额统计   11.1.5 统计销售记录的份额   11.1.6 为采购单分级   11.1.7 检索所有重叠日期销售单   11.1.8 为查询编号   11.1.9 标记所有单内最大销售量  11.2 排序   11.2.1 非字段排序规则   11.2.2 随机排序  11.3 表间比较   11.3.1 检索制作过采购单的人制作的销售单   11.3.2 检索没有制作过采购单的人制作的销售单  11.4 表复制   11.4.1 复制源表的结构并复制表的数据   11.4.2 只复制源表的结构  11.5 计算字符字符串出现的次数  11.6 去除最高分、最低分   11.6.1 去除所有最低、最高值   11.6.2 只去除一个最低、最高值  11.7 与日期相关的应用   11.7.1 计算销售确认日和制单日之间相差的天数   11.7.2 计算两张销售单之间的时间间隔   11.7.3 计算销售单制单日期所在年份的天数   11.7.4 计算销售单制单日期所在月份的第一天和最后一天  11.8 结果集转置   11.8.1 将结果集转置为一行   11.8.2 把结果集转置为多行  11.9 递归查询   11.9.1 Oracle的CONNECT BY子句   11.9.2 Oracle的SYS_CONNECT_BY_PATH()函数   11.9.3 My SQL Server和DB2递归查询 附录A 常用数据库系统的安装和使用  A.1 DB2的安装和使用  A.2 MySQL的安装和使用  A.3 Oracle的安装和使用  A.4 Microsoft SQL Server的安装和使用 显示部分信息
注:分二卷,点击上传者查看第二卷地址。亲,本人纯手工添加了书签哦!!方便阅读 《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决方案。   作为一本讲述T-SQL高级查询的专业图书,《Microsoft SQL Server 2008技术内幕:T-SQL查询》旨在结合实践的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。《Microsoft SQL Server 2008技术内幕:T-SQL查询》内容丰富、文字简洁明快,列举的实例具有一定的难度,而且实用性很强,可以把它们作为解决实际问题的标准模式。阅读《Microsoft SQL Server 2008技术内幕:T-SQL查询》,可以充分地理解T-SQL语言和良好的编程实践,学会如何编写更加有效而强大的查询语句。 序言 I 致谢III 前言 V 第1章 逻辑查询处理 1.1 逻辑查询处理的各个阶段 1.1.1 逻辑查询处理阶段简介 1.2 客户/订单场景下的查询示例 1.3 逻辑查询处理阶段详解 1.3.1 步骤1:FROM阶段 1.3.2 步骤2:WHERE阶段 1.3.3 步骤3:GROUP BY阶段 1.3.4 步骤4:HAVING阶段 1.3.5 步骤5:SELECT阶段 1.3.6 步骤6:排序用的ORDER BY阶段 1.4 逻辑查询处理的深入内容 1.4.1 表运算符 1.4.2 OVER子句 1.4.3 集合运算符 1.5 总结 第2章 集合论和谓词逻辑 2.1 自然语言表述到数学表示的转换 2.1.1 严格定义(well-Definedness) 2.1.2 相等、恒等和同一性 2.1.3 数学命名约定 2.1.4 数字 2.1.5 上下文 2.1.6 函数、参数和变量 2.1.7 指令和算法 2.2 集合论 2.2.1 集合的标记方法 2.2.2 集合的严格定义 2.2.3 论域 2.2.4 真实性 2.2.5 罗素悖论(Russell s Paradox) 2.2.6 有序对、元组和笛卡尔积 2.2.7 空集 2.2.8 集合的特征函数 2.2.9 集合的基数(Cardinality) 2.2.10 顺序 2.2.11 集合运算符 2.2.12 集合论的推广 2.3 谓词逻辑 2.3.1 编程语言的逻辑功能 2.3.2 命题和谓词 2.3.3 排律 2.3.4 与、或、非运算 2.3.5 逻辑等价 2.3.6 逻辑蕴含 2.3.7 量化(Quantification) 2.3.8 替代和推广 2.4 关系 2.4.1 自反性、对称性和传递性 2.5 一个实际的应用 2.6 总结 第3章 关系模型 3.1 关系模型简介 3.1.1 关系、元组和类型 3.1.2 关系模型:快速摘要 3.2 关系代数和关系计算 3.2.1 基本运算符 3.2.2 关系代数 3.2.3 Codd提出的8个原始关系运算符 3.2.4 关系演算 T-SQL支持 3.3 数据完整性 3.3.1 声明式约束 3.3.2 实施完整性的其他方法 3.4 数据库正规化和其他设计主题 3.4.1 解决函数依赖的范式 3.4.2 更高级的范式 3.4.3 反规范化(Denormalization) 3.4.4 一般化和特殊化 3.5 总结 第4章 查询优化 4.1 本章用到的样本数据 4.2 优化方法论 4.2.1 分析实例级别的等待 4.2.2 关联等待和队列 4.2.3 确定行动方案 4.2.4 细化到数据库/文件级别 4.2.5 细化到进程级别 4.2.6 优化索引和查询 4.3 查询优化的工具  4.3.1 查询执行计划的缓存  4.3.2 清空缓存 4.3.3 动态管理对象 4.3.4 STATISTICS 4.3.5 测量查询的运行时间 4.3.6 分析执行计划 4.3.7 图形化的执行计划 4.3.8 提示(Hint) 4.3.9 跟踪/Profiler 4.3.10 数据库引擎优化顾问 4.3.11 数据收集和管理数据仓库 4.3.12 使用SMO来复制统计信息 4.4 索引优化 4.4.1 表和索引的结构 4.4.2 索引访问方法 4.4.3 索引策略的分析 4.4.4 碎片 4.4.5 分区 4.5 准备样本数据 4.5.1 数据准备 4.5.2 TABLESAMPLE2 4.6 基于集合的方法和迭代/过程方法的比较,以及一个优化练习2 4.7 总结 第5章 算法和复杂性 5.1 你有一个1夸特的硬币吗? 5.1.1 如何从零钱罐取回1夸特钱 5.1.2 有时零钱罐没有1夸特的硬币 5.2 如何度量算法(How Algorithms Scale) 5.2.1 二次缩放(Quadratic Scaling)的一个例子 5.2.2 具有线性复杂度的算法 5.2.3 指数和超指数复杂度 5.2.4 次线性(sublinear)复杂度 5.2.5 常量复杂度 5.2.6 复杂度的技术定义 5.2.7 复杂度的比较 5.3 经典算法和算法策略 5.3.1 排序算法 5.3.2 字符串查找 5.4 一个实际的应用程序 5.4.1 识别测量数据的趋势 5.4.2 LISLP算法的复杂度 5.4.3 用T-SQL解决最长上升子序列的长度问题 5.5 总结 第6章 子查询、表表达式和排名函数 6.1 子查询 6.1.1 独立子查询 6.1.2 相关子查询 6.1.3 行为不当的子查询 6.1.4 不常用的谓词 6.2 表表达式(Table Expressions) 6.2.1 派生表 6.2.2 公用表表达式 6.3 分析排名函数 6.3.1 行号 6.3.2 排名和密集排名(Dense Rank) 6.3.3 组号(Tile Number) 6.4 数字辅助表 6.5 缺失范围和现有范围(也称为间断和孤岛) 6.5.1 缺失范围(间断) 6.5.2 现有范围(孤岛) 6.6 总结 第7章 联接和集合运算 7.1 联接 7.1.1 旧语法和新语法 7.1.2 基本联接类型 7.1.3 其他的联接分类 7.1.4 上一年度的滑动合计 7.1.5 联接算法 7.1.6 拆分元素 7.2 集合运算 7.2.1 UNION 7.2.2 EXCEPT  7.2.3 INTERSECT 7.2.4 集合运算的优先级 7.2.5 在集合运算使用INTO 7.2.6 避开不支持的逻辑阶段 7.3 总结 第8章 数据聚合和透视 8.1 OVER 子句 8.2 决胜属性(Tiebreaker) 8.3 连续聚合 8.3.1 累积聚合(Cumulative Aggregation) 8.3.2 滑动聚合(Sliding Aggregation) 8.3.3 年初至今(YTD) 8.4 透视转换(Pivoting)35 8.4.1 透视转换属性35 8.4.2 关系除法 8.4.3 聚合数据 8.5 逆透视转换 8.6 自定义聚合 8.6.1 使用透视转换的自定义聚合 8.6.2 用户定义聚合函数(UDA,User Defined Aggregate) 8.6.3 专用解决方案 8.7 直方图(Histogram) 8.8 分组因子 8.9 分组集 8.9.1 样例数据 8.9.2 GROUPING SETS从属子句 8.9.3 CUBE从属子句 8.9.4 ROLLUP从属子句 8.9.5 分组集代数 8.9.6 GROUPING_ID函数 8.9.7 保存分组集 8.9.8 排序 8.10 总结 第9章 TOP和APPLY 9.1 SELECT TOP 9.1.1 TOP和确定性 9.1.2 TOP和输入表达式 9.1.3 TOP和修改 9.1.4 增强的TOP 9.2 APPLY 9.3 使用TOP和APPLY解决常见问题 9.3.1 每组的TOP n 9.3.2 匹配当前值和前一个值 9.3.3 分页 9.4 逻辑转换 9.5 总结 第10章 数据修改 10.1 插入数据 10.1.1 增强的VALUES子句 10.1.2 SELECT INTO 10.1.3 BULK行集提供程序 10.1.4 按最小方式记录日志的操作  10.1.5 INSERT EXEC 10.1.6 序列机制45 10.2 删除数据 10.2.1 TRUNCATE与DELETE 10.2.2 删除包含重复数据的行 10.2.3 基于联结的DELETE 10.3 更新数据 10.3.1 基于联结的UPDATE 10.3.3 更新大值数据类型 10.3.3 用SELECT和UPDATE语句进行赋值 10.4 合并数据 10.4.1 MERGE语句基础 10.4.2 额外增加一个谓词 10.4.3 多个WHEN子句 10.4.4 WHEN NOT MATCHED BY SOURCE子句 10.4.5 MERGE Values 10.4.6 MERGE与触发器 10.5 OUTPUT子句 10.6 总结 第11章 查询分区表 11.1 在SQL Server进行分区 11.1.1 分区视图 11.1.2 分区表 11.2 总结 第12章 图、树、层次结构和递归查询 12.1 术语 12.1.1 图 12.1.2 树 12.1.3 层次结构 12.2 应用场景 12.2.1 员工组织图 12.2.2 材料清单(BOM) 12.2.3 道路系统 12.3 迭代/递归 12.3.1 下属 12.3.2 祖先 12.3.3 带有路径枚举的子图/子树 12.3.4 排序 12.3.5 环 12.4 具体化路径 12.4.1 维护数据 12.4.2 查询 12.5 使用HIERARCHYID数据类型的具体化路径5 12.5.1 维护数据 12.5.2 查询 12.5.3 使用HIERARCHYID的其他方面 12.6 嵌套集合 12.6.1 分配左值和右值 12.6.2 查询 12.7 传递闭包(Transitive Closure) 12.7.1 有向无环图 12.7.2 无向有环图 12.8 总结 索引
ORACLE PL/SQL 字符串函数、数学函数、日期函数 --【字符串函数】 --字符串截取substr(字段名,起始点,个数) select Name,substr(Name,2,4),substr(Name,0,3),substr(Name,-2,3),substr(Name,-2,1) from t1; --字符串从前面取三个(0开始) select Name,substr(Name,0,3) from t1; --字符串从后面取三个 select Name,substr(Name,-3,3),length(Name) 串长度 from t1; SELECT ASCII('A'),ASCII('B') from dual; select CHR(100),CHR(80) from dual; select CONCAT(CHR(65),CONCAT(CHR(67),CHR(98))) from dual; select CHR(65)||CHR(66)||CHR(76) from dual; --将每个单词的第一个字母大写其它字母小写返回。 select INITCAP('substr,abc,substring') from dual; --返回i在MISSISSIPPI第3次出现的位置, select INSTR('Mississippi','i',5,3) from dual; select INSTR('Mississippi','i',-2,3) from dual; --返回的是字节 select INSTRB('Mississippi','i',5,3) from dual; select INSTRB('Mississippi','i',-2,3) from dual; --长度 select length('WHO ARE YOU') from dual; select nvl(null,'空') from dual; --小写 select lower('WHo are You') from dual; --LPAD左侧用字符串补足到一定长度 select LPAD('DFSDf................',9,'WHO') from dual; select LPAD('DFSD',9,'WHO') from dual; select LPAD('DFSD',9,'') from dual; select LPAD('DFSD',length('DFSD')+length('WHO......'),'WHO......') from dual; --把最左边的字符去掉,使其第一个字符不在其 select ltrim('Mississippi','Mis') from dual; select ltrim('Mississippi','miD') from dual; --RPAD右侧用字符串补足到一定长度 select RPAD('DFSDf................',9,'WHO') from dual; select RPAD('DFSD',9,'WHO') from dual; select RPAD('DFSD',9,'') from dual; . . . . . . .
查询数据指从数据库获取所需要的数据。查询数据是数据库操作最常用,也是最重要的操作。用户可以根据自己对数据的需求,使用不同的查询方式。通过不同的查询方式,可以获得不同的数据。MySQL是使用SELECT语句来查询数据的。在这一章将讲解的内容包括。 1、查询语句的基本语法 2、在单表上查询数据 3、使用聚合函数查询数据 4、多表上联合查询 5、子查询 6、合并查询结果 7、为表和字段取别名 8、使用正则表达式查询 什么是查询? 怎么查的? 数据的准备如下: [sql] view plain copy create table STUDENT( STU_ID int primary KEY, STU_NAME char(10) not null, STU_AGE smallint unsigned not null, STU_SEX char(2) not null ); insert into STUDENT values(2001,'小王',13,'男'); insert into STUDENT values(2002,'明明',12,'男'); insert into STUDENT values(2003,'红红',14,'女'); insert into STUDENT values(2004,'小花',13,'女'); insert into STUDENT values(2005,'天儿',15,'男'); insert into STUDENT values(2006,'阿猎',13,'女'); insert into STUDENT values(2007,'阿猫',16,'男'); insert into STUDENT values(2008,'阿狗',17,'男'); insert into STUDENT values(2009,'黑子',14,'男'); insert into STUDENT values(2010,'小玉',13,'女'); insert into STUDENT values(2011,'头头',13,'女'); insert into STUDENT values(2012,'冰冰',14,'女'); insert into STUDENT values(2013,'美丽',13,'女'); insert into STUDENT values(2014,'神乐',12,'男'); insert into STUDENT values(2015,'天五',13,'男'); insert into STUDENT values(2016,'小三',11,'男'); insert into STUDENT values(2017,'阿张',13,'男'); insert into STUDENT values(2018,'阿杰',13,'男'); insert into STUDENT values(2019,'阿宝',13,'女'); insert into STUDENT values(2020,'大王',14,'男'); 然后这是学生成绩表,其定义了外键约束 [sql] view plain copy create table GRADE( STU_ID INT NOT NULL, STU_SCORE INT, foreign key(STU_ID) references STUDENT(STU_ID) ); insert into GRADE values(2001,90); insert into GRADE values(2002,89); insert into GRADE values(2003,67); insert into GRADE values(2004,78); insert into GRADE values(2005,89); insert into GRADE values(2006,78); insert into GRADE values(2007,99); insert into GRADE values(2008,87); insert into GRADE values(2009,70); insert into GRADE values(2010,71); insert into GRADE values(2011,56); insert into GRADE values(2012,85); insert into GRADE values(2013,65); insert into GRADE values(2014,66); insert into GRADE values(2015,77); insert into GRADE values(2016,79); insert into GRADE values(2017,82); insert into GRADE values(2018,88); insert into GRADE values(2019,NULL); insert into GRADE values(2020,NULL); 一、查询语句的基本语法 查询数据是指从数据库的数据表或视图获取所需要的数据,在mysql,可以使用SELECT语句来查询数据。根据查询条件的不同,数据库系统会找到不同的数据。 SELECT语句的基本语法格式如下: [sql] view plain copy SELECT 属性列表 FROM 表名或视图列表 [WHERE 条件表达式1] [GROUP BY 属性名1 [HAVING 条件表达式2]] [ORDER BY 属性名2 [ASC|DESC]] 属性列表:表示需要查询的字段名。 表名或视图列表:表示即将进行数据查询的数据表或者视图,表或视图可以有多个。 条件表达式1:设置查询的条件。 属性名1:表示按该字段的数据进行分组。 条件表达式2:表示满足该表达式的数据才能输出。 属性2:表示按该字段的数据进行排序,排序方式由ASC或DESC参数指定。 ASC:表示按升序的顺序进行排序。即表示值按照从小到大的顺序排列。这是默认参数。 DESC:表示按降序的顺序进行排序。即表示值按照从大到小的顺序排列。 如果有WHERE子句,就按照“条件表达式1”指定的条件进行查询;如果没有WHERE子句,就查询所有记录。 如果有GROUP BY子句,就按照“属性名1”指定的字段进行分组;如果GROUP BY子句后面带着HAVING关键字,那么只有满足“条件表达式2”指定的条件的记录才能够输出。GROUP BY子句通常和COUNT()、SUM()等聚合函数一起使用。 如果有ORDER BY子句,就按照“属性名2”指定的字段进行排序。排序方式由ASC或DESC参数指定。默认的排序方式为ASC。 二、在单表上查询数据 2.1、查询所有字段 [sql] view plain copy select * from STUDENT; 2.2、按条件查询 (1) 比较运算符 > , < ,= , != (),>= , 13; in(v1,v2..vn) ,符合v1,v2,,,vn才能被查出 IN关键字可以判断某个字段的值是否在指定的集合。如果字段的值在集合,则满足查询条件,该纪录将被查询出来。如果不在集合,则不满足查询条件。其语法规则如下:[ NOT ] IN ( 元素1, 元素2, …, 元素n ) [sql] view plain copy select * from STUDENT where STU_AGE in(11,12); between v1 and v2 在v1至v2之间(包含v1,v2) BETWEEN AND关键字可以判读某个字段的值是否在指定的范围内。如果字段的值在指定范围内,则满足查询条件,该纪录将被查询出来。如果不在指定范围内,则不满足查询条件。其语法规则如下: [ NOT ] BETWEEN 取值1 AND 取值2 [sql] view plain copy select * from STUDENT where STU_AGE between 13 and 15; (2)逻辑运算符 not ( ! ) 逻辑非 [sql] view plain copy select * from STUDENT where STU_AGE NOT IN(13,14,16); or ( || ) 逻辑或 OR关键字也可以用来联合多个条件进行查询,但是与AND关键字不同。使用OR关键字时,只要满足这几个查询条件的其一个,这样的记录将会被查询出来。如果不满足这些查询条件的任何一个,这样的记录将被排除掉。OR关键字的语法规则如下: 条件表达式1 OR 条件表达式2 [ …OR 条件表达式n ] 其,OR可以用来连接两个条件表达式。而且,可以同时使用多个OR关键字,这样可以连接更多的条件表达式。 [sql] view plain copy select * from STUDENT where STU_ID2015; and ( && ) 逻辑与 AND关键字可以用来联合多个条件进行查询。使用AND关键字时,只有同时满足所有查询条件的记录会被查询出来。如果不满足这些查询条件的其一个,这样的记录将被排除掉。AND关键字的语法规则如下: 条件表达式1 AND 条件表达式2 [ … AND 条件表达式n ] 其,AND可以连接两个条件表达式。而且,可以同时使用多个AND关键字,这样可以连接更多的条件表达式。 (3)模糊查询 like 像 LIKE关键字可以匹配字符串是否相等。如果字段的值与指定的字符串相匹配,则满足查询条件,该纪录将被查询出来。如果与指定的字符串不匹配,则不满足查询条件。其语法规则如下:[ NOT ] LIKE '字符串' “NOT”可选参数,加上 NOT表示与指定的字符串不匹配时满足条件;“字符串”表示指定用来匹配的字符串,该字符串必须加单引号或双引号。 通配符: % 任意字符 [sql] view plain copy select * from STUDENT where STU_NAME LIKE '%王'; 表示匹配任何以王结尾的 [sql] view plain copy select * from STUDENT where STU_NAME LIKE '阿%'; 表示匹配任何以阿开头的 _ 单个字符 比如说插入 [sql] view plain copy insert into STUDENT values(2021,'天下无镜',14,'男'); 然后 [sql] view plain copy select * from STUDENT where STU_NAME LIKE '_下_'; 查询的结果为空 但是如果下后面加两个_符号 [sql] view plain copy select * from STUDENT where STU_NAME LIKE '_下__'; 查询结果不为空 “字符串”参数的值可以是一个完整的字符串,也可以是包含百分号(%)或者下划线(_)的通配字符。二者有很大区别 “%”可以代表任意长度的字符串,长度可以为0; “_”只能表示单个字符。 如果要匹配姓张且名字只有两个字的人的记录,“张”字后面必须要有两个“_”符号。因为一个汉字是两个字符,而一个“_”符号只能代表一个字符。 (4)空值查询 IS NULL关键字可以用来判断字段的值是否为空值(NULL)。如果字段的值是空值,则满足查询条件,该记录将被查询出来。如果字段的值不是空值,则不满足查询条件。其语法规则如下: IS [ NOT ] NULL 其,“NOT”是可选参数,加上NOT表示字段不是空值时满足条件。 IS NULL是一个整体,不能将IS换成”=”. 三、使用聚合函数查询数据 3.1、group by 分组 如下: [sql] view plain copy select * from STUDENT group by STU_SEX; 不加条件,那么就只取每个分组的第一条。 如果想看分组的内容,可以加groub_concat [sql] view plain copy select STU_SEX,group_concat(STU_NAME) from STUDENT group by STU_SEX; 3.2、一般情况下group需与统计函数(聚合函数)一起使用才有意义 先准备一些数据: [sql] view plain copy create table EMPLOYEES( EMP_NAME CHAR(10) NOT NULL, EMP_SALARY INT unsigned NOT NULL, EMP_DEP CHAR(10) NOT NULL ); insert into EMPLOYEES values('小王',5000,'销售部'); insert into EMPLOYEES values('阿小王',6000,'销售部'); insert into EMPLOYEES values('工是不',7000,'销售部'); insert into EMPLOYEES values('人人乐',3000,'资源部'); insert into EMPLOYEES values('满头大',4000,'资源部'); insert into EMPLOYEES values('天生一家',5500,'资源部'); insert into EMPLOYEES values('小花',14500,'资源部'); insert into EMPLOYEES values('大玉',15000,'研发部'); insert into EMPLOYEES values('条条',12000,'研发部'); insert into EMPLOYEES values('笨笨',13000,'研发部'); insert into EMPLOYEES values('我是天才',15000,'研发部'); insert into EMPLOYEES values('无语了',6000,'审计部'); insert into EMPLOYEES values('什么人',5000,'审计部'); insert into EMPLOYEES values('不知道',4000,'审计部'); mysql的五种统计函数: (1)max:求最大值 求每个部门的最高工资: [sql] view plain copy select EMP_NAME,EMP_DEP,max(EMP_SALARY) from EMPLOYEES group by EMP_DEP; (2)min:求最小值 求每个部门的最仰工资: [sql] view plain copy select EMP_NAME,EMP_DEP,min(EMP_SALARY) from EMPLOYEES group by EMP_DEP; (3)sum:求总数和 求每个部门的工资总和: [sql] view plain copy select EMP_DEP,sum(EMP_SALARY) from EMPLOYEES group by EMP_DEP (4)avg:求平均值 求每个部门的工资平均值 [sql] view plain copy select EMP_DEP,avg(EMP_SALARY) from EMPLOYEES group by EMP_DEP; (5)count:求总行数 求每个部门工资大于一定金额的人数 [sql] view plain copy select EMP_DEP,count(*) from EMPLOYEES where EMP_SALARY>=500 group by EMP_DEP; 3.3、带条件的groub by 字段 having,利用HAVING语句过滤分组数据 having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。 having 子句被限制子已经在SELECT语句定义的列和聚合表达式上。通常,你需要通过在HAVING子句重复聚合函数表达式来引用聚合值,就如你在SELECT语句做的那样。 [sql] view plain copy select EMP_DEP,avg(EMP_SALARY),group_concat(EMP_NAME)from EMPLOYEES group by EMP_DEP HAVING avg(EMP_SALARY) >=6000; 查找平均工资大于6000的部门,并把部门里的人全部列出来 四、多表上联合查询 多表上联合查询分为内连接查询和外连接查询 (1)隐式内连接查询 [sql] view plain copy select STUDENT.STU_ID,STUDENT.STU_NAME,STUDENT.STU_AGE,STUDENT.STU_SEX,GRADE.STU_SCORE from STUDENT,GRADE WHERE STUDENT.STU_ID=GRADE.STU_ID AND GRADE.STU_SCORE >=90; 查找大于90分的学生信息: (2)显式内连接查询 [sql] view plain copy select STUDENT.STU_ID,STUDENT.STU_NAME,STUDENT.STU_AGE,STUDENT.STU_SEX,GRADE.STU_SCORE from STUDENT inner join GRADE on STUDENT.STU_ID=GRADE.STU_ID AND GRADE.STU_SCORE >=90; 用法:select .... from 表1 inner join 表2 on 条件表达式 (3)外连接查询 left join.左连接查询。 用法 :select .... from 表1 left join 表2 on 条件表达式 意思是表1查出来的数据不能为null,但是其对应表2的数据可以为null [sql] view plain copy select STUDENT.STU_ID,STUDENT.STU_NAME,STUDENT.STU_AGE,STUDENT.STU_SEX,GRADE.STU_SCORE from STUDENT left join GRADE on STUDENT.STU_ID=GRADE.STU_ID; right join就是相反的了,用法相同 用left join的时候,left join操作符左侧表里的信息都会被查询出来,右侧表里没有的记录会填空(NULL).right join亦然;inner join的时候则只有条件合适的才会显示出来 full join() 完整外部联接返回左表和右表的所有行。当某行在另一个没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据 值。 仅当至少有一个同属于两表的行符合联接条件时,内联接才返回行。内联接消除与另一个的任何行不匹配的行。而外联接会返回 FROM 子句提到的至少一个表或 视图的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左向外联接引用的左表的所有行,以及通过右向外联接引用的右表的所有行。完整外 部联接两个表的所有行都将返回。 五、子查询 以一个查询select的结果作为另一个查询的条件 语法:select * from 表1 wher 条件1(select ..from 表2 where 条件2) 1、与In结合 [sql] view plain copy select * from STUDENT where STU_ID IN(select STU_ID from GRADE where STU_SCORE>85); 查找大于85分的学生信息 2、与EXISTS结合 EXISTS和NOT EXISTS操作符只测试某个子查询是否返回了数据行。如果是,EXISTS将是true,NOT EXISTS将是false。 [sql] view plain copy select * from STUDENT where EXISTS (select STU_ID from GRADE where STU_SCORE>=100); 如果有学生成绩大于100,才查询所有的学生信息 3、ALL、ANY和SOME子查询 any和all的操作符常见用法是结合一个相对比较操作符对一个数据列子查询的结果进行测试。它们测试比较值是否与子查询所返回的全部或一部分值匹配。比方说,如果比较值小于或等于子查询所返回的每一个值,<=all将是true,只要比较值小于或等于子查询所返回的任何一个值,<=any将是true。some是any的一个同义词。 [sql] view plain copy select STU_ID from GRADE where STU_SCORE = any (select STU_ID from GRADE where STU_SCORE 80 order by STU_SCORE; 默认是按升序的, 也可以这么写 [sql] view plain copy select * from GRADE where STU_SCORE >80 order by STU_SCORE ASC; 结果如下: 如果想换成降序的: [sql] view plain copy select * from GRADE where STU_SCORE >80 order by STU_SCORE desc; 7.2、limit limit [offset,] N offset 偏移量,可选,不写则相当于limit 0,N N 取出条目 取分数最高的前5条 [sql] view plain copy select * from GRADE order by STU_SCORE desc limit 5; 取分数最低的前5条 [sql] view plain copy select * from GRADE order by STU_SCORE asc limit 5; 取分数排名在10-15之间的5条 [sql] view plain copy select * from GRADE order by STU_SCORE desc limit 10,5 八、为表和字段取别名 使用AS来命名列 [sql] view plain copy select STU_ID as '学号',STU_SCORE as '分数' from GRADE; 当表的名称特别长时,在查询直接使用表名很不方便。这时可以为表取一个别名。用这个别名来代替表的名称。 MySQL为表取别名的基本形式如下: 表名 表的别名 [sql] view plain copy select S.STU_ID,S.STU_NAME,S.STU_AGE,S.STU_SEX,G.STU_SCORE from STUDENT S,GRADE G WHERE S.STU_ID=G.STU_ID AND G.STU_SCORE >=90; 九、使用正则表达式查询 正则表达式是用某种模式去匹配一类字符串一个方式。例如,使用正则表达式可以查询出包含A、B、C其任一字母的字符串。正则表达式的查询能力比通配字符的查询能力更强大,而且更加的灵活。正则表达式可以应用于非常复杂查询。 MySQL,使用REGEXP关键字来匹配查询正则表达式。其基本形式如下: 属性名 REGEXP '匹配方式' 在使用前先插入一些数据: [sql] view plain copy insert into STUDENT values(2022,'12wef',13,'男'); insert into STUDENT values(2023,'faf_23',13,'男'); insert into STUDENT values(2024,'fafa',13,'女'); insert into STUDENT values(2025,'ooop',14,'男'); insert into STUDENT values(2026,'23oop',14,'男'); insert into STUDENT values(2027,'woop89',14,'男'); insert into STUDENT values(2028,'abcdd',11,'男'); (1)使用字符“^”可以匹配以特定字符字符串开头的记录。 查询所有以阿头的 [sql] view plain copy select * from STUDENT where STU_NAME REGEXP '^阿'; 以数字开头 [sql] view plain copy select * from STUDENT where STU_NAME REGEXP '^[0-9]'; (2)使用字符“$”可以匹配以特定字符字符串结尾的记录 以数字结尾 [sql] view plain copy select * from STUDENT where STU_NAME REGEXP '[0-9]$'; (3)用正则表达式来查询时,可以用“.”来替代字符串的任意一个字符。 [sql] view plain copy select * from STUDENT where STU_NAME REGEXP '^w....[0-9]$'; 以w开头,以数字结束,间有4个 (4)使用方括号([])可以将需要查询字符组成一个字符集。只要记录包含方括号的任意字符,该记录将会被查询出来。 例如,通过“[abc]”可以查询包含a、b、c这三个字母任何一个的记录。 使用方括号可以指定集合的区间。 “[a-z]”表示从a-z的所有字母; “[0-9]”表示从0-9的所有数字; “[a-z0-9]”表示包含所有的小写字母和数字。 “[a-zA-Z]”表示匹配所有字母。 [sql] view plain copy select * from STUDENT where STU_NAME REGEXP '[0-9a-z]'; 查询所有包含有数字和小写字母的 使用“[^字符集合]”可以匹配指定字符以外的字符 (5){}表示出现的次数 正则表达式,“字符串{M}”表示字符串连续出现M次;“字符串{M,N}”表示字符串联连续出现至少M次,最多N次。例如,“ab{2}”表示字符串“ab”连续出现两次。“ab{2,4}”表示字符串“ab”连续出现至少两次,最多四次。 o出现2次 [sql] view plain copy select * from STUDENT where STU_NAME REGEXP 'o{2}'; (6)+表示到少出现一次 fa至少出现一次 [sql] view plain copy select * from STUDENT where STU_NAME REGEXP '(fa)+'; 注意: 正则表达式可以匹配字符串。当表的记录包含这个字符串时,就可以将该记录查询出来。如果指定多个字符串时,需要用符号“|”隔开。只要匹配这些字符串的任意一个即可。每个字符串与”|”之间不能有空格。因为,查询过程数据库系统会将空格也当作一个字符。这样就查询不出想要的结果。 正则表达式,“*”和“+”都可以匹配多个该符号之前的字符。但是,“+”至少表示一个字符,而“*”可以表示零个字符

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值