MySQL学习笔记-02简单查询、单行函数

关于作者
金山老师:从事Java、大数据职业化培训6年,项目管理软件开发14年。欢迎添加我的微信号【jshand】


文章目录

  • MySQL简单查询
    • 排序
    • 限制查询条数
      • 分页的规则
      • limit分页
  • 单行函数
    • 数学函数
    • 字符串相关的函数
    • 日期相关的函数
    • 练习
    • 流程控制的函数其他函数
      • case when then
      • 其他单行函数

MySQL简单查询

排序

-- 排序
-- 升序(默认升序)
SELECT * FROM emp  ORDER BY  sal ASC
SELECT * FROM emp  ORDER BY  sal 
-- 降序
SELECT * FROM emp  ORDER BY  sal DESC;

-- 多列排序
SELECT empno ,ename ,sal FROM emp ORDER BY sal DESC, empno DESC 
SELECT empno ,ename ,sal FROM emp ORDER BY sal DESC, empno ASC  

-- 使用数字代替列明排序  列的序号 从1开始
SELECT   `ename`, `job`, `mgr`,  `hiredate`, `sal`,  `comm`, `deptno` 
FROM `emp` 
ORDER BY 1 DESC  

限制查询条数

-- limit 限制查询条数
-- 按照排序规则取前5条数据
-- limt count   默认start 0
-- limt start ,count  
SELECT * FROM emp 
SELECT * FROM emp  LIMIT 5;
SELECT * FROM emp  LIMIT 0,5;

SELECT * FROM emp  LIMIT 5,5

分页的规则

  • 总条数: total: 当前SQL下 能查询出多少个数据 select count(非空字段) from table
  • 每页显示条数:pageSize: 10、20、30、50、100
  • 当前页号:pageNo: 1、2、3 不能超过总页数
  • 总页数: pages = total %pageSize == 0?total/pageSize : (total/pageSize) +1
    • 例如 total : 50 ,pageSize:10 , pages : 5
    • total : 51 ,pageSize 10 , pages: 6

limit分页

pageSize: 5

pageNo: 1 SELECT * FROM emp LIMIT 5,5

推导limit分页sql过程

--	  		pageNo start  	pageSize  	start		 start : (pageNo-1) * pageSize
-- 查询	   1      	0	   		5 	   (1-1) *5	
-- 查询	   2      	5	   		5 	   (2-1) *5
-- 查询	   3      	10	   		5 	   (3-1) *5
SELECT * FROM emp  LIMIT 0,5
SELECT * FROM emp  LIMIT 5,5
SELECT * FROM emp  LIMIT 10,5

最终的sql语句

pageNo: 当前页号

pageSize: 每页显示条数

SELECT * FROM emp  LIMIT (pageNo-1) * pageSize  ,pageSize

单行函数

数学函数

ABS(x):返回x的绝对值;

SQRT(x):返回非负数x的平方根;

PI():返回圆周率;

MOD(x,y)或%:返回x被y除的余数;

CEIL(x)、CEILING(x):返回大于或者等于x的最小整数值;

FLOOR(x):返回小于或者等于x的最大整数值;

ROUND(x,y):返回保留小数点后面y位,四舍五入的整数;

TRUNCATE(x,y):返回被舍弃的小数点后y位的数字x;

RAND():每次产生不同的随机数;

SIGN(x):返回参数的符号;

POW(x,y)和POWER(x,y): 返回x的y次乘方的结果值;

EXP(x):返回以e为底的x乘方后的值;

LOG(x):返回x的自然对数,x相对于基数e的对数;

LOG10(x):返回x的基数为10的对数;

RADIANS(x):将参数x由角度转化为弧度;

DEGREES(x):将参数x由弧度转化为度。

SIN(x):返回x正弦,其中x为弧度值;

ASIN(x)返回x的反正弦,即正弦为x的值;

COS(x):返回x的余弦;

ACOS(x):返回x反余弦

TAN(x):返回x的正切;

ATAN(x)返回x的反正切;

字符串相关的函数

/***********************************************/
/****************字符串类函数***********************/
/***********************************************/
CHAR_LENGTH(str):返回字符串str的所包含字符个数;
LENGTH(str):返回字符串str的长度;
-- 中文字符,'中' 在utf8编码下 占三个字节
SELECT CHAR_LENGTH('abcdef') , LENGTH('abcdef') , CHAR_LENGTH('中国') , LENGTH('中国')

-- CONCAT(s1,s2,...): 字符串连接;
-- CONCAT_WS(x,s1,s2,…):字符串连接, x是其它参数的分隔符;
SELECT CONCAT_WS('-','你好','我是金山老师') he

-- INSERT(s1,x,len,s2) :返回字符串s1,s1中插入字符串s2;

SELECT INSERT('abcdef',1,2,'qwert')

-- LOWER (str)|LCASE (str):将字符串全部转换成小写字母;

