数据库(五)-------高级查询(二)

目录

5.1 通配符过滤

5.1.1 like操作符:

5.1.2 百分号(%)通配符

5.1.3 下划线‘_’通配符

5.2 创建计算字符

测试计算

5.3 聚集函数

一次性添加多个列

5.4 分组


5.1 通配符过滤

什么是通配符?

通配符就是用来匹配值的一部分的特殊字符。

搜索模式:由字面值、通配符或者两者组合构成的搜索条件。

5.1.1 like操作符:

前面介绍的所有操作符都是针对一直值进行过滤的。不管是匹配还是多个值,测试大于还是小于已知值,或者检查某个范围的值,共同点是过滤中使用的值都是已知的。但是,这种过滤方法并不是任何时候都好用,例如,怎样搜索产品名中包含文本anvil的所有产品?用简单的比较操作符坑定不行,必须使用通配符。利用通配符可创建比较特定数据搜索模式。在这个例子中,如果你想找出名称包含anvil的所有产品,可构造一个通配符搜索模式,找出产品名中任何位置出现anvik的产品。

为在搜索子句中使用通配符,必须使用link操作符。like指示MySQL,后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。

5.1.2 百分号(%)通配符

最常使用的通配符是百分号(%)。在搜索串中,%表示任何字符出现的任意次数。例如,为了找出所有以词a开头的产品,可以使用以下select语句:

select prod_id,prod_name from products where prod_name like 'a%';

此例子使用了搜索模式'a%'。在执行这条句子时,讲检索任意以a开头的词。%告诉MySQL接受a之后的任意字符,不管它有多少字符。

注意:根据MySQL的配置方式,搜索可以使区分大小写的。如果区分大小写,‘a%’与Apache这个词不相匹配。

通配符可在搜索模式中任意位置使用,并且可以使用多个通配符。下面例子使用两个通配符,它们位于模式的两端:

select prod_id,prod_name from products where prod_name like '%a%';

代码分析:搜索模式'%a%'表示匹配任何位置包含文本anvil的值,而不论它之前或之后出现什么字符。

通配符也可以出现在搜索模式中间。比如下面这个示例:

select prod_namefrom products where prod_name like '%a%';

重要的是要注意到,除了一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。

注意:1.为空格可能会干扰通配符匹配。比如在 '%a%'的a后面有一个或多个空格时,则子句where prod_name like '%a%';将不会匹配它们,因为在a后有多余字符。解决这个问题的一个简单的办法是在搜索模式最后加一个%。另一个更好的办法是用函数将收尾空格去除。

2.虽然似乎%通配符可以匹配任何东西,但是有一个例外,即NULL。即使where prod_name like ‘%’也不能匹配用值NULL作为产品名的行。

5.1.3 下划线‘_’通配符

另一个有用的通配符是下滑线(_)。下划线的用途与%一样,但下划线之匹配单个字符而不是多个字符。

模糊搜索...
在之前的查询中 所有的条件 全部是已知的!!!
在某些特殊情况下 有一些条件是未知的或者只知道部分...
案例:想查询姓马的客户的所有信息!!! 提供的条件不完整
	通过案例分析出 mysql也会根据不完整的信息去数据库表中去查询出符合这些条件的数据出来。
	马xxx:马字的后面 字的数量不确定 是哪一个字也不确定
# 如果想进行模糊搜索 那么必须借助通配符先建立一个模糊搜索的规则
通配符:
	select 列1, 列2 .... from 表名;
		列1, 列2:就是检索列 
		检索列:你要查询出来的列
		select * from 表名;
	*:星号 使用在查询的检索列的位置 表示查询表中所有的列
	%:百分号 在模糊搜索条件中可以表示 任何字符出现任意次数
		马%-> 马冬梅 马一一 马超 马云飞  以指定字符开头,后面可以跟任意字符
		%分-> 中分 积分 微积分 上大分  以指定字符结尾 前面可以任何字符出现任意次数 
		%东%->什么东西 马东梅 吃东西 福如东海 不问东西 在指定字符串中 包含这个字符就可以了。
			东南西北
			东
			。东1
	_:下划线 在模糊搜索条件中可以表示 任何字符出现一次
		# 每有一根下划线就表示必须有一个字符出现一次
		马_: 马云 马超 马1 马2 
		焦__: 焦NB 焦云飞 
如何使用模糊搜索条件去查询呢?
	# 语法 where 列名 like '模糊搜索条件';
	案例:想查询姓马的客户的所有信息!!!
	select * from userinfo where userName like '马%';

