2.基础查询、条件查询、排序查询、常见函数(单行函数)

DQL:data query language 数据查询语言:select

一、基础查询

/*
语法:
use 指定库名;
select 查询列表
from 表名

特点:
1.查询列表可以是:表中的字段、常量值(字符型和日期型的常量必须用单引号引起来)、表达式、函数
2.查询的结果是一个虚拟的表格

*/
#1.查询表中的单个字段
#select last_name from employees;

#2.查询表中的多个字段
#select last_name,salary,email from employees;

#3.查询表中所有字段
#select * from employees;

#4.查询常量值
#select 100;
#select 'john';

#5.查询表达式
#select 100%98;

#6.查询函数
#select version();

#7.为字段起别名
/*
①便于理解
②如果要查询的字段有重名的情况,可以使用别名可以区分
*/
#方式一:使用as (当别名中有特殊符号时(空格、关键字等),最好用 as "别名")
#select 100%98 as 结果;
#方式二:使用空格
#select last_name 姓,first_name 名 from employees;

#8.去重 在字段前面加上关键字 distinct

#查询员工表中涉及的所有的部门编号
#select distinct department_id
#from employees

#9.+号的作用:运算符
/*
mysql中的+号:仅仅只有一个功能 :运算符

select 100+90; 两个操作数都为数值型,则做加法运算
select '123'+90; 其中一方为字符型,试图将字符型数值转换成数值型
                           如果转换成功,则继续做加法运算
select 'john'+90; 如果转换失败,则将字符型数值转换成0,在做加法运算
select null+10; 只要其中一方为null,则结果肯定为null
*/

#两个字段拼接 concat
#案例:查询员工名和姓连接成一个字段,并显示为 姓名
#select concat('a','b','c') as 结果;
SELECT CONCAT(last_name,first_name) AS 姓名
FROM employees;

#10.显示某个表的结构:DESC 表名

#11.判断某个字段是否为null :函数IFNULL(表的某个字段,返回值)
SELECT IFNULL(commission_pct,0) AS 奖金率 #如果有为null的值,则用0代替其值
FROM employees;

# isnull(字段) 判断字段值是否为null :如果为null返回1,不是null返回0

二、条件查询

/*
语法
select 查询列表
from 表名
where 筛选条件

分类:(筛选条件)
1.按条件表达式筛选
条件运算符:>、 <、 =、 !=、 <>(不等于)、<=、 >=

2.按逻辑表达式
作用:用于连接条件表达式
逻辑运算符:&& || !
                     and or not

3.模糊查询
like:特点:①一般和通配符搭配使用
                 通配符:% 任意多个字符,包含0个字符
                                _ 任意单个字符

between and 特点:①使用between and 可以提高语句的简洁度
                                 ②包含临界值
                                 ③临界值不能调换(>=左边值,<=右边值)

in :判断某字段的值是否属于in列表中的某一项
特点:①使用in提高语句简洁度
           ②in列表中的值类型必须一致或兼容
           ③列表中不支持通配符

is null 特点:!= 或<>不能用于判断null值
                     is null 或者 is not null可以判断null值
*/
#1.条件表达式筛选
#案例1:查询工资>12000的员工信息
SELECT *
FROM employees
WHERE salary >12000;

#2.逻辑表达式
#案例2:查询工资在10000和20000之间的员工信息
SELECT *
FROM employees
WHERE salary >10000 AND salary<20000;

#3.模糊查询
#案例3:查询员工名中包含字符a的员工信息
SELECT *
FROM employees
WHERE first_name LIKE '%a%';

#案例4.查询员工名中第二个字符为_的员工名
SELECT last_name
FROM employees
#where last_name like '_\_%';
#或者 :escape ‘符号’ 表明该符号为转义字符
WHERE last_name LIKE '_$_%' ESCAPE '$';

#案例5:查询员工编号在100和120之间的员工
SELECT *
FROM employees
WHERE employee_id >=100 AND employee_id<=120;
#-----------------------------------------------
SELECT *
FROM employees
WHERE employee_id BETWEEN 100 AND 120;

#案例6:查询员工的工种编号是IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
SELECT last_name,job_id
FROM employees
WHERE job_id ='IT_PROG' OR job_id='AD_VP' OR job_id='AD_PRES';
#------------------------------------------------------------
SELECT last_name,job_id
FROM employees
WHERE job_id IN('IT_PROG','AD_VP' ,'AD_PRES');

#案例7:查询没有奖金的员工名和奖金率
SELECT last_name,commission_pct
FROM employees
WHERE commission_pct IS NULL;

#安全等于 <=>
#案例8:查询没有奖金的员工名和奖金率 同案例7
SELECT last_name,commission_pct
FROM employees
WHERE commission_pct <=> NULL;

#案例9:查询工资=12000的员工信息
SELECT last_name,salary
FROM employees
WHERE salary <=>12000;

#is null 和 <=>
IS NULL:仅仅可以判断NULL值 可读性较高
<=>:既可以判断NULL值,又可以判断普通数值 可读性较低

 三、排序查询

/*
语法 select 查询列表
from 表
where 筛选条件
order by 排序列表字段 【asc 升序 | desc降序】默认为升序

特点;1.asc表示升序,desc表示降序 默认为asc
2.order by 子句中可以支持单个字段、多个字段、表达式、函数、别名
3.order by 子句一般放在查询的最后,limit子句除外

*/
#案例1:查询员工信息,要求工资从高到低排序
SELECT *
FROM employees
ORDER BY salary DESC;

