mysql学习笔记(2)——进阶查询

一、进阶查询语句

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 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容