MySQL笔记3

字段操作

CONCAT拼接字段

#以格式vend_name(vend_country)格式显示供应商信息
SELECT CONCAT(vend_name,'(',vend_country,')') FROM vendors;

#RTrim去除右侧空格
#上面语句输出的结果和要求有细微差别,要求是()前后没有空格
SELECT CONCAT(RTRIM(vend_name),'(',RTRIM(vend_country),')') FROM vendors;

#使用别名
SELECT CONCAT(RTRIM(vend_name),'(',RTRIM(vend_country),')') AS vend_title FROM vendors;

字段算术计算

#算术操作符支持+-*/
SELECT prod_id, quantity, item_price, quantity*item_price AS price FROM orderitems;

数据处理函数

文本处理函数
函数说明
left()返回串左边的字符
right()返回串右边的字符
RTrim()去除串右边的空格
LTrim()去除串左边的空格
Lower()将串全部小写
Upper()将串全部大写
length()返回串的长度
substring()截取一部分字符返回
locate()找出串的一个子串的位置
soundex()返回串的soundex值

需要特别说明soundex()函数的功能:类似于模糊音匹配。

#例如有个消费者coyote Inc.,联系名为Y. Lee,但是检索式拼写成了Y. Lie,肯定检索不到信息
SELECT cust_name,cust_contact FROM customers WHERE cust_contact='Y .Lie';
#使用soundex()函数将字符转化为发音音节,可以进行模糊音匹配,从而检索到信息
SELECT cust_name,cust_contact FROM customers WHERE SOUNDEX(cust_contact)=SOUNDEX('Y .Lie');
日期处理函数
日期处理函数说明
now()返回当前日期和时间
curdate()返回当前日期
curtime()返回当前时间
date()返回当前日期时间的日期部分
time()返回当前日期时间的时间部分
year()返回一个日期的年
month()返回一个日期的月
day()返回一个日期的天
hour()返回一个时间的小时
minute()返回一个时间的分钟
second()返回一个时间的秒
adddate()增加一个日期
addtime()增加一个时间
dayofweek()返回一个日期对应的星期几
datediff()计算两个日期之差
date_add()高度灵活的日期运算函数
date_formate()将日期格式化为想要的格式
#基本的日期比较
SELECT * FROM orders WHERE order_date='2005-09-01';
但是这样并不保险,因为order_date里面不只有日期,还有时间,这里order_date里面的时间为00:00:00所以恰巧匹配,
更保险的做法是使用DATE()函数提取order_date的日期
SELECT * FROM orders WHERE DATE(order_date)='2005-09-01';

#比较复杂的日期操作
#例如检索位于9月份内的订单
SELECT * FROM orders WHERE DATE(order_date) BETWEEN '2005-09-01' AND '2005-09-30';

#更灵活的方法
SELECT * FROM orders WHERE YEAR(order_date)=2005 AND MONTH(order_date)=9
数值处理函数

abs();cos();exp();pi();rand();sin();sqrt();tan();mod();

汇总数据

函数说明
AVG()返回某列的平均值
COUNT()返回某列有多少行
MAX()返回某列的最大值
MIN()返回某列的最小值
SUM()返回某列的总和
#avg()只能用于特定列(数值列)求平均值,且将列名作为函数的参数输入,想要获得多个列的平均值,必须使用多个avg()函数
SELECT AVG(prod_price) AS avg_price FROM products;

#count()函数的两种用法
#count(*)对表中的行数进行计数,不管是否有null值
SELECT COUNT(*) FROM customers;
#count(字段名)对特定列的行数进行计数,null值不计算在内
SELECT COUNT(cust_email) FROM customers;

#max()和min()虽然一般用来找出最大\最小的数值或者日期,但mysql允许用他们返回任意列(包括文本列)的最大\最小值
#用于文本列时,如果数据按照相应的列排序,则min() 返回第一行,max()返回最后一行数据
#l两个函数都忽略null值
SELECT MIN(prod_price) FROM products;
SELECT MAX(prod_price) FROM products;