-- UPPER(str)|UCASE(str):将字符串全部转换成大写字母;

SELECT 'Abc' ,UPPER('Abc') 全大写 ,LOWER('Abc') 全小写


-- LEFT(s,n):返回最左边指定长度的字符;
-- RIGHT(s,n):返回最右边指定长度的字符;
SELECT LEFT('abcdef',4),RIGHT('abcdef',4)

LPAD(s1,len,s2)| RPAD(s1,len,s2) :填充字符串函数;

SELECT LPAD('abc',10,'***');
SELECT  ename,LPAD(job,10,'*'),RPAD(job,10,'*') FROM emp 




-- TRIM(s1 FROM s)|LTRIM(s)|RTRIM(s):删除空格函数

SELECT 'abc' ,TRIM(' ab c '),LTRIM(' ab c ') ,RTRIM(' ab c ')




-- REPEAT(s,n):重复生成字符串函数;
SELECT REPEAT('hello ',3)


-- SPACE(n):返回一个由n个空格组成的字符串;
SELECT CONCAT('start' ,SPACE(5),'end')

-- REPLACE(s,s1,s2):字符串替换函数;
SELECT REPLACE('Hello','e','a')




-- STRCMP(s1,s2):比较字符串大小函数;
SELECT STRCMP('ab','b'), STRCMP('b','a') , STRCMP('a','a') 


-- SUBSTRING(s,n,len):获取子串函数;
SELECT 'hello imust' ,
SUBSTR('hello imust',6) ,
SUBSTR('hello imust',6,3),
SUBSTRING('hello imust',6) ,
SUBSTRING('hello imust',6,3),
SUBSTR('hello imust',-1) ,
SUBSTRING('hello imust',-1)


-- LOCATE(str1,str)|POSITION(str1 IN str)|INSTR(str, str1):匹配子串开始位置函数;
SELECT LOCATE('def','abcdef'),
POSITION('def' IN 'abcdef'),
INSTR('abcdef','def')


-- REVERSE(s):将字符串s反转;
SELECT 'olleh' ,REVERSE('olleh')

-- ELT(N,字符串1,字符串2,字符串3,…):返回指定位置函数;

SELECT 
	ELT(1 , '012' ,'abc','qqq'      ) elt1,
	ELT(2 , '012' ,'abc','qqq'      ) elt2,
	ELT(3 , '012' ,'abc','qqq'      ) elt3

日期相关的函数

format 规定日期/时间的输出格式,可以有下面的格式:

%a  缩写星期名 
%b  缩写月名 
%c  月,数值 
%D  带有英文前缀的月中的天 
%d  月的天,数值(00-31) 
%e  月的天,数值(0-31) 
%f  微秒 
%H  小时 (00-23) 
%h  小时 (01-12) 
%I  小时 (01-12) 
%i  分钟,数值(00-59) 
%j  年的天 (001-366) 
%k  小时 (0-23) 
%l  小时 (1-12) 
%M  月名 
%m  月,数值(00-12) 
%p  AM 或 PM 
%r  时间,12-小时(hh:mm:ss AM 或 PM) 
%S  秒(00-59) 
%s  秒(00-59) 
%T  时间, 24-小时 (hh:mm:ss) 
%U  周 (00-53) 星期日是一周的第一天 
%u  周 (00-53) 星期一是一周的第一天 
%V  周 (01-53) 星期日是一周的第一天,与 %X 使用 
%v  周 (01-53) 星期一是一周的第一天,与 %x 使用 
%W  星期名 
%w  周的天 (0=星期日, 6=星期六) 
%X  年,其中的星期日是周的第一天,4 位,与 %V 使用 
%x  年,其中的星期一是周的第一天,4 位,与 %v 使用 
%Y  年,4 位 
%y  年,2 位 
/***********************************************/
/****************日期类函数***********************/
/***********************************************/
-- CURDATE()和CURRENT_DATE() :获取当前日期函数;
-- NOW():返回服务器的当前日期和时间;
-- CURTIME():返回当前时间,只包含时分秒;

SELECT NOW() , CURDATE() ,CURTIME()
-- UTC_DATE():返回世界标准时间日期函数;
-- UTC_TIME():返回世界标准时间函数;


-- UTC_DATE
SELECT UTC_DATE() ,UTC_TIME() 

-- TIMEDIFF(expr1, expr2):返回两个日期相减相差的时间数;
-- DATEDIFF(expr1, expr2):返回两个日期相减相差的天数;

SELECT  DATEDIFF('2020-11-10','2020-10-10')
SELECT  TIMEDIFF('15:05:01','16:05:01')

-- DATE_ADD(date,INTERVAL expr type):日期加上一个时间间隔值;
-- select DATE_ADD(now(),'INTERVAL  1 Day')

