SQL——DQL

SQL——DQL

DQL(Data Query Language)数据查询语言是使用评率最高的一个操作,可以从一个表中查询数据,可以从多个表中查询数据。

基础查询

语法:select 查询列表 from 表名;

特点:① 查询列表可以是表中的字段、常量、表达式、函数;②查询的结果是一个虚拟的表格。

-- 查询数据  
-- 查询所有的列 (一般不建议使用)
SELECT * FROM students;
-- 查询特定的列 
SELECT num,sname,gender FROM students;

查询列表是函数时:

函数:类似于java中的方法,提前将一组逻辑语句定义好,在每一条查询语句调用,提高代码利用率。

select 函数名(实参类表)from 表;

分类

单行函数:如concat、length、ifnull等

分组函数:用于统计,又称统计函数、聚合函数、组函数。

单行函数

字符函数

字符函数
length():获取参数值的字节个数;
char_length()获取参数值的字符个数;
concat(str1,str2,…):拼接字符串;
upper()/lower():将字符串变成大写/小写;
substring(str,pos,length):截取字符串 位置从1开始;
instr(str,指定字符):返回子串第一次出现的索引,如果找不到返回0;
trim(str):去掉字符串前后的空格或子串,trim(指定子串 from 字符串);
lpad(str,length,填充字符):用指定的字符实现左填充将str填充为指定长度;
rpad(str,length,填充字符):用指定的字符实现右填充将str填充为指定长度;
replace(str,old,new):替换,替换所有的子串。

-- 查询数据  
-- 查询所有的列 (一般不建议使用)
SELECT * FROM students;
-- 查询特定的列 
SELECT num,sname,gender FROM students;
-- length() 当前数据的字节数; as 后是为新的一列取的名字 as可以省略;
SELECT num,sname,LENGTH(sname)AS gg  FROM students;
-- char_length()获取当前值的字符数;
SELECT num,sname,CHAR_LENGTH(sname) FROM students;
-- concat()拼接字符串
SELECT num,sname,gender,CONCAT(sname ,':',gender) FROM students; 
-- + - * / 只能用在数字中字符串中不能使用
SELECT num,sname,height,height+5 FROM students;
-- upper()/low()将字符串全改为大写/小写
SELECT num,sname,UPPER(sname),LOWER(sname)FROM students;
-- substring(列,开始位置(从1开始),长度), 
SELECT num,sname ,SUBSTRING(num,1)FROM students;
-- instr 每一行中查询对应列中是否含有对应字符串,如果存在返回位置(从1开始),否则返回0,相当于java中的indexof
SELECT INSTR(sname,'五') FROM students;
-- trim()去除字符串前后空格,一直删除到两端没有空格
SELECT TRIM(' ahgh ')FROM students;
SELECT TRIM('a' FROM 'afuaaahjjggaa') FROM students;
SELECT TRIM('a' FROM 'afuaaaa') FROM students;
-- lpad(str,length,填充字符) 从左往右添加 用指定的字符实现左填充将str填充为指定长度
SELECT num,sname,LPAD(sname,7,'La')FROM students;
-- rpad(str,length,填充字符):从左往右添加  用指定的字符实现右填充将str填充为指定长度
SELECT num,sname,RPAD(sname,7,'La')FROM students;
-- replace(str,old,new):替换,替换所有的子串
SELECT num,REPLACE(addres,'北京','上海')FROM students ;
-- 去除查询列中相同的数据,(所有列都相同的才删除),
SELECT DISTINCT sname,gender FROM students;
逻辑处理

逻辑处理:
case when 条件 then 结果1 else 结果2 end; 可以有多个when;
ifnull(被检测值,默认值)函数检测是否为null,如果为null,则返回指定的值,否则返回原本的值;
if函数:if else的 效果 if(条件,结果1,结果2)。

-- case when 条件 then 结果1 else 结果2 end; 可以有多个when
SELECT (CASE WHEN height>=1.80 THEN '高个子' ELSE '非高个子'END)bijiao FROM students;

SELECT (CASE WHEN height>=1.80 THEN '高个子'
             WHEN height>=1.70 THEN '中等个子'
              ELSE '小个子'END)bijiao FROM students;
