6.1.14逻辑条件
逻辑条件组合两个比较条件的结果来产生一个基于这些条件的单个的结果,或者逆转一个单个条件的结果。当所有条件的结果为真时,返回行。
SQL 的三个逻辑运算符是:
- AND
- OR
- NOT
可以在 WHERE 子句中用 AND 和 OR 运算符使用多个条件。
示例一:
查询 employees 表中雇员薪水是 8000 的并且名字中含有e 的雇员名字与薪水。
select last_name,salary from employees where salary = 8000 and last_name like '%e%';
6.1.15优先规则
6.1.16使用 ORDER BY 排序
在一个不明确的查询结果中排序返回的行。ORDER BY 子句用于排序。如果使用了 ORDER BY 子句,它必须位于 SQL 语句的最后。
SELECT 语句的执行顺序如下:
- FROM 子句
- WHERE 子句
- SELECT 子句
- ORDER BY 子句
示例一:
查询 employees 表中的所有雇员,显示他们的ID、名字与薪水,并按薪水升序排序。
1. select employee_id,last_name,salary from employees order by salary; 2. select employee_id,last_name,salary from employees order by salary asc;
使用别名排序
示例:
显示雇员ID,名字。计算雇员的年薪,年薪列别名为annsal,并对该列进行升序排序,
select employee_id,last_name ,12*salary annsal from employees order by annsal;
多列排序
示例:
以升叙排序显示 DEPARTMENT_ID 列,同时以降序排序显示 SALARY 列。
select department_id,salary from employees order by department_id asc ,salary desc;
6.1.17练习部分
1.创建一个查询,显示收入超过 12,000 的雇员的名字和薪水。
SELECT LAST_NAME ,SALARY FROM employees WHERE SALARY>12000;
2.创建一个查询,显示雇员号为 176 的雇员的名字和部门号。
select LAST_NAME,DEPARTMENT_ID from employees WHERE EMPLOYEE_ID = 176
3.显示所有薪水不在 5000 和 12000 之间的雇员的名字和薪水。
SELECT LAST_NAME ,SALARY from employees WHERE SALARY NOT BETWEEN 5000 AND 12000;
4.显示所有在部门 20 和 50 中的雇员的名字和部门号,并以名字按字母顺序排序。
1. SELECT LAST_NAME ,DEPARTMENT_ID from employees WHERE DEPARTMENT_ID IN 2. (20,50) ORDER BY LAST_NAME ASC;
5.列出收入在 5,000 和 12,000 之间,并且在部门 20 或50 工作的雇员的名字和薪水。将列标题分别显示为 Employee 和 Monthly Salary
1. SELECT LAST_NAME AS Employee,SALARY AS `Monthly Salary` FROM employees 2. WHERE SALARY BETWEEN 5000 AND 12000 AND DEPARTMENT_ID IN (20,50)
6.显示所有没有主管经理的雇员的名字和工作岗位。
SELECT LAST_NAME,JOB_ID FROM employees WHERE MANAGER_ID IS NULL;
7.显示所有有佣金的雇员的名字、薪水和佣金。以薪水和佣金的降序排序数据。
SELECT LAST_NAME,SALARY,COMMISSION_PCT*SALARY*12 FROM employees WHERE COMMISSION_PCT is not NULL ORDER BY SALARY DESC,COMMISSION_PCT DESC;
8.显示所有名字中有一个 a 和一个 e 的雇员的名字。
SELECT LAST_NAME FROM employees WHERE LAST_NAME LIKE '%a%e%' ;
9.显示所有工作岗位是销售代表(SA_REP)或者普通职员(ST_CLERK),并且薪水不等于 2,500、3,500 或 7,000 的雇员的名字、工作岗位和薪水。
SELECT LAST_NAME,JOB_ID,SALARY FROM employees WHERE JOB_ID IN ('SA_REP','ST_CLERK') AND SALARY NOT IN (2500,3500,7000);
七、MySQL函数
不同数据库对函数的实现时不同的,函数名也存在差异。
函数是 SQL 的一个非常强有力的特性,函数能够用于下面的目的:
- 执行数据计算
- 修改单个数据项
- 操纵输出进行行分组
- 格式化显示的日期和数字
- 转换列数据类型
SQL 函数有输入参数,并且总有一个返回值。
7.1 单行函数
7.1.1单行函数的分类
单行函数仅对单个行进行运算,并且每行返回一个结果。
常见的函数类型:
- 字符
- 数字
- 日期
- 转换
7.1.2字符函数
大小写处理函数
函数 | 描述 | 实例 |
LOWER(s)|LCASE(s) | 将字符串 s 转换为小写 | 将字符串 JAVA 转换为小写:
|
UPPER(s)|UCASE(s) | 将字符串s转换为大写 | 将字符串 java转换为大写:
|
示例:
显示雇员 Davies 的雇员号、姓名和部门号,将姓名转换为大写。
SELECT EMPLOYEE_ID,UPPER(LAST_NAME),DEPARTMENT_ID FROM employees WHERE LAST_NAME = "Davies";
默认情况下MySQL中where子句的字符串是不区分大小写的
字符处理函数
函数 | 描述 | 实例 |
length(s) | 返回字符串 s 的长度 | 返回字符串java的字符数
|
concat(s1,s2...sn) | 字符串 s1,s2 等多个字符串合并为一个字符串 | 合并多个字符串
|
lpad(s1,len,s2) | 在字符串 s1 的开始处填充字符串 s2,使字符串总长度达到 len | 将字符串 "哈" 填充到 mysql字符串的开始处:
|
ltrim(s) | 去掉字符串 s 开始处的空格 | 去掉字符串 Java开始处的空格:
|
replace(s,s1,s2) | 将字符串 s2 替代字符串 s 中的字符串 s1 | 将字符串 java中的字符 a 替换为字符 O:
|
reverse(s) | 将字符串s的顺序反过来 | 将字符串 java的顺序反过来:
|
rpad(s1,len,s2) | 在字符串 s1 的结尾处添加字符串 s2,使字符串的长度达到 len | 将字符串 "哈"填充到 Java字符串的结尾处: SELECT RPAD('Java',8,'哈'); ---Java哈哈哈哈 |
rtrim(s) | 去掉字符串 s 结尾处的空格 | 去掉字符串 java 的末尾空格:
|
substr(s, start, length) | 从字符串 s 的 start 位置截取长度为 length 的子字符串 | 从字符串 Java中的第 2 个位置截取 3个 字符:
|
substring(s, start, length) | 从字符串 s 的 start 位置截取长度为 length 的子字符串 | 从字符串 Java中的第 2 个位置截取 3个 字符:
|
trim(s) | 去掉字符串 s 开始和结尾处的空格 | 去掉字符串 java的首尾空格:
|
instr(s1,s2) | 获取s2在s1首次出现的位置 | SELECT instr('java', 'a');--2 |
7.1.3数字函数
函数名 | 描述 | 实例 |
ABS(x) | 返回 x 的绝对值 | 返回 -1 的绝对值:SELECT ABS(-1) -- 返回1 |
ACOS(x) | 求 x 的反余弦值(参数是弧度) | SELECT ACOS(0.25); |
ASIN(x) | 求反正弦值(参数是弧度) | SELECT ASIN(0.25); |
ATAN(x) | 求反正切值(参数是弧度) | SELECT ATAN(2.5); |
ATAN2(n, m) | 求反正切值(参数是弧度) | SELECT ATAN2(-0.8, 2); |
AVG(expression) | 返回一个表达式的平均值,expression 是一个字段 | 返回 Products 表中Price 字段的平均值:SELECT AVG(Price) AS AveragePrice FROM Products; |
CEIL(x) | 返回大于或等于 x 的最小整数 | SELECT CEIL(1.5) -- 返回2 |
CEILING(x) | 返回大于或等于 x 的最小整数 | SELECT CEILING(1.5); -- 返回2 |
COS(x) | 求余弦值(参数是弧度) | SELECT COS(2); |
COT(x) | 求余切值(参数是弧度) | SELECT COT(6); |
COUNT(expression) | 返回查询的记录总数,expression 参数是一个字段或者 * 号 | 返回 Products 表中 products 字段总共有多少条记录:SELECT COUNT(ProductID) AS NumberOfProducts FROM Products; |
DEGREES(x) | 将弧度转换为角度 | SELECT DEGREES(3.1415926535898) -- 180 |
n DIV m | 整除,n 为被除数,m 为除数 | 计算 10 除于 5:SELECT 10 DIV 5; -- 2 |
EXP(x) | 返回 e 的 x 次方 | 计算 e 的三次方:SELECT EXP(3) -- 20.085536923188 |
FLOOR(x) | 返回小于或等于 x 的最大整数 | 小于或等于 1.5 的整数:SELECT FLOOR(1.5) -- 返回1 |
GREATEST(expr1, expr2, expr3, ...) | 返回列表中的最大值 | 返回以下数字列表中的最大值:SELECT GREATEST(3, 12, 34, 8, 25); -- 34 返回以下字符串列表中的最大值:SELECT GREATEST("Google", "Runoob", "Apple"); -- Runoob |
LEAST(expr1, expr2, expr3, ...) | 返回列表中的最小值 | 返回以下数字列表中的最小值:SELECT LEAST(3, 12, 34, 8, 25); -- 3 返回以下字符串列表中的最小值:SELECT LEAST("Google", "Runoob", "Apple"); -- Apple |
LN | 返回数字的自然对数,以 e 为底。 | 返回 2 的自然对数:SELECT LN(2); -- 0.6931471805599453 |
LOG(x) 或 LOG(base, x) | 返回自然对数(以 e 为底的对数),如果带有 base 参数,则 base 为指定带底数。 | SELECT LOG(20.085536923188) -- 3 SELECT LOG(2, 4); -- 2 |
LOG10(x) | 返回以 10 为底的对数 | SELECT LOG10(100) -- 2 |
LOG2(x) | 返回以 2 为底的对数 | 返回以 2 为底 6 的对数:SELECT LOG2(6); -- 2.584962500721156 |
MAX(expression) | 返回字段 expression 中的最大值 | 返回数据表 Products 中字段 Price 的最大值:SELECT MAX(Price) AS LargestPrice FROM Products; |
MIN(expression) | 返回字段 expression 中的最小值 | 返回数据表 Products 中字段 Price 的最小值:SELECT MIN(Price) AS MinPrice FROM Products; |
MOD(x,y) | 返回 x 除以 y 以后的余数 | 5 除于 2 的余数:SELECT MOD(5,2) -- 1 |
PI() | 返回圆周率(3.141593) | SELECT PI() --3.141593 |
POW(x,y) | 返回 x 的 y 次方 | 2 的 3 次方:SELECT POW(2,3) -- 8 |
POWER(x,y) | 返回 x 的 y 次方 | 2 的 3 次方:SELECT POWER(2,3) -- 8 |
RADIANS(x) | 将角度转换为弧度 | 180 度转换为弧度:SELECT RADIANS(180) -- 3.1415926535898 |
RAND() | 返回 0 到 1 的随机数 | SELECT RAND() --0.93099315644334 |
ROUND(x) | 返回离 x 最近的整数 | SELECT ROUND(1.23456) --1 |
SIGN(x) | 返回 x 的符号,x 是负数、0、正数分别返回 -1、0 和 1 | SELECT SIGN(-10) -- (-1) |
SIN(x) | 求正弦值(参数是弧度) | SELECT SIN(RADIANS(30)) -- 0.5 |
SQRT(x) | 返回x的平方根 | 25 的平方根:SELECT SQRT(25) -- 5 |
SUM(expression) | 返回指定字段的总和 | 计算 OrderDetails 表中字段 Quantity 的总和:SELECT SUM(Quantity) AS TotalItemsOrdered FROM OrderDetails; |
TAN(x) | 求正切值(参数是弧度) | SELECT TAN(1.75); -- -5.52037992250933 |
TRUNCATE(x,y) | 返回数值 x 保留到小数点后 y 位的值(与 ROUND 最大的区别是不会进行四舍五入) | SELECT TRUNCATE(1.23456,3) -- 1.234 |
ROUND(column|expression, n) 函数
ROUND 函数四舍五入列、表达式或者 n 位小数的值。如果第二个参数是 0 或者缺少,值被四舍五入为整数。如果第二个参数是 2值被四舍五入为两位小数。如果第二个参数是–2,值被四舍五入到小数点左边两位。
SELECT ROUND(45.923,2), ROUND(45.923,0),ROUND(45.923,-1);-----45.92,46,50
TRUNCATE(column|expression,n) 函数
TRUNCATE函数的作用类似于 ROUND 函数。如果第二个参数是 0 或者缺少,值被截断为整数。如果第二个参数是 2,值被截断为两位小数。如果第二个参数是–2,值被截断到小数点左边两位。与 ROUND 最大的区别是不会进行四舍五入。
SELECT TRUNCATE(45.923,2);--45.92
使用MOD(m,n) 函数
MOD 函数找出m 除以n的余数。
7.1.4日期函数
在MySQL中允许直接使用字符串表示日期,但是要求字符串的日期格式必须为:‘YYYY-MM-DD HH:MI:SS’ 或者‘YYYY/MM/DD HH:MI:SS’;
函数名 | 描述 | 实例 |
CURDATE() | 返回当前日期 | SELECT CURDATE(); -> 2018-09-19 |
CURTIME() | 返回当前时间 | SELECT CURTIME(); -> 19:59:02 |
CURRENT_DATE() | 返回当前日期 | SELECT CURRENT_DATE(); -> 2018-09-19 |
CURRENT_TIME() | 返回当前时间 | SELECT CURRENT_TIME(); -> 19:59:02 |
DATE() | 从日期或日期时间表达式中提取日期值 | SELECT DATE("2017-06-15"); -> 2017-06-15 |
DATEDIFF(d1,d2) | 计算日期 d1->d2 之间相隔的天数 | SELECT DATEDIFF('2001-01-01','2001-02-02') -> -32 |
DAY(d) | 返回日期值 d 的日期部分 | SELECT DAY("2017-06-15"); -> 15 |
DAYNAME(d) | 返回日期 d 是星期几,如 Monday,Tuesday | SELECT DAYNAME('2011-11-11 11:11:11') ->Friday |
DAYOFMONTH(d) | 计算日期 d 是本月的第几天 | SELECT DAYOFMONTH('2011-11-11 11:11:11') ->11 |
DAYOFWEEK(d) | 日期 d 今天是星期几,1 星期日,2 星期一,以此类推 | SELECT DAYOFWEEK('2011-11-11 11:11:11') ->6 |
DAYOFYEAR(d) | 计算日期 d 是本年的第几天 | SELECT DAYOFYEAR('2011-11-11 11:11:11') ->315 |
HOUR(t) | 返回 t 中的小时值 | SELECT HOUR('1:2:3') -> 1 |
LAST_DAY(d) | 返回给给定日期的那一月份的最后一天 | SELECT LAST_DAY("2017-06-20"); -> 2017-06-30 |
MONTHNAME(d) | 返回日期当中的月份名称,如 November | SELECT MONTHNAME('2011-11-11 11:11:11') -> November |
MONTH(d) | 返回日期d中的月份值,1 到 12 | SELECT MONTH('2011-11-11 11:11:11') ->11 |
NOW() | 返回当前日期和时间 | SELECT NOW() -> 2018-09-19 20:57:43 |
SECOND(t) | 返回 t 中的秒钟值 | SELECT SECOND('1:2:3') -> 3 |
SYSDATE() | 返回当前日期和时间 | SELECT SYSDATE() -> 2018-09-19 20:57:43 |
TIMEDIFF(time1, time2) | 计算时间差值 | SELECT TIMEDIFF("13:10:11", "13:10:10"); -> 00:00:01 |
TO_DAYS(d) | 计算日期 d 距离 0000 年 1 月 1 日的天数 | SELECT TO_DAYS('0001-01-01 01:01:01') -> 366 |
WEEK(d) | 计算日期 d 是本年的第几个星期,范围是 0 到 53 | SELECT WEEK('2011-11-11 11:11:11') -> 45 |
WEEKDAY(d) | 日期 d 是星期几,0 表示星期一,1 表示星期二 | SELECT WEEKDAY("2017-06-15"); -> 3 |
WEEKOFYEAR(d) | 计算日期 d 是本年的第几个星期,范围是 0 到 53 | SELECT WEEKOFYEAR('2011-11-11 11:11:11') -> 45 |
YEAR(d) | 返回年份 | SELECT YEAR("2017-06-15"); -> 2017 |