一、进阶查询语句
1.排序查询
语法:
ORDER BY
SELECT 查询字段
FROM 表名
WHERE 筛选条件
ORDER BY 排序列表 【ASC/DESC】
特点:
1、从高到低:降序 DESC,从低到高:升序 ASC
如果默认不写关键字,默认是升序ASC
2、ORDER 可支持单个字段、多个字段、表达式、函数、别名
3、执行顺序一般放在查询语句的最后面,limit子句除外
1.查询员工信息,要求工资从高到低排序
SELECT * FROM mylist ORDER BY salary DESC
SELECT * FROM mylist ORDER BY salary ASC
2.查询员工编号>=2的员工信息,按照入职时间先后进行排序
SELECT * FROM mylist
WHERE id>=2
ORDER BY entrytime ASC
3.按照年薪高低显示员工信息与年薪(按照表达式从高到低排序)
SELECT *,salary*12*(1+ifnull(amount,0))AS 年薪
FROM mylist
ORDER BY salary*12*(1+ifnull(amount,0))DESC ;
4.按照年薪高低显示员工信息与年薪(按照别名排序)
SELECT *,salary*12*(1+IFNULL(amount,0)) AS 年薪
FROM mylist
ORDER BY 年薪
5.按照姓名长度显示员工id与工资(按函数排序)
SELECT LENGTH('mjy')
SELECT id,salary,length(nick_name),nick_name FROM mylist
ORDER BY length(nick_name) ASC
6.查询员工信息,先按照工资排序(升序),再按照id排序(降序)
SELECT * FROM mylist
ORDER BY salary asc ,id DESC
7.查询员工姓名,姓名字符长度,id,和年薪,按年薪降序,按姓名字符长度升序
SELECT nick_name ,id,length(nick_name),salary*12*(1+IFNULL(amount,0)) AS 年薪
FROM mylist
ORDER BY 年薪 DESC,length(nick_name) asc
8.查询工资不在8000-17000员工的姓名、工资,按照工资降序
SELECT nick_name,salary FROM mylist
WHERE NOT(salary>8000 and salary<17000)
ORDER BY salary DESC
SELECT nick_name,salary FROM mylist
WHERE salary NOT BETWEEN 8000 and 17000
ORDER BY salary DESC
9.查询email中包含4的员工信息,按邮箱字节数降序,按部门号升序
SELECT * ,LENGTH (email)
FROM mylist
WHERE email like '%4%'
order BY LENGTH (email) DESC ,id ASC
2.常见函数
1.字符函数
语法:SELECT 函数名(实参列表)FROM 表
特点:1.函数名 2.函数功能
一、单行函数(例如:concat,length,ifnull)
字符函数、数学函数、日期函数、其他函数、流程控制函数
一、字符函数
1.length :获取参数值字节长度
SELECT length('张三')
2.concat :拼接字符串
SELECT CONCAT(id,nick_name) FROM mylist
3.upper,lower
SELECT upper(nick_name) FROM mylist
SELECT lower(nick_name) FROM mylist
题目1.将姓大写,名小写,拼接
SELECT CONCAT( UPPER(last_name),lower(first_name)) 姓名 FROM mylist
4.substr
截取从指定索引处后面的索引字符
SELECT SUBSTR('gdasjhdsj',3) out_put;
SELECT SUBSTR('yueiwqwqo',1,2) out_put;
题目1.姓名首字母大写,其他字母小写,然后用_拼接,显示出来
SELECT CONCAT(UPPER(SUBSTR(nick_name,1,1)),'_',lower(SUBSTR(nick_name,2)))姓名
FROM mylist
5.instr 返回子串第一次出现的索引,如果找不到返回0
SELECT instr ('mysql','sl')
6.trim 去除前后空格或者字符
SELECT LENGTH (trim(' mysql ')) AS out_put
SELECT length(' mysql ') AS out_put
SELECT trim('a' from'aaaaamysqlaaaaaa') AS out_put
7.lpad 用指定的字符实现左填充指定长度
SELECT LPAD('mysql',4,'*')
8.rpad 用指定的字符实现右填充指定长度
SELECT rpad('mysql',15,'*')
9.raplace替换
SELECT REPLACE('mysql必知必会mysql','mysql','php')
2.数学函数
1.round 四舍五入
SELECT round(-1.3332)
SELECT round(-1.898780)
2.CEIL 向上取整
SELECT CEIL(-1.9332)
3.FLOOR 向下取整
SELECT FLOOR(-1.198780)
4.TRUNCATE截断 ,第二个参数含义是小数点保留到后几位
SELECT TRUNCATE(1.988989,4)
5.MOD 取余
SELECT MOD(10,-3)
SELECT 10%3
3.日期函数
1.now 返回当前系统日期+时间
SELECT now()
2.curdate 返回当前系统日期,不包含时间
SELECT curdate()
3.curtime 返回当前系统时间,不包含日期
SELECT CURTIME()
4.可以获取指定的部分,年月日、小时、分钟,秒
SELECT YEAR (now())
SELECT YEAR ('1998-1-1')年
SELECT YEAR (entrytime)年 FROM mylist
SELECT MONTH (now())月
SELECT MONTHNAME (now())月
SELECT * FROM mylist
5.str_to_date:将日期格式的字符转换为指定格式的日期
SELECT STR_TO_DATE('1998-3-2','%Y-%m-%d') AS out_put
查询入职日期为2013-09-01的员工信息
SELECT * FROM mylist
WHERE entrytime = STR_TO_DATE('9-1 2013','%m-%d %Y')
6.date_formate:将日期转换为字符
SELECT DATE_FORMAT(now(),'%Y年-%m月-%d日') AS out_put
7.查询有奖金的员工名和入职日期(XX年/XX月/XX日)
SELECT nick_name , DATE_FORMAT(entrytime,'%Y年/%m月/%d日'),amount FROM mylist
WHERE amount IS NOT null
四、其他函数
SELECT VERSION()
SELECT DATABASE()
SELECT USER ()
SELECT PASSWORD('字符')返回该字符的密码形势
md5('字符'):返回该字符的md5加密形势
五、流程控制函数
1.if函数:IF ELSE 的效果
SELECT IF(10>5,'大','小')
题目1:查询是否有奖金
SELECT nick_name,amount,if(amount IS null,'没奖金','有奖金')
FROM mylist
2.case函数 switch case的效果
语法:
CASE 要判断的字段或者表达式
WHEN 常量1 THEN 要显示的值1,或者语句1;
WHEN 常量2 THEN 要显示的值2,或者语句2;
...
esle 要显示的值 n或者语句n
END
题目1:查询员工的工资,要求
部门号=1,显示的工资为1.1倍
部门号=4,显示的工资为1.2倍
部门号=5,显示的工资为1.3倍
部门号=6,显示的工资为1.4倍
其他部门,显示的工资为原工资
SELECT salary ,id ,
CASE id
when id=1 THEN salary*1.1
when id=4 THEN salary*1.2
when id=5 THEN salary*1.3
when id=6 THEN salary*1.4
ELSE salary
END 工资倍数
FROM mylist
3.case函数的使用,类似于多重if
CASE
WHEN 条件1 THEN 要显示的值1或者语句1
WHEN 条件2 THEN 要显示的值2或者语句2
...
ELSE 要显示的值n或者语句n
END
题目1:查询员工工资情况,
如果工资>20000显示A级别,
如果工资>15000显示B级别,
如果工资>10000显示C级别,
否则显示D级别
SELECT nick_name,salary ,
CASE
WHEN salary>20000 THEN 'A '
WHEN salary>15000 THEN 'B '
WHEN salary>10000 THEN 'C '
ELSE 'D'
END 级别
FROM mylist
测试题:
1.显示系统时间
SELECT now()
2.查询员工号,姓名,工资,以及工资提高20%的结果(NEW salary)
SELECT id,nick_name,salary,salary*1.2 AS 'NEW salary'
FROM mylist
3.将员工姓名按首字母排序,写出姓名的长度
SELECT nick_name,LENGTH(nick_name) 长度,substr(nick_name,1,1) 首字符 FROM mylist
ORDER BY 首字符
4.做一个查询,产生下面的结果
nick_name,挣了,salary,monthly but wants,salary*3
老王挣了12000 monthly but wants36000
SELECT CONCAT(nick_name,'挣了',salary,'monthly but wants' ,salary *3)
FROM mylist m
5.使用case_when,按照下面条件
job_id grade
AD_vr A
IT_hah B
AD_tuy C
其他的返回 D
SELECT job_id ,
CASE
WHEN job_id= 'AD_vr'THEN 'A'
WHEN job_id= 'IT_hah' THEN 'B'
WHEN job_id= 'AD_tuy' THEN 'C'
ELSE 'D'
END
FROM mylist