-- ifnull(被检测值,默认值)函数检测是否为null,如果为null,则返回指定的值,否则返回原本的值
SELECT sname,phone, IFNULL(phone,'未录入信息')FROM students;
-- if函数:if else的 效果 if(条件,结果1(条件成立),结果2(条件不成立))
SELECT num,sname,height,IF(height>=1.60,'还行','不行') FROM students;
数学函数

round(数值):四舍五入;
ceil(数值):向上取整,返回>=该参数的最小整数;
floor(数值):向下取整,返回<=该参数的最大整数;
truncate(数值,保留小数的位数):截断,小数点后截断到几位;
mod(被除数,除数):取余,被除数为正,则为正;被除数为负,则为负;
rand():获取随机数,返回0-1之间的小数。

-- round()四舍五入 
SELECT num, sname,height ,ROUND(height) gezi FROM students; 

-- ceil()向上取整
SELECT num, sname,height ,CEIL(height) FROM students; 
-- floor 向下取整
SELECT num, sname,height ,FLOOR(height) FROM students;
-- truncate(值,保留小数位数)
SELECT num, sname,height ,TRUNCATE(height,1) FROM students;
-- mod(被除数,除数):取余,被除数为正,则为正;被除数为负,则为负
SELECT num, sname,height ,MOD(height,1) FROM students;
-- rand()随机数
SELECT num,sname,height,FLOOR(RAND()*10) FROM students;

日期函数

now():返回当前系统日期+时间;
curdate():返回当前系统日期,不包含时间;
curtime():返回当前时间,不包含日期;
可以获取指定的部分,年、月、日、小时、分钟、秒;
YEAR(日期),MONTH(日期),DAY(日期) ,HOUR(日期) ,MINUTE(日期),SECOND(日期);
str_to_date:将日期转换成字符串;
date_format:将日期格式的字符转换成指定格式的日期;
datediff(big,small):返回两个日期相差的天;
%Y: 年(4位) %m: 月(00-12) %d: 月的天(00-31) %H: 小时(00-23) %i: 分钟(00-59);
%s: 秒(00-59) %f: 微妙 %T: 时间(hh:mm:ss) %j: 年的天(001-366) %w: 周的天(0=星期日)。

-- now()返回当前系统执行时间 年月日,时分秒
SELECT num, sname,height ,NOW() FROM students;
-- curdate()返回当前系统日期  年月日
SELECT num, sname,height ,CURDATE() FROM students;
-- curtime():返回当前时间,时分秒
SELECT num,sname,height,CURTIME() FROM students;
-- YEAR(日期),MONTH(日期),DAY(日期) ,HOUR(日期) ,MINUTE(日期),SECOND(日期)
SELECT YEAR('2020-12-22')FROM students;
SELECT MONTH('2020.12.22')FROM students;
SELECT DAY('2020-12-12')FROM students;
-- str_to_date:将日期转换成字符串
SELECT num, STR_TO_DATE('2001.01.03 16:35:48','%Y.%m.%d') FROM students;
-- date_format:将日期格式的字符转换成指定格式的日期
SELECT sname,DATE_FORMAT('2001-01-03','%Y年%m月%d日') FROM students;
-- datediff(big,small):返回两个日期相差的天
SELECT sname ,DATEDIFF(NOW(),'2022-1-1') FROM students;

分组函数

功能:用于统计使用,又被称为聚合函数、统计函数和组函数。

分类:sum 求和、avg 求平均值、max 最大值、min 最小值、count 计数(以上几种函数都忽略null)。

sum、avg一般处理的是数值型;

max、min、count可以处理任何类型;

count函数一般是使用count(*)统计行数;

注:和分组函数一同查询的字段要求是group by 后的字段。

-- count(),计数,推荐使用count(*),它统计的是最多的,如果单独使用某一列,
SELECT gender,COUNT(*) r FROM students  GROUP BY gender HAVING r>2;
-- 从students表中以性别分组并计算男女人数,男女生中最高的和最矮的
SELECT gender,COUNT(*),MAX(height),MIN(height), SUM(height),AVG(height)FROM students GROUP BY gender;
-- 对按照性别分组后取出人数多于3的那一种性别
SELECT gender,COUNT(*) g FROM students WHERE id>=1 GROUP BY gender HAVING g>=4

