目录
一、DQL - 基础查询
1.定义
2.语法
二、查询结果处理--函数
(一)单行函数
1.字符函数
2.逻辑处理
3.数学函数
4.日期函数
(二)分组函数 --(聚合函数/统计函数)
(三)条件查询
1.定义
2.语法
3.模糊查询
4.连接查询
(四)排序--默认升序(ASC)
1. DESC 降序
2. 多个排序条件,依次执行
3. 什么排序都没有,默认主键升序
(五)数量限制
1.limit子句:
(六)分组查询
1.语法
2.普通分组查询
3.分组前 / 后查询
前面我们学习了数据库及其表的创建删除修改数据操作,今天我将为大家介绍有关数据库查询的相关操作。
一、DQL - 基础查询
1.定义
DQL(Data Query Language)数据查询语言查询,是使用频率最高的一个操作,可以从一个表中
查询数据,也可以从多个表中查询数据。
2.语法
select 查询列表 from 表名
特点:查询列表可以是:表中的字段、常量、表达式、函数
查询的结果是一个虚拟的表格
这里我们以一个学生表为例
CREATE TABLE student (
num INT PRIMARY KEY AUTO_INCREMENT COMMENT '学号 主键',
NAME VARCHAR (10) NOT NULL COMMENT '姓名',
gender CHAR (1) NOT NULL DEFAULT '男' COMMENT '性别',
birthday DATE,
tel CHAR (11) NOT NULL UNIQUE,
address VARCHAR (30),
height DECIMAL (3, 2) CHECK (height < 2.13),
reg_time DATETIME
)
表的具体信息为:
(1)查询特定列:select column1,column2 from table
-- 查询学生学号,姓名,性别
SELECT num,NAME,gender FROM student
(2)查询所有列:select *from table
select *from student
(3)查询中的运算符:+ ,- ,* ,/ (只能做算术运算符,+ 号无法当做连接符使用)
-- 学生表学号列所有数据+100
select num+100 from student
(4)查询消重:查询出相同结果,利用distinct消除重复行
-- 消除查询出的数据中重复的行
SELECT DISTINCT NAME,gender,address FROM student
二、查询结果处理--函数
类似于java中的方法,将一组逻辑语句事先在数据库中定义好,可以直接调用
(一)单行函数
1.字符函数
-- length():获取参数值的字节个数
-- 查询学生表中姓名列各个名字字节长度
SELECT NAME,LENGTH(NAME)AS NAME,gender FROM student
-- char_length():获取参数值的字符个数
-- 查询学生表姓名列各个名字的字符长度
SELECT NAME,CHAR_LENGTH(NAME)AS NAME FROM student
-- concat(str1,str2,.....):拼接字符串
-- 用":"拼接学生表姓名和性别列的数据
SELECT num,CONCAT(NAME,':',gender)AS NAME FROM student
-- upper() / lower():将字符串变成大写/小写
-- 将姓名列数据的大小写转换
SELECT UPPER(NAME),LOWER(NAME) FROM student
-- substring(str,pos,length):截取字符串 位置从1开始
-- 截取字符串SELECT SUBSTRING(列名,起始位置,截取长度)
SELECT SUBSTRING(NAME,1,1) FROM student
-- instr(str,指定字符):返回子串第一次出现的索引,如果找不到返回0
-- 返回字符串中第一次出现该字符的位置,从1开始
SELECT INSTR(NAME,'张') FROM student
-- trim(str):去掉字符串前后的空格或子串,trim(指定子串 from 字符串)
SELECT NAME,CHAR_LENGTH(TRIM(NAME)) FROM student
-- lpad / rpad (str,length,填充字符):用指定的字符实现左 / 右 填充将str填充为指定长度
SELECT LPAD(NAME,5,'a') FROM student -- 左填充
SELECT RPAD(NAME,5,'a') FROM student -- 右填充
-- replace(str,old,new):替换,替换所有的子串
SELECT REPLACE(NAME,'张','找')FROM student
2.逻辑处理
-- case when 条件 then 结果1 else 结果2 end; 注:可以有多个when
-- 根据身高进行分类
SELECT height,(CASE WHEN height>=1.80 THEN '高个子' WHEN height>=1.75 THEN '正常身高' ELSE '矮个子' END)AS height FROM student
-- ifnull(被检测值,默认值)函数检测是否为null,如果为null,则返回指定的值,否则返回原本的值
-- 对表中值为null的数据重命名
SELECT NAME,IFNULL(address,'暂未录入')AS adddress FROM student
-- if函数:if else的 效果 if(条件,结果1,结果2)
-- 类似于三目表达式 b ? x : y
SELECT NAME,IF(height>=1.80,'高个子','正常身高')FROM student
3.数学函数
-- round(数值):四舍五入
SELECT NAME,ROUND(height)FROM student
-- ceil(数值):向上取整,返回>=该参数的最小整数
SELECT NAME,CEIL(height)FROM student
-- floor(数值):向下取整,返回<=该参数的最大整数
SELECT NAME,FLOOR(height)FROM student
-- truncate(数值,保留小数的位数):截断,小数点后截断到几位
SELECT NAME,TRUNCATE(height,1)FROM student
-- mod(被除数,除数):取余,被除数为正,则为正;被除数为负,则为负
SELECT NAME,MOD(num,3)FROM student
-- rand():获取随机数,返回0-1之间的小数
SELECT NAME,RAND()FROM student
4.日期函数
-- now(),打印当前 年-月-日 时-分-秒
-- CURDATE() 打印当前 年-月-日 CURTIME() 打印当前 时-分-秒
SELECT NAME,NOW(),CURDATE(),CURTIME() FROM student
-- 日期格式化
-- 将年月日格式化为三个字符
SELECT NAME,YEAR(reg_time),MONTH(reg_time),DAY(reg_time)FROM student
-- 字符串格式化为日期类型
SELECT STR_TO_DATE('2024-05-12','%Y-%m-%d')FROM student
-- 将日期格式化为指定字符串
SELECT DATE_FORMAT(birthday,'%Y-%m')FROM student
-- 计算两日期间相差天数
-- 计算从出生到现在的天数
SELECT DATEDIFF(NOW(),birthday)FROM student
(二)分组函数 --(聚合函数/统计函数)
-- sum 求和、avg 平均值、max 最大值、min 最小值、count 计数(非空)
-- sum,avg一般用于处理数值型max,min,count可以处理任何类型
SELECT SUM(num)FROM student
SELECT AVG(num) FROM student
SELECT MAX(height)FROM student
SELECT MIN(height)FROM student
-- count函数的一般使用count(*)用作统计行数
SELECT COUNT(*)FROM student
以上分组函数都忽略null值
SELECT COUNT(address)FROM student
上述学生表中地址列只有五个数据,所以count()函数结果为5
(三)条件查询
1.定义
使用WHERE 子句,将不满足条件的行过滤掉,WHERE 子句紧随 FROM 子句。
2.语法
select <结果> from <表名> where <条件>
-- 查找身高大于1.80 住址在汉中的学生信息
SELECT * FROM student WHERE height >= 1.80 AND address = '汉中' AND num <= 46
-- 查找身高大于1.70或者大于1.80的学生信息
SELECT *FROM student WHERE height >=1.70 OR height >=1.80
-- 不等于(!=或者<>)
SELECT *FROM student WHERE address != '汉中'
SELECT *FROM student WHERE address <> '汉中'
3.模糊查询
-- like %字符% ------ 要查字符串第几个字,其余字就要用%填充 通配符:%
--查询学生表中姓张的学生信息
SELECT *FROM student WHERE NAME LIKE '张%'
-- between and (两者之间,包含临界值) 相当于 条件一 and 条件二
SELECT *FROM student WHERE height >=1.70 AND height <=1.80
SELECT *FROM student WHERE height BETWEEN 1.70 AND 1.80
-- in() 判断某字段的值是否属于in列表中的某一项
-- 这里相当于相当于height = 1.75 or height = 1.86 or height = 1.88
SELECT *FROM student WHERE height IN(1.75,1.86,1.88)
4.连接查询
-- UNION 当使用 union 时,mysql 会把结果集中重复的记录删掉
-- 查询性别为男的学生姓名、性别和身高1.86的学生姓名、性别
SELECT NAME,gender FROM student WHERE gender = '男'
UNION
SELECT NAME,gender FROM student WHERE height = 1.86
UNION ALL 使用 union all ,mysql 会把所有的记录返回,且效率高于union
SELECT NAME,gender FROM student WHERE gender = '男'
UNION ALL
SELECT NAME,gender FROM student WHERE height = 1.86
(四)排序--默认升序(ASC)
-- ORDER BY 列信息 ASC(升序)
SELECT *FROM student ORDER BY height
1. DESC 降序
-- ORDER BY 列信息 DESC(降序)
SELECT *FROM student ORDER BY height DESC
2. 多个排序条件,依次执行
-- 先按生日降序排,生日相同时用身高升序排
SELECT *FROM student ORDER BY birthday DESC,height ASC
3. 什么排序都没有,默认主键升序
SELECT *FROM student
其结果和初始表一样:
(五)数量限制
1.limit子句:
特点:对查询的显示结果限制数目 (sql语句最末尾位置)
语法:limit 开始位置(开始位置为0),查询的数量
应用场景:用于网页物品分页,一次查询一部分数据,提高效率
-- 只查询出表格1、2行的信息
SELECT *FROM student LIMIT 0,2 -- n 表示当前页码
(六)分组查询
1.语法
group by 分组条件(列名),语句出现在sql语句末尾
2.普通分组查询
-- 查询表中不同性别的人总数
SELECT COUNT(*),gender FROM student GROUP BY gender
-- 查询表中不同性别的人身高的总和
SELECT SUM(height),gender FROM student GROUP BY gender
-- 查询表中同年出生的人
SELECT COUNT(*),YEAR(birthday) FROM student GROUP BY YEAR(birthday)
3.分组前 / 后查询
-- where 是对原始表中数据过滤,属于分组前查询
-- HAVING 在 group by 后使用,为分组的数据添加过滤条件
-- 分组统计名字数量,查询重复名字
SELECT COUNT(*)AS n,NAME FROM student GROUP BY NAME HAVING COUNT(*)>1