SELECT NOW(), DATE_ADD(NOW(),INTERVAL 2 DAY) 2天后, DATE_ADD(NOW(),INTERVAL 2 YEAR) 2年后


-- DATE_FORMAT 
SELECT  DATE_FORMAT(NOW(),'%Y-%m-%d'),
DATE_FORMAT(NOW(),'%y-%m-%d'),
DATE_FORMAT(NOW(),'%y-%m-%e')

练习

/************************************/
/**************练习*********/
/************************************/
-- 练习: 字符串函数类

-- 显示所有员工姓名的前三个字符
SELECT ename ,SUBSTR(ename,1,3)  FROM emp 


-- 显示正好为5个字符的员工的姓名,工资,部门号
SELECT ename,sal,deptno, CHAR_LENGTH(ename) FROM emp WHERE  CHAR_LENGTH(ename) = 5


-- 写一个查询,用首字母大写,其它字母小写显示雇员的 ename,
-- 显示名字的长度,并给每列一个适当的标签,条件是满足所有雇员名字的开始字母是J、A 或 M 的雇员,
-- 并对查询结果按雇员的ename升序排序。(提示:使用length、substr)

SELECT  ename, 
	CONCAT(UCASE(SUBSTR(ename,1,1)) , LCASE(SUBSTR(ename,2))) dealname ,
	LENGTH(ename) 长度,
	UCASE(SUBSTR(ename,1,1)) 首字母,
	LCASE(SUBSTR(ename,2)) 其他的字母,
SUBSTR(ename,1,1) FROM emp  WHERE  UCASE(SUBSTR(ename,1,1)) IN ('J','A','M')
ORDER BY ename



-- 查询员工姓名中中包含大写或小写字母A的员工姓名。 显示所有员工的姓名,用"A"替换所有a
SELECT REPLACE(ename,'A','a') FROM emp  WHERE LCASE(ename) LIKE '%a%'


-- 查询部门编号为10或20,入职日期在81年5月1日之后,并且姓名中包含大写字母A的员工姓名,
-- 员工姓名长度
SELECT 
  ename,
  LENGTH(ename),
  hiredate ,
  LOCATE('A', ename)
FROM
  emp 
WHERE deptno IN (10, 20) 
  AND hiredate > '1981-05-01' 
  AND ename LIKE '%A%' 
  -- LOCATE('A', ename) > 0 


-- 查询每个职工的编号,姓名,工资 要求将查询到的数据按照一定的格式合并成一个字符串. 
-- 前10位:编号,不足部分用*填充,左对齐 中间10位:姓名,不足部分用*填充,左对齐 
-- 后10位:工资,不足部分用*填充,右对齐
SELECT 
 CONCAT(
RPAD(empno,10,'*') ,RPAD(ename,10,'*') ,LPAD(CONCAT(sal,''),10,'*') ) 薪资信息 FROM emp



流程控制的函数其他函数

case when then

第一种用法 case 字段 when 值1,,then value1

按照部门编号枚举出来 部门的名字

– 10 :销售部
– 20 :研发部
– 30 : 总裁办
– 其他 未知

 
 SELECT 
   ename , deptno,
    (  
     CASE deptno WHEN 10 THEN '销售部'
                 WHEN 20 THEN '研发部'
                 WHEN 30 THEN '总裁办'
                 ELSE '未知'
      END
    ) 部门
  FROM emp 

第二种情况

按照工资分别显示员工的薪酬档位

SELECT ename,sal,
      (CASE WHEN  sal>0 AND sal<1000 THEN '初级'
       WHEN  sal>=1000 AND sal<2000 THEN '中级'
       WHEN  sal>=2000 AND sal<3000 THEN '高级'
       ELSE  '股东'
   END ) 薪资档位
   FROM emp
   
SELECT ename,sal,
      (CASE WHEN  sal BETWEEN 0 AND 999   THEN '-初级'
       WHEN  sal BETWEEN 1000 AND 1999 THEN '-中级'
       WHEN  sal BETWEEN 2000 AND 2999 THEN '-中级'
       ELSE  '-股东'
   END ) 薪资档位
   FROM emp ORDER BY sal ASC

其他单行函数

-- 当前数据库的版本
SELECT VERSION() 

-- 当前使用的数据库
USE hisjava4
SELECT DATABASE()

-- 当前会话的用户 root@localhost
SELECT USER()

-- root/root@% 密码:  *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
-- *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
SELECT PASSWORD('root')

SELECT MD5('root+ASDFGHJK') 张三 ,MD5('root+WERTYUI')  李四
SELECT 
暴力破解:
root
63a9f0ea7bb98050796b649e85481845

root admin  qwerr 放到文本
 root  63a9f0ea7bb98050796b649e85481845
 admin 21232f297a57a5a743894a0e4a801fc3
 qwert a384b6463fc216a5f8ecb6670f86456a

你可能感兴趣的:(MySQL,mysql,学习,数据库)