#案例2:查询部门编号>=90的员工信息,按照入职时间的先后进行排序
SELECT *
FROM employees
WHERE department_id >=90
ORDER BY hiredate;

#案例3:按年薪的高低显示员工的信息和年薪 按表达式排序
SELECT *,salary*12*(1+IFNULL(commission_pct,0))
FROM employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0));

#案例4:按姓名的长度显示员工的姓名和工资【按函数排序】length
SELECT LENGTH(last_name) AS 字节长度,last_name,salary
FROM employees
ORDER BY 字节长度;

#案例5:查询员工信息,先按工资排序再按员工编号排序
SELECT *
FROM employees
ORDER BY salary ASC,employee_id DESC;

四、常见函数-单行函数
/*
调用:select 函数名(实参列表)【from 表】
特点:①叫什么(函数名)
           ②干什么(函数功能)

分类:①单行函数:
           如 concat、length、ifnull

           ②分组函数
           功能:做统计,又称为统计函数、聚合函数、组函数
*/

一、字符函数
#1.length 获取参数值的字节个数
SELECT LENGTH('john');
SELECT LENGTH('张三丰');

#2.concat 拼接字符串
SELECT CONCAT(last_name,'_',first_name) AS 姓名
FROM employees;

#3.upper、lower 大小写
SELECT UPPER('abcd');
SELECT LOWER('ssww');
#示例 将姓变成大写 名变成小写 然后拼接
SELECT CONCAT(UPPER(last_name),'_',LOWER(first_name))
FROM employees;

#4.substr 、substring 截取字符
#注意:索引都从1开始
#substr('字符',起始位置) 截取从指定索引处后面所有字符
SELECT SUBSTR('李莫愁大魔女',4) out_put ; #结果为大魔女
#substr('字符',起始位置,截取长度) 截取从指定索引处指定字符长度的字符
SELECT SUBSTR('李莫愁大魔女',1,3); #结果为 李莫愁

#示例 姓名中首字符大写,其他字符小写,然后用_拼接
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) out_put
FROM employees;

#5.instr 返回子串第一次出现的索引,如果没找到返回0
SELECT INSTR('张三和李四','李四') AS out_put;

#6.trim 默认为前后去掉空格 也可以去掉指定字符 前后
SELECT TRIM(' 张三 ') AS out_put; #结果为 张三
SELECT TRIM('a' FROM 'aaa张aaaaa三aaa') AS out_put; #结果为 张aaaaa三

#7.lpad 用指定的字符实现左填充指定长度 总长度为指定长度 超过指定长度 将右边字符截断丢弃
SELECT LPAD('李三',10,'a');

#8.rpad 用指定的字符实现右填充指定长度

#9.replace 替换
SELECT REPLACE('张三和李四','李四','王五');

#二、数学函数

#1.round 四舍五入 先将绝对值四舍五入再加上正负号
SELECT ROUND(1.65); #2
#小数点保留指定位数
SELECT ROUND(1.5678,2);#1.57

#2.ceil 向上取整,返回>=该参数的最小整数
SELECT CEIL(1.002);#2

#3.floor 向下取整,返回<=该参数的最大整数
SELECT FLOOR(-9.99); #-10

#4.truncate 截断
SELECT TRUNCATE(1.65,1); #1.6

#5.mod 取余 结果正负由被除数决定
SELECT MOD(10,3);

#三、日期函数
#1.now 返回当前系统日期+时间
SELECT NOW();

#2.curdate 返回当前系统日期,不包含时间
SELECT CURDATE();

#3.curtime 返回当前系统时间,不包含日期
SELECT CURTIME();

#可以获取指定的部分,年,月,日,小时,分钟,秒
SELECT YEAR(NOW()) AS 年;
SELECT YEAR('1998-1-1');

SELECT MONTH(NOW()) 月; #3
SELECT MONTHNAME(NOW()) 月;#March

#4.str_to_date 将字符通过指定的格式转换成日期
SELECT *
FROM employees
WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');

 

#5.data_format 将日期转换成字符
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日') AS out_put;

#四、其他函数
SELECT VERSION();
SELECT DATABASE();
SELECT USER();

#五.流程控制函数
#1.if函数 if else效果 类似于三元运算符 第一个表达式为true时,返回位置二,否则返回魏志三
SELECT IF(10 < 5,'大','小'); #小
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金','有奖金')
FROM employees;

#2.casr函数的使用一:switch case 的效果
/*
case 要判断的字段或表达式
when 常量1 then 要显示的值1(或语句1;)
when 常量2 then 要显示的值2(或语句2;)
……
else 要显示的值n(或者语句n;)
end
*/

/*案例:查询员工工资,要求
部门号=30,显示工资的1.1倍
部门号=30,显示工资的1.2倍
部门号=30,显示工资的1.3倍
其他部门,显示的工资为原工资
*/

SELECT salary AS 原始工资,department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工资
FROM employees;


#3.case 函数的使用二:类似于 多重if
/*
case
when 条件1 then 要显示的值1(或语句1;)
when 条件2 then 要显示的值2(或语句2;)
……
else 要显示的值(或语句2;)
end

*/
/*案例 查询员工工资
如果工资>20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示C级别
否则,显示D级别
*/
SELECT salary AS 原工资,
CASE
WHEN salary>20000 THEN 'A'
WHEN salary<20000 AND salary>15000 THEN 'B'
WHEN salary<15000 AND salary>10000 THEN 'C'
ELSE 'D'
END AS 等级
FROM employees;

TCL:transaction control language 事务控制语言

原文地址:https://www.cnblogs.com/sun1997/p/12550426.html