文章目录
后端开发技能学习(七)sql命令学习(中篇)
1.创建计算字段
一般来说,存储在表中的数据不是应用程序所需要的,而在客户机上对这些数据进行转换的效率远远不如在数据库中的处理。
1.1 拼接字段
拼接: 将值联结到一起构成单个值
使用Concat()函数可以拼接两个列:
栗子:
SELECT Concat(vend_name,'(',vend_country,')') FROM vendors ORDER BY vend_name; # 用Concat()联结多个串的值
1.2 使用别名
上述拼接的字段可以在查询之后看到结果,但无法被使用,所以需要别名来引用它:
在mysql中,通常使用AS关键字来赋予别名:
栗子:
SELECT Concat(vend_name,' (',vend_country,')') AS vend_title FROM vendors; # 将该结果赋予一个别名vend_title
1.3 执行算数运算
在mysql中也能对数据进行简单的算术运算:
栗子:
SELECT 3+2; # 加
SELECT 3-2; # 减
SELECT 3*2; # 乘
SELECT 3/2; # 除
SELECT Now(); # Now函数获取当前时间
2. 数据处理函数
mysql中提供了许多用于处理数据的函数,主要包括一下几类:
1.文本处理函数
2.数值处理函数
3.日期处理函数
4.系统函数
2.1文本处理函数
Trim()函数用于去除值中的空格:
SELECT Trim(Concat(vend_name,' ')) FROM vendors; # 也可以用RTrim()和LTrim()来分别去除左右的空格
Upper()函数和Lower()函数分别将文本转化为大写和小写
SELECT Upper(vend_name) FROM vendors; # 转成大写
其他文本处理函数汇总:
函数 | 用途 |
---|---|
Left() | 返回串左边的字符 |
Right() | 返回串右边的字符 |
Length() | 反回串的长度 |
Locate() | 找出串的一个子串 |
Soundex() | 返回串的SOUNDEX值 |
SubString() | 返回子串的字符 |
其中Soundex()所返回的是该串的发音字符,例如:
Y Lee的发音和 Y Lie的发音是相同的,所以Soundex(‘Y Lee’)=Soundex(‘Y Lie’)
2.2日期和时间处理函数
在mysql中,日期和时间会采用相应的数据类型和特殊的格式来存储。而对这些格式进行处理,则需要用到日期和时间处理函数,以下是一些常用的函数:
函数 | 说明 |
---|---|
AddDate() | 增加一个日期(周,天等) |
AddTime() | 增加一个时间(时,分等) |
CurDate() | 返回当前日期 |
CurTime() | 返回当前时间 |
Date() | 返回日期时间的日期部分 |
DateDiff() | 计算两个日期之差 |
Date_Add() | 高度灵活的日期运算函数 |
Date_Format() | 返回一个格式化的日期或时间串 |
Day() | 返回一个日期的天数部分 |
DayOfWeek() | 得到一个日期的星期几 |
Hour() | 返回时间的小时部分 |
Minute() | 返回时间的分钟部分 |
Month() | 返回一个日期的月份部分 |
Now() | 返回当前日期和时间 |
Second() | 返回时间的秒部分 |
Time() | 返回一个日期时间的时间部分 |
Year() | 返回一个日期的年份部分 |
栗子:
SELECT order_date FROM orders WHERE Date(order_date) BETWEEN '2005-9-01' AND '2005-9-30'; # 用Date()函数获得日期部分
SELECT AddDate(order_date,INTERVAL 1 DAY) FROM orders; # 增加一天
SELECT AddTime(order_date,'1:2:3') FROM orders; # 增加指定时间
SELECT DateDiff(AddDate(order_date,INTERVAL 1 DAY),order_date) FROM orders; # 计算日期差
SELECT DayOfWeek(order_date) FROM orders; # 得到星期数
SELECT Date_Format(order_date,'%m-%d-%Y') FROM orders; # 得到固定格式的日期时间
2.3数值处理函数
这里列举一些常用的数值处理函数:
函数 | 说明 |
---|---|
Abs() | 绝对值 |
Cos(),Sin(),Tan() | 余弦、正弦、正切 |
Exp() | 指数 |
Mod() | 余数 |
Pi() | 圆周率 |
Rand() | 随机数 |
Sqrt() | 平方根 |
2.4聚集函数
有时候我们需要对得到结果进行一定的分析,这就要用到聚集函数,比如:
- 需要确定表中的行数
- 获得表中行组的和
- 找出某列的最大最小值
等等
mysql提供了如下的聚集函数来解决该问题:
函数 | 说明 |
---|---|
AVG() | 返回一列的平均值 |
COUNT() | 返回某列的行数 |
MAX() | 返回某列最大值 |
MIN() | 返回某列最小值 |
SUM() | 返回某列之和 |
栗子:
SELECT AVG(prod_price) FROM products; # 获得平均值
SELECT COUNT(*) FROM products; # 获得总体行数(不忽略NULL值)
SELECT COUNT(prod_price) FROM products; # 获得行数(忽略NUL值)
SELECT COUNT(DISTINCT prod_price) FROM products; # 排除相同行
# 其他函数同理
3.分组数据(GROUP BY,HAVING)
mysql中的数据分组主要是由GROUP BY 和HAVING两个子句实现的
上节说道,我们可以利用AVG()函数来获得某一个供应商的价格平均值:
SELECT AVG(prod_price) FROM products WHERE vend_id=1001;
但是如果我们需要获得每一个供应商的平均值时,就需要对其分组:
SELECT vend_id,AVG(prod_price) FROM products GROUP BY vend_id;
SELECT vend_id,AVG(prod_price) FROM products GROUP BY vend_id ORDER BY vend_id DESC; # 排序处理
注意:当分组列中含有NULL时,所有的NULL将被视为同一个分组
当需要对分组之后的结果进行过滤时,WHERE子句不能在此使用,而需要用到HAVING子句,HAVING子句和WHERE的操作符基本相同:
SELECT vend_id,AVG(prod_price) FROM products GROUP BY vend_id HAVING vend_id>1002; # 用HAVING 语句对其进行过滤
4.联结表
4.1创建联结
大多数情况下,为了节省空间,要查询的数据保存在不同的表中,在这种情况下,我们需要进行多表查询:
SELECT vend_name, prod_name,prod_price,vendors.vend_id,products.vend_id FROM vendors,products;
如上述命令结果所示,若没有WHERE子句进行限制,查询到的结果将是两个表的笛卡尔积。
所以,在多表查询时一般会用WHERE子句来进行限制,如:
SELECT vend_name, prod_name,prod_price,vendors.vend_id,products.vend_id FROM vendors,products WHERE vendors.vend_id=products.vend_id;
注意:一般的联结语句都应配有WHERE子句
4.2内部联结
上述例子中,WHERE子句中用的是等号来进行联结,在mysql中,有特定的语法来完成:
SELECT vend_name, prod_name,prod_price,vendors.vend_id,products.vend_id FROM vendors INNER JOIN products ON vendors.vend_id=products.vend_id;
上述命令与上节的命令等效
4.3多表联结
多表联结可以举一反三得出,但是请注意:每多联结一个表,查询的性能将会下降很多,所以不要联结不必要的表!
5.组合查询(UNION)
在mysql中,我们可以使用UNION命令来组合多个查询语句,例:
SELECT vend_id,prod_id,prod_price FROM products WHERE prod_price<20 UNION SELECT vend_id,prod_id,prod_id FROM products WHERE vend_id <> 1001;
当然,这也可以通过单条SELECT语句实现
不过要注意的是:
1.用UNION组合的查询结果必须有相同的列数,且类型要能兼容(不必完全一致)
2.UNION组合的结果将默认删去重复的行,如果不想删去,可使用UNION ALL
3.要对组合查询结果排序时,只能有一条ORDER BY子句。且只能在最后一条SELECT语句之后
6.全文本搜索
待更新。。。
7.插入、更新和删除数据
前面我们学习了大多数的SELECT语句,这确实是mysql中最为复杂的部分,但我们还需要掌握一下数据的插入、更新和删除语句。
1.插入语句 INSERT
最为简单的插入即根据表中的顺序来进行填充:
INSERT INTO products VALUES('ABCD',1002,'abcd',5.0,NULL);
但是这样极不安全,所以有更为安全的方法:
INSERT INTO products(prod_id,vend_id,prod_name,prod_price,prod_desc) VALUES('ABCD',1002,'abcd',5.0,NULL); #与上一句等效,且允许不同次序
且支持插入多行:
INSERT INTO products(prod_id,vend_id,prod_name,prod_price,prod_desc) VALUES('ABCDE',1002,'abcd',5.0,NULL),('ABCDF',1002,'abcd',5.0,NULL);
并且,可以将查询得到的结果进行插入:
2.更新语句 UPDATE
UPDATE可以对一行或多行进行更新:
UPDATE products SET prod_desc='good' WHERE vend_id=1001; 更新一列多行
UPDATE products SET prod_desc='good',prod_name='lihua' WHERE vend_id=1001;
3.删除语句 DELETE
注意:写DELETE语句时不要忘记WHERE子句,UPDATE语句同理
语法较为简单
DELETE FROM products WHERE prod_desc IS NULL;
8.创建和操纵表
待更新。。。