条件查询

使用where子句,将不满足条件的数据过滤掉,where语句紧随from子句。

​ 语法:select 结果 from 表名 where 条件

比较的符号:=、!=或<>、> 、<、>= 、<=

逻辑运算:and 与、or 或、not 非

模糊查询

like:是否匹配于一个模式 ,一般和通配符搭配使用,可以判断字符型数值或数值型.
通配符: % 任意多个字符,包含0个字符 _ 任意单个字符
between and 两者之间,包含临界值;
in 判断某字段的值是否属于in列表中的某一项;
IS NULL(为空的)或 IS NOT NULL(不为空的)。

SELECT * FROM students WHERE gender='男' AND height>=1.7;

SELECT * FROM students WHERE gender='男' OR height>=1.7;
-- in(条件,条件...)查询满足条件的结果
SELECT * FROM students WHERE id IN(2,5,3);
-- not in(条件,条件...)查询满足条件之外的的结果
SELECT * FROM students WHERE id NOT IN(2,5,3);
-- is null 为空  注意: 不能写为phone=null;
SELECT * FROM students WHERE phone IS NULL ;
-- is not null  不为空 
SELECT * FROM students WHERE phone IS NOT NULL;
-- 两种不同的表示区间的方法
SELECT * FROM students WHERE height>1.65 AND height<1.92;
SELECT * FROM students WHERE height BETWEEN  1.65 AND 1.92;
-- like 模糊查询 通配符: % 任意多个字符,包含0个字符   _ 任意单个字符
SELECT * FROM students WHERE sname LIKE'张%';#张后可以有多个字符
SELECT * FROM students WHERE sname LIKE'张_';#张后只能有一个字符
SELECT * FROM students WHERE num LIKE'%9%';#含有9的

-- union 是将两条语句的结果放在同一张表中,与union all不同的是: union可以自动删除两次查询中重复的结果
SELECT * FROM students WHERE gender='男'
UNION 
SELECT * FROM students

-- union all 与union相同都是将多条语句链接到一张表中 但是不能删除相同的结果 效率较高
SELECT * FROM students WHERE gender='男'
UNION ALL
SELECT * FROM students WHERE height>1.72
UNION ALL
SELECT * FROM students

-- 查询结果排序  order by 子句排序   order by 排序列 asc(升序) desc(降序)
SELECT sname,height FROM students ORDER BY height;
SELECT sname,height FROM students ORDER BY height DESC;

 -- 数量限制 limit子句:对查询的显示结果限制数目 (sql语句最末尾位置)
 -- limit(开始位置,显示数据个数);
 SELECT * FROM students LIMIT 0,3;

分组查询

语法:

select 分组函数,列(要求出现在group by 的后面)

from 表名

[where 筛选条件]

group by 分组的列

[having 分组后的筛选]

[order by 子句]

此语句执行的先后顺序是:找到表——>[where 筛选条件]——>group by 分组的列——>[having 分组后的筛选]——>[order by 子句]

由此执行顺序可以看出分组查询中的筛选条件分为两类:分组前和分组后

数据源关键词
分组前原始表where
分组后分组后表having
# 查询学生成绩表中学生的总成绩
SELECT stu_name , SUM(stu_score) FROM students_score GROUP BY stu_name 
# 查询学生成绩表中学生总成绩在300分以上的
 SELECT stu_name , SUM(stu_score) AS SUM FROM students_score GROUP BY stu_name HAVING SUM >300
 /* 注:这里不能使用where sum >300 因为执行where语句时的数据源是原始表*/

子查询

含义:出现在其他语句中的select语句,称为子查询或内查询语句;外部的查询语句称为主查询或者外查询。

简单理解子查询就是结果来自另一个select语句。

分类:

按照子查询出现的位置:

​ select后面:只支持标量子查询

​ from后面:支持表子查询

​ where 和 having后面:支持标量子查询、列子查询、行子查询。

按照功能、结果集的行列数不同:

​ 标量子查询(结果集只有一行一列)

​ 列子查询(结果集只有一列或者多列)

​ 行子查询(结果集有一行多列)(较少)

​ 表子查询(结果集一般为多行多列)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值