原文:https://blog.csdn.net/weixin_42057767/article/details/82861873
1.数据查询
SELECT colName1,colName2,colName3,.. FROM tName [约束]
SELECT 选择查询列表 FROM 提供数据源(表、视图或者其他数据源)
//查询所有的列,显示顺序和创建表中的顺序一致
SELECT * FROM tName
=======================================
全列/投影查询
=======================================
练习
1,查询所有员工信息
select * from emp;
2,查询每个员工的编号、姓名、职位
select empno,ename,job form emp;
3,查询所有部门信息
select * from dept;
2.避免重读(去重)-DISTINCT
SELECT DISTINCT colName FROM tName
=======================================
消除重复
=======================================
distinct关键字可以用于一列,也可以用于多列
练习
1,查询所有有员工的部门编号
select distinct deptno from emp;
2,查询哪些部门和职位有员工
select distinct job,deptno from emp;
只有当job和deptno相同,才认为是重复的数据。
3.数据运算查询
对NUMBER类型,可以使用算术操作符创建表达式 (+ - * /)
对DATE类型,可以使用部分算术运算符创建表达式(+ -)
运算符优先级
1.先乘除后加减
2.同级运算符,从左到右
3.表达式中使用“括号”,可强行改变运算顺序
=======================================
算术操作符
=======================================
练习
1,查询所有员工的年薪
select ename,sal * 12 '年薪' from emp;
2,查询所有员工的年薪(使用别名)
3,查询每月都有500元的餐补和200元交通补助并且年底多发一个月工资的年薪
select ename,(sal + 500 + 200)*12+sal '年薪'from emp;
4,演示date类型数据的运算:查询员工的雇佣日期加上10
select DATE_ADD(hiredate,INTERVAL 10 DAY) from emp;
4.空值查询-IS NULL
WHERE colName IS NULL
=======================================
空值判断
=======================================
空值:
1、空值是指不可用、未分配的值,也就是没有值。
2、空值不等于零或空格
3、任意类型都可以支持空值,也就是说任何类型的字段都可以允许空值作为值的存在
*注意:包括空值的任何算术表达式都等于空
练习:
查询所有员工的年终奖((月薪+奖金)*12)
select ename,(IFNULL(comm,0)+sal)*12 '年薪' from emp ;
函数:IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2
使用IS NULL(IS NOT NUll)运算符
1,查询有奖金的员工信息
SELECT * from emp where comm is not NULL;
2,查询公司的老板
select * from emp where mgr is null;
5.where子句
使用WHERE子句限定返回的记录
SELECT colName1,colName2 FROM tName [WHERE 限制条件 AND/OR 限制条件2]
=======================================
限定查询
=======================================
注意:
1、字符串和日期要用单引号扩起来
2、数字类型直接书写
3、字符串是大小写不敏感的,日期值是格式敏感的
4、字符串敏感,需要添加binary关键字
练习
要求查询出基本工资高于1500的所有员工信息
select * from emp where sal >= 1500;
1,查询名字叫SCOTT的员工所从事的工作
select * from emp where ename = 'scott';
严格区分大小写,binary
select * from emp where binary ename = 'SCOTT';
2,查询1981年入职的员工信息.
select * from emp where hiredate between '1981-01-01' and '1981-12-31';
6.比较运算符(字符串类型和日期类型需要加上单引号)
>,<,>=,<=,=,!=(<>)
=======================================
比较运算符
=======================================
常用算术比较运算符:
1,=,!=,<>,>,>=,<,<=:等于和不等于
2,BETWEEN ... AND ...:在两值之间 (包含开始和结尾);
3,IN(list):匹配列出的值;
4,LIKE :匹配字符串模式;
5,IS NULL:是否为空;
练习:
使用比较运算符
1,查询1981年之后入职的员工信息
select * from emp where hiredate > '1981-12-31';
2,查询年薪小于3W的员工
select * from emp where (sal * 12) < 30000;
3,查询所有不是销售人员的员工信息
select * from emp where not job = 'salesman';
使用BETWEEN运算符
1,查询工资在2000-3000之间的员工信息
select * from emp where sal between 2000 and 3000;
2,查询工资不在2000-3000之间的员工信息
select * from emp where not sal between 2000 and 3000;
3,查询1981年入职的员工
select * from emp where hiredate between '1981-01-01' and '1981-12-31';
限制区分大小写,在WHERE子句后面加上BINARY(很少用)
7.集合查询
IN运算符,判断列的值是否在指定的集合中
WHERE colName in(value1,value2...)
1,查询工资为800或1600或3000的员工
select * from emp where sal in(800,1600,3000);
2,查询工资不为800或1600或3000的员工
select * from emp where not sal in(800,1600,3000);
8.模糊查詢
使用LIKE运算符执行通配符查询,查询条件可包含文字字符或数字, 使用LIKE运算符LIKE运算符必须使用通配符才有意义:
通配符:用来实现匹配部分值的特殊字符
匹配单个字符:_; -> 1个
匹配任意多个字符:%; -> 0个、1个、多个
=======================================
like运算符
=======================================
1.查询出所有雇员姓名是以A开头的全部雇员信息。
select * from emp where ename like 'A%';
2.查询出雇员姓名第二个字母是M的全部雇员信息。
select * from emp where ename like '_M%';
3.查询出雇员姓名任意位置上包含字母A的全部雇员信息。
select * from emp where ename like '%a%';
9.逻辑运算符
AND | 组合条件都是TRUE,返回TRUE |
OR | 一个条件为TRUE,返回TRUE |
NOT | 如果跟上的条件为TRUE,返回FALSE |
优先级 比较运算符>NOT>AND>OR
范围查询-BETWEEN minvalue AND maxvalue[闭区间范围]
使用between运算符显示某一值域范围内的记录,这个操作符最常见的使用在数字类型和日期类型数据的范围上,但对于字符类型和日期类型同样可用
select * from tName where colName between minvalue and maxvalue
=======================================
逻辑运算符
=======================================
AND:如果组合的条件都是true,返回true.
OR:如果组合的条件 之一是true,返回true.
NOT:如果下面的条件是false,返回true.
优先级规则: 比较运算符 > NOT > AND > OR
SQL的执行顺序是from-->where-->select-->ORDER BY
练习:
1,查询姓名中有e或者a的员工姓名
select * from emp where ename like '%e%' or ename like '%a%';
2,查询工资在1500~3000之间的全部员工信息
select * from emp where sal between 1500 and 3000;
3,查询出职位是办事员(CLERK)或者是销售人员(SALESMAN)的全部信息,并且工资在1000以上.
select * from emp where (job = 'CLERK'or job ='SALESMAN') and sal >= 1000;
10.结果排序
排序语法和规则
使用ORDER BY 子句将查询记录进行排序
ASC:升序,缺省
DESC:降序
ORDER BY 子句在SELECT子句的最后
按单列排序
SELECT * FROM tName ORDER BY colName [DESCASC]
按多列排序(先后)
SELECT * FROM tName ORDER BY colName1 [DESCASC],colName2 [DESCASC]
列的别名排序(别名使用单引号之后不能排序)
SELECT colName AS cn FROM tName ORDER BY cn [DESCASC]
SELECT colName AS 'c n' FROM tName ORDER BY 'c n' [DESCASC] FALSE
=======================================
结果排序
=======================================
使用ORDER BY 子句将记录排序
ASC: 升序,缺省
DESC: 降序
ORDER BY 子句出现在SELECT语句的最后
ORDER BY 可以使用别名
练习:
1,查询所有员工信息,按照工资排序
select * from emp order by sal ASC;
2,查询所有员工信息,按照年薪降序排序;
select ename,sal * 12 '年薪' from emp ORDER BY (sal * 12) DESC;
3,查询所有员工信息,按照部门和年薪降序排序;
select ename,deptno,sal * 12 '年薪' from emp ORDER BY deptno desc,sal * 12 ASC;
11.列別名
1.改变列的标题头
2.用于表示计算结果的含义
3.作为列的表名
4.如果别名中使用特殊字符,或者强制大小写敏感,或者有空格的时候,都需要加单引号(不建议使用列的别名使用单引号,因为一旦使用,该列不能排序)
5.as可以省略(不建议省略)
SELECT colName as newName FROM tName
MySQL查询函数
函数的分类:
1,单行函数:将每条数据进行独立的计算,然后每条数据得到一条结果。
2,多行函数:多条数据同时计算,最终得到一条结果数据。也成为聚集函数、分组函数, 主要用于完成一些统计功能。
聚合函数作用于一组数据,并且对一组数据返回一个值
统计结果记录数:COUNT
统计计算最大值:MAX
统计计算最小值:MIN
统计计算求和: SUM
统计计算平均值:AVG
SELECT AVG(colName1) FROM tName
SELECT COUNT(*)COUNT(id) FROM tName
=======================================
多行函数--->常用的统计函数
=======================================
分组函数在计算时省略列中的空值
不能在where语句中使用分组函数
查询所有员工每个月支付的平均工资及总工资
select AVG(sal),sum(sal) from emp;
查询月薪在2000以上的员工总人数.
select COUNT(*) from emp where sal > 2000;
查询员工最高工资和最低工资差距
select MAX(sal),MIN(sal) from emp;
1.字符函数
=======================================
单行函数--->字符函数
=======================================
(1).字符串大小写转换
LOWER(str):返回字符串str变为小写字母的字符
UPPER(str):返回字符串str变为大写字母的字符
--------------------------------------------------------
把HelloWorld转换为全大写,全小写.
select LOWER('HelloWorld');
select UPPER('HelloWorld');
(2).字符串拼接
CONCAT(str1,str2,...):
1,返回结果为连接参数产生的字符串。
2,如有任何一个参数为NULL ,则返回值为 NULL
3,允许有一个或多个参数
-------------------------------------------------------
1,查询所有员工的全名
select CONCAT('查询出',ename,'的全名') from emp;
2,查询得到输出结果:某某's'的月薪是:xx
select CONCAT(ename,'的月薪是',sal) from emp;
(3).查看字符串长度
CHAR_LENGTH:字符串长度;
LENGTH:字符串长度(单位为字节);
对比试验:
SELECT CHAR_LENGTH('龙哥17岁') FROM DUAL;
SELECT LENGTH('龙哥17岁') FROM DUAL;
(4).字符串填补
LPAD(str,len,padstr)
1,返回字符串str, 其左边由字符串padstr 填补到len字符长度。
2,假如str 的长度大于len, 则返回值被缩短至len 字符。
SELECT LPAD('ABC',7,'X'),LPAD('ABC',5,'X'),LPAD('ABC',3,'X'),LPAD('ABC',1,'X') FROM DUAL;
返回的结果是XXXXABC XXABC ABC A
RPAD(str,len,padstr)
1,返回字符串str, 其右边被字符串padstr填补至len 字符长度。
2,假如字符串str 的长度大于 len,则返回值被缩短到与len 字符相同长度。
(5).字符串去空格
LTRIM(str):左边空格被trim掉;
RTRIM(str):右边空格被trim掉;
TRIM(str)=LTRIM+RTRIM
TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str):高级用法,从str中按照指定方式截取remstr;
TRIM(remstr FROM] str):相当于TRIM(BOTH remstr FROM str);
SELECT LTRIM(' A B C '),RTRIM(' A B C '),TRIM(' A B C ') FROM DUAL;
返回的结果是 A B C_ _A B C A B C
(6).字符串替换
REPLACE(str,from_str,to_str):
1,在str中把from_str全部替换为to_str;
2,大小写敏感;
SELECT REPLACE('ABCDaBCABA','A','X') FROM DUAL;
XBCDaBCXBX
(7).字符串截取
SUBSTRING(str,pos):
从字符串str返回一个子字符串,起始于位置pos
SELECT SUBSTRING('asdfghijkl', 3); [0,3) dfghijkl
SUBSTRING(str,pos,len):
从字符串str返回一个长度同len字符相同的子字符串,起始于位置pos
SELECT SUBSTRING('asdfghjkl', 3, 2); df
如果pos是负数,从字符串尾部开始计算;
SELECT SUBSTRING('ABCDEF',-3),SUBSTRING('ABCDEF',-3,3) FROM DUAL;
def def
2.数字函数
=======================================
单行函数--->数字函数
=======================================
(1).取绝对值
ABS(x):返回一个数字的绝对值;
SELECT ABS(-17),ABS(17) FROM DUAL;
17 17
(2).取模
MOD(N,M):返回N 被 M除后的余数;
SELECT MOD(10,5),MOD(10,3) FROM DUAL;
0 1
(3).取天花板
CEIL(x):返回不小于X 的最小整数值;
SELECT CEIL(0.5),CEIL(-1.5),CEIL(1.5) FROM DUAL;
1 -1 2
(4).取地板
FLOOR(x):返回不大于X的最大整数值;
SELECT FLOOR(0.5),FLOOR(-1.5),FLOOR(1.5) FROM DUAL;
0 -2 1
(5).四舍五入
ROUND(X) /ROUND(X,D):
1,返回参数X, 其值接近于最近似的整数。
2,在有两个参数的情况下,返回X ,其值保留到小数点后D位,而第D位的保留方式为四舍五入。
3,若要接保留X值小数点左边的D 位,可将 D 设为负值。
select ROUND(1.5);
select ROUND(1.49);
SELECT ROUND(3.1465926,2); 3.15
SELECT ROUND(321.1415926,-2);
TRUNCATE(X,D)
(6).截去函数
1,返回被舍去至小数点后D位的数字X。
select TRUNCATE(3.1415926,2);
2,若D 的值为 0, 则结果不带有小数点或不带有小数部分。可以将D设为负数,若要截去(归零) X小数点左起 第D位开始后面所有低位的值.
select TRUNCATE(3.1415926,0);
select TRUNCATE(312.1415926,-1);
3.日期函数
=======================================
单行函数--->日期函数
=======================================
获取当前系统时间
select NOW();
DATE_ADD(date,INTERVAL expr type)/DATE_SUB(date,INTERVAL expr type)向日期添加指定的时间间隔
1,执行日期运算;
2,date 是一个 DATETIME 或DATE值,用来指定起始时间;
3,expr 是一个字符串表达式,用来指定从起始日期添加或减去的时间间隔值;
4,type 为关键词,它指示了表达式被解释的方式
SELECT DATE_ADD('2016-10-13',INTERVAL 22 DAY) FROM DUAL; 2016-11-4
SELECT DATE_ADD(NOW(),INTERVAL 100 DAY) FROM DUAL;
使用方法参考MYSQL 5.5中文参考手册547页;
--------------------------------------------------------------------------
type 参数可以是下列值:
Type 值
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
SELECT CURRENT_DATE(),CURRENT_TIME() FROM DUAL;
DATEDIFF(expr,expr2):返回起始时间expr和结束时间expr2之间的天数
SELECT DATEDIFF('2016-05-08','2016-11-04')'天数' FROM DUAL;
DAY(date):获取日期中的天数(DAYOFMONTH)
select DAY(NOW());
HOUR(time)
返回time 对应的小时数。对于日时值的返回值范围是从 0 到 23
select HOUR(NOW());
MINUTE(time)
返回 time 对应的分钟数,范围是从 0 到 59
select MINUTE(NOW());
MONTH(date)
返回date 对应的月份,范围时从 1 到 12。
select MONTH(NOW());
YEAR(date)
返回date 对应的年份,范围是从1000到9999。
select YEAR(NOW());
LAST_DAY(date)
获取一个日期或日期时间值,返回该月最后一天对应的值
select LAST_DAY(NOW());
UNIX_TIMESTAMP(date):它会将参数值以'1970-01-01 00:00:00' GMT后的秒数的形式返回
FROM_UNIXTIME(unix_timestamp) , FROM_UNIXTIME(unix_timestamp,format):返回'YYYY-MM-DD HH:MM:SS'或指定format的日期
SELECT UNIX_TIMESTAMP(NOW()) FROM DUAL;
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(NOW())) FROM DUAL;
4.转换
=======================================
单行函数--->转换函数
=======================================
FORMAT(X,D)
将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后D 位, 并将结果以字符串的形式返
回。若D 为 0, 则返回结果不带有小数点,或不含小数部分。
SELECT FORMAT(123456.789,2) FROM DUAL;
格式:DATE_FORMAT(date,format):把日期转换为字符串.
SELECT DATE_FORMAT(NOW(),'%Y-%m-%d') FROM DUAL;
STR_TO_DATE(str,format):把字符串转换为日期。
SELECT STR_TO_DATE('2015/11/29','%Y/%m/%d') FROM DUAL;
单行函数可被嵌入到任何层在嵌套的时候,最内层的函数最先被执行,执行的结果被传递到它的外层函数,作为参数使用,然后依次从内向外执行,直到所有的函数执行完。
MySQL的分页设计:
假分页(逻辑分页,内存分页):
一次性查询出所有的数据存放在内存中,每次翻页的时候,都从内存中取出
指定的条数
特点:翻页比较快,如果数据量过大,可能造成内存溢出,不推荐
真分页(物理分页,数据库分页)(推荐):
每次翻页都从数据库中截取指定的条数
假设每页十条数据,第一页0~9,第二页重新查询10~19条数据
特点:翻页比较慢,不会造成内存溢出
设计:
int pageSize=3:表示每页最多显示3条数据
第一页:SELECT * FROM tName LIMIT 0,3
第二页: 3,3
第三页: 6,3
分页查询结果集的SQL
SELECT * FROM tName LIMIT ?,?;
第一个?:(currentPage-1)*pageSize
第二个?:pageSize