#sum()函数也忽略null行
SELECT SUM(prod_price) FROM products;

聚集函数中使用DISTINCT

#上面五个聚集函数都可以类似如下使用distinct去除重复内容
SELECT AVG(DISTINCT prod_price) FROM products;
#注意
#如果指定列名,则DISTINCT只能用于COUNT()。DISTINCT不能用于COUNT(*),因此不允许使用COUNT(DISTINCT),否则产生错误。
#类似的,DISTINCT必须使用列明,不能用于计算或表达式

多个聚合函数同时使用

SELECT COUNT(*) AS 数据条数,MIN(prod_price) AS  min_price, MAX(prod_price)  AS max_price, SUM(prod_price) AS sum_price FROM products;

分组数据

下面的例子返回供应商1003提供的产品数目

SELECT COUNT(*) FROM products WHERE vend_id=1003

但是当我们需要返回每个供应商提供的产品数目时,以前的知识不能做到,或者能做到但是很复杂。这个时候就需要用到数据分组的概念。

GROUP BY数据分组
SELECT vend_id, COUNT(*) FROM products GROUP BY vend_id;

在这里插入图片描述

HAVING过滤分组
#where过滤行,having过滤分组,即having负责分组后再过滤
SELECT vend_id, COUNT(*)  FROM products GROUP BY vend_id HAVING COUNT(*)>2;

#当然,where和having是可以同时使用的,比如查询供应产品价格大于等于10,且供应产品数目大于等于2的供应商
SELECT vend_id, COUNT(*) FROM products WHERE prod_price >=10 GROUP BY vend_id HAVING COUNT(*)>=2;
分组并排序
#检索总计订单价格大于50的订单的订单号和总计订单价格
SELECT 
  order_num,
  SUM(quantity * item_price) 
FROM
  orderitems 
GROUP BY order_num 
HAVING SUM(quantity * item_price) > 50 ;

#在上述查询的基础上,再按照总订单价格排序输出
SELECT 
  order_num,
  SUM(quantity * item_price) 
FROM
  orderitems 
GROUP BY order_num 
HAVING SUM(quantity * item_price) > 50 
ORDER BY SUM(quantity * item_price) ;
SELECT子句顺序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SlVFoD0A-1570843487259)(637022DEDABB417E887FC5C048ABF6FF)]

使用子查询(略难)

子查询:即嵌套在查询中的查询,或者说嵌套在select中的select

利用子查询进行过滤
#举例说明:需要列出订购物品 TNT2的所有客户,因为信息分别存在多个表中,所以需要以下步骤
#检索包含TNT2的所有订单号
#检索上一步输出的订单号涉及的客户ID
#检索上一步输出的ID对应的客户信息
SELECT order_num FROM orderitems WHERE prod_id='TNT2';#结果为20005,20007
SELECT cust_id FROM orders WHERE order_num IN (20005,20007);#结果为10001,10004
SELECT * FROM customers WHERE cust_id IN (10001,10004);

#现在使用子查询将所有语句组合成一个语句
SELECT * FROM customers WHERE cust_id IN (
	SELECT cust_id FROM orders WHERE order_num IN (
		SELECT order_num FROM orderitems WHERE prod_id='TNT2'
	)
);
作为计算字段使用子查询
#加入需要显示customers表中每个客户的信息和他对应的订单总数
SELECT cust_id,cust_name,(
    SELECT COUNT(*) FROM orders WHERE orders.`cust_id` = customers.`cust_id`
    ) 
FROM customers ;
#这里使用了完全限定的表明,这里如果不加限定会出现多义性。

算字段使用子查询

#加入需要显示customers表中每个客户的信息和他对应的订单总数
SELECT cust_id,cust_name,(
    SELECT COUNT(*) FROM orders WHERE orders.`cust_id` = customers.`cust_id`
    ) 
FROM customers ;
#这里使用了完全限定的表明,这里如果不加限定会出现多义性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值