5.2 创建计算字符

	# 语法: concat(列1, 列2....)  放在检索列中使用
	案例:查询id是10001这个客户的国家城市和地址 要求一个数据返回
		select concat(cust_country,'/',cust_city,'/', cust_address) from customers where cust_id = 10001;

	# 使用拼接函数之后 会导致列名不合法 或者会转义 为了防止这种情况发生 会使用as关键字 给列重新起一个名字
	select concat(列1, 列2....) as 新列名 from 表名; 

mysql支持简单的算数运算 + - * /
案例:查询订单编号为20005的第一个条目的总价格
select quantity * item_price as 总价格 from orderitems where order_num = 20005 and order_item = 1;

测试计算

select now();
now():获得当前时间的年月日 时分秒

5.3 聚集函数

count():求总数量
	用法1:count(*)->求查询出来数据的总数量
		select count(*) from 表名;
		案例:1003供应商提供了多少个商品?
			select count(*) from products;
	用法2:count(列名)-> 求查询出来数据的当前列的数量(忽略值为null的单元)
		select count(列名) from 表名;
		案例:查询用户的有效邮箱数量!!!
			select count(cust_email) as 数量 from customers;
max():求最大值
	子查询案例
		-- select * from products where prod_price = (select max(prod_price) from products);
	语法: select max(列名) as 最大值 from 表名;
	案例:想求出价值最贵的商品
		select max(prod_price) as 最大值 from products;
		只会针对于当前列求最大值 如果添加其他的检索列  将没有任何作用
min():求最小值
	语法:select min(列名) as 最大值 from 表名;
	案例:想求出价值最低的商品
		select min(prod_price) as 最小值 from products;
avg():求平均分
	只针对于数值类型的列 语法:select avg(列名) as 平均值 from 表名;
	案例:求出供应商1002提供的商品的平均价格
		select avg(prod_price) as 平均价格 from products where vend_id = 1002;
		
sum():求总和
	只针对于数值类型的列
	语法:select sum(列名) as 总和 from 表名;
	案例:求由1002提供的商品单价总和
		select sum(prod_price) as 总和 from products where vend_id = 1002;
	案例:求20005这个订单的总价格是多少!!
		1.在订单详细表中 查询属于20005这个订单的详细信息
			select * from orderitems where order_num = 20005;
		2.使用计算字段去求出每一个条目中总价格
			select *,(quantity * item_price) as 总价格 from orderitems where order_num = 20005;
		3.使用sum函数对这个计算出来的新列求总和
			select order_num, sum(quantity * item_price) as 总价格 from orderitems where order_num = 20005;
# 聚集函数是可以组合使用的。。。
	select 
	count(*) as num_items,
	min(prod_price) as price_min, 
	max(prod_price) as price_max,
	avg(prod_price) as price_avg 
	from products;

一次性添加多个列

alter table 表名 add 列名1 数据类型 约束字段, add 列名2 数据类型 约束字段...;

# 在where子句中 如果出现了正常条件和模糊搜索条件 模糊搜索条件一定是放到where子句的最后面
因为模糊搜索条件效率较低 会去检查表中多条数据 所以 把效率高的条件放到前面 效率低的放后面 来提高查询的效率

5.4 分组

把相同逻辑的数据分到一个组中 把这个组称之为逻辑组 能更加方便统计
关键字:group by 是一个子句
# 注意事项:子句书写顺序-> where > group by > order by > limit

# 语法: group by 列名1,列名2...;
	会把列中相同的数据放到一个逻辑组中去
案例1:查询每个供应商分别提供了多少个产品
	select vend_id, count(*) as 数量 from products group by vend_id;
案例2:查询每个供应商提供的商品的最高价格。
	select vend_id , max(prod_price) as 最高价格  from products group by vend_id;
# 分组之后 会按照分组的那个列进行默认的升序排序 如果想降序 必须自己手动写order by

# 如果在一个sql语句中存在分组和聚集函数计算 那么一定是先分组后计算

having:
	having子句:作用和where子句一模一样
		where是在分组之前过滤数据 having是在分组之后 过滤组

	书写顺序> where > group by > having > order by > limit

	# 案例:求每个供应商提供的价格超过5块的商品数量
		select vend_id,count(*) as 数量 from products where prod_price > 5 group by vend_id;
	
	# 案例:提供2个以上,且价格超过5块的产品的供应商
		select vend_id,count(*) as 数量 from products where prod_price > 5 group by vend_id having 数量 > 2;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值