Mysql查找语句

目录

  • 常用函数
    • case 函数
    • Between LIke in
    • ORDER BY 排序 / 分页
    • GROUP BY 分组、 HAVING 筛选
    • Limit 分页查询
  • 连接查询JOIN 七种用法
    • 内连接 Join
    • 外连接
    • 联合查询
    • 自连接
  • 子查询——嵌套查询
    • 子查询
    • (1) 关联子查询
    • (2) 标量子查询:一行一列
    • (3) 列子查询: 一列多行
    • (4) 行子查询: 一行多列
    • (5) 表子查询: 多行多列
    • (6) Exists子查询
  • Mysql 起别名
    • 聚合函数 avg
    • 数据函数(运算)
    • 字符串函数
    • 日期和时间函数


常用函数

	Count() :查某相同数据共有几行。    
	Sum() :求和。
	in() :查询相同值,括号中子查询结果=前面条件,则显示数据。
	
	Order By :默认升序 asc/desc.
	Group By : 分组查询(一对多)。     
	Having():筛选分组,类似where关键字,分组之后的条件筛选查询。
	limit 0,1 : (起始位置,查询总数)
	// 注意:group by必须在where之后,order by之前。
	WHERE id = #{id} GROUP BY id having id > 10 order by create_time desc 
	
	Avg() :平均值
    注意 AVG 计算平均分时,缺少一个字段数据,则会被忽略,导致计算不正确。
     
	Max() : 某字段列中最大值        Min() :某字段列中最小值
    Concat() :合并字符串
    DISTINCT : 去重

例:SELECT a.id, a.name FROM A as a JOIN B ON a.id = b.id
【外连接】
	A表outer join B表 ON a.id = b.id (查询出两表并集)
	
【左外连接】 A表 Left join B表 ON 条件(左表 + 并集部分)
【右外连接】 A表 Right join B表 ON 条件 (右表 + 并集部分)

-- 1.查询"1001"课程 比 "1002"课程成绩高的所有学生的学号及姓名。--
	SELECT id AS '学号', `name` AS '姓名'
	FROM student WHERE id IN (
		SELECT a.s_id FROM 
			(SELECT s_id, score FROM grade WHERE c_id = 1001) a,
			(SELECT s_id, score FROM grade WHERE c_id = 1002) b
		WHERE a.score > b.score
		AND a.s_id = b.s_id
	)

EXISTS 检查子查询

select 字段名 from 表名1 where
   exists ( select * from 表名2  where1.id =2.id) ;
/* 
关键字EXISTS:构造子查询,子查询是否返回结果集,返回则才进行外层查询。

如果子查询的结果集不为空,则EXISTS返回的结果为TRUE,此时外层查询语句将进行查询;
如果子查询的结果集为空,则EXISTS返回的结果为FLASE,此时外层查询语句将不进行查询;
*/
-- 6.查询学过"1001"并且也学过编号"1004"课程的同学的学号、姓名;--
SELECT s.id, s.`name` FROM student s, grade g
WHERE g.s_id = s.id
AND g.c_id = 1001
AND EXISTS (
	SELECT * FROM GRADE WHERE s_id = s.id
	AND c_id = 1004
);

 group_concat() 
/*
* 函数:group_concat
* 作用:函数返回一个字符串结果,该结果由分组中的值连接组合而成。(一列多行数据,在一行显示。)
* group_concat( [DISTINCT] 连接字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] ) 
*/
select group_concat(stu.s_name)AS '姓名' from student stu 

BETWEEN ... AND
/*
* 函数 BETWEEN ... AND 取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。
*/
SELECT * FROM student WHERE s_birth BETWEEN '1990-1-1' AND '1990-12-31';
TIMESTAMPDIFF() 函数:计算两个日期的时间差
CURDATE() 函数:返回当前的日期

语法结构  TIMESTAMPDIFF (unit, datetime_expr1, datetime_expr2)
参数说明:
unit: 日期比较返回的时间差单位,常用可选值如下:
SECOND:秒    MINUTE:分钟   HOUR:小时
DAY:天       WEEK:星期     MONTH:月
QUARTER:季度
YEAR:年

datetime_expr1: 要比较的日期1    datetime_expr2: 要比较的日期2
TIMESTAMPDIFF函数
         返回datetime_expr2 - datetime_expr1的结果,
         其中datetime_expr1和datetime_expr2可以是DATE或DATETIME类型值

round函数:用于数据的四舍五入
datediff() 函数:返回两个日期之间的天数。
curdate() 返回:当前的日期

SELECT s_id, s_name, ROUND(DATEDIFF(CURDATE(), s_birth)/365.2422) FROM student


CURRENT_DATE:返回此时区的当前本地日期
select s_id, s_name, year(current_date()) - year(s_birth) as age from student;
         
原文链接:https://blog.csdn.net/Hudas/article/details/124351790

case 函数

SELECT
   COUNT( CASE WHEN `status` = '0' THEN 1 ELSE NULL END ) AS 创建, 
   COUNT( CASE WHEN `status` = '1' THEN 1 ELSE NULL END ) AS 待付款,
   COUNT( CASE WHEN `status` = '2' THEN 1 ELSE NULL END ) AS 待发货,
   COUNT( CASE WHEN `status` = '3' THEN 1 ELSE NULL END ) AS 待收货
FROM
   `order`;
   
// 原文链接:https://blog.csdn.net/JonLoveJane/article/details/110672027

Between LIke in

DISTINCT 去重

DISTINCT : 作用是对表中的单个字段或多个字段去重操作

// 对多个字段进行去重操作
	SELECT distinct 字段, 字段 FROM 表名

运算符: between (…之…间) ​ in (查找相同值) is not null (判空null)

-- between 查询某到某之间的数据
Select * from user where id Between 20 and 25
Select * from user where id>=20 and id<= 25;

IN  
-- 12、查询至少有一门课与学号为"01"的同学所学相同的同学的信息 
/**
* 关键字 DISTINCT 去重
*/
SELECT DISTINCT stu.s_id, stu.s_name FROM student stu, score sc
WHERE stu.s_id = sc.s_id
AND sc.c_id IN (
	SELECT c_id FROM score WHERE s_id = '1'
)

查找id=20 or id=22
SELECT *FROM user where id in20,22SELECT *FROM user where id=20 OR id=22  两语句查询结果相同

-- is not null 判读有无空值
select * from user where pass is not null; 判断pass密码中有无空值

模糊查询 like

-- 查询姓刘的同学的学号及姓名
-- like结合使用的通配符 : % (代表0到任意个字符) _ (一个字符)
SELECT studentno,studentname FROM student
WHERE studentname LIKE '刘%';

-- 查询姓刘的同学,后面只有一个字的
WHERE studentname LIKE '刘_';

-- 查询姓刘的同学,后面只有两个字的
WHERE studentname LIKE '刘__';

-- 查询姓名中含有 嘉 字的
WHERE studentname LIKE '%嘉%';

-- 查询姓名中含有特殊字符的需要使用转义符号 '\'
-- 自定义转义符关键字: ESCAPE ':'

%(百分号) : 表示任意字符(任意类型 和 长度)。

​ N% : 查询以 N 开头的任意类型的值。
​ %N : 查询 以 N 为结尾的 任意类型的值。
​ %N% : 查询包含N的 任意类型的值

_ (下划线):查询一个任意字符,。(用于限制表达式中的字符长度)

​ N_ :查询以N开头,其它任意的两个字符。
​ _N :查询以N结尾 ,其它任意的两个字符。
​ _N :两条下划线,表示以N结尾的,其它任意的三个字符
​ N_M
:查询第一位为N,第三位为M,其它任意的四个字符。

NULL

-- =============================================
-- 查询出生日期没有填写的同学
-- 不能直接写=NULL , 这是代表错误的 , 用 is null
SELECT studentname FROM student
WHERE BornDate IS NULL;
WHERE BornDate IS NOT NULL;

-- 查询没有写家庭住址的同学(空字符串不等于null)
SELECT studentname FROM student
WHERE Address='' OR Address IS NULL;

ORDER BY 排序 / 分页

order by :排序。 升ASC / DESC

-- 按照id进行降序 asc (升) / desc (降)
	SELECT * FROM user ORDER BY id DESC;   

============== 分页 ================
语法 : SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

推导:
   第一页 : limit 0,5
   第二页 : limit 5,5
   第三页 : limit 10,5
   ......
   第N页 : limit (页数-1)*页面显示数 , 页面显示数
   [ pageNo:页码,pageSize:单页面显示条数 ]

GROUP BY 分组、 HAVING 筛选

group by : 分组查询(一对多)

注意: group by必须在where之后,order by之前。

根据某一列分组,这一列应该在查询的列中一起查询出来;
做分组查询时,查询的列不要使用,应查询具体的列名

-- 统计每个学生的总分
   select `name`, english+chinese+math AS '总分' 
   from student GROUP BY `name`;

HAVING 筛选查询

​ 类似where关键字,分组之后的条件筛选查询。​

-- 查询班级总分大于500的班级 
   select class, sum(chinese+math+english) AS '总分' 
   from student 
   group by class having 总分> 500;

Limit 分页查询

Limit 分页查询

	Limit m, n:从0号数据开始查询,共查询出n条数据。
	例:查90-100中共10条数据:
		select * from user Limit 89,10;

	M: 从m+1行开始 (初始值0)N:要查询的行数
	-- Limit 从0开始返回两条数据
		select * from user limit Limit 2; 
	-- 从id=4开始返回三条数据
		select * from user limit Limit 3,3;

连接查询JOIN 七种用法

内连接 Join

【内连接】 A表 inner join B表 ON a.id = b.id 
简写:select 字段 from A, B where A.id = B.id
特点:取两张表并集部分,以A表为基准,B表该字段没有值,用NULL值填充。

隐式内连接:

显示内连接:

外连接

外连接:左外连接 右外连接
左外连接:以左表为主,显示左表的全部信息,右表显示满足where条件的信息,如果右表没有左表对应的信息,会以NULL值填充。

MySQL不支持完全外连接。 outer join ( mysql不支持 )

外连接:左外连接 右外连接

例:SELECT a.id, a.name FROM A as a JOIN B ON a.id = b.id
【外连接】不支持这种查询,A表outer join B表 ON a.id = b.id (查询出两表并集)

【左外连接】 A表 Left join B表 ON a.id = b.id (左表 + 并集部分)
【右外连接】 A表 Right join B表 ON a.id = b.id (右表 + 并集部分)

联合查询

前提条件:两表查询字段列数必须一样,列名可以不一致,显示以第一个查询语句列名为准。

联合查询 union

特点:两次查询结果合并起来,去掉重复行数据。

 
【联合查询】
	select 字段 from A表 union select 字段 from B表 

	unionunion All 区别?
	union all:结果允许查询出两表重复数据,不排序,效率高于union

自连接

自连接:不属于连接类型,只是一种用法;

/*
* 核心思想:把一张表看成两张一模一样的表,然后将这两张表连接查询(自连接)
*/
	SELECT a.name AS '父栏目', b.name AS '子栏目'
	FROM student AS a, student AS b
	WHERE a.id =b.id

子查询——嵌套查询

子查询

什么是子查询?
在查询语句中的WHERE条件子句中,又嵌套了另一个查询语句
​ 子查询返回的结果一般都是集合,故而建议使用IN关键字;

/*============== 子查询 ================
*/
-- 使用子查询(执行顺序:由里及外)
	SELECT * FROM 表名
		WHERE subjectno=(
   			SELECT * FROMWHERE 条件
		)
	ORDER BY 字段 DESC;

-- 子查询
	SELECT * FROM 表名
	WHERE 字段 >= 100 AND subjectno=(
   		SELECT * FROMWHERE 条件
	)

(1) 关联子查询

在细分的组内进行比较时,可以使用关联子查询。关联子查询起关键作用的是子查询语句中的where子句。

// 查找每个课程中大于对应课程平均成绩的学生

SELECT 学号,课程号,成绩
FROM score AS s1
WHERE 成绩 > ( SELECT AVG(成绩) FROM score AS s2
            WHERE s1.课程号=s2.课程号 );
            
执行顺序:先执行外层查询,再查询内层子查询。

(2) 标量子查询:一行一列

什么时候用标量子查询:当我们需要单一值的时候。
注意事项:不能返回多行结果。

标量子查询必须且只能返回一行一列的结果。返回单一的值。所以可以和比较运算符一起使用。

SELECT 学号, 成绩 FROM score
WHERE 成绩 > ( SELECT AVG(成绩) FROM score );

标量子查询:不局限在where查询语句中,通常任何可以使用单一值的位置都可以使用。

标量子查询用在select子句中

查询学号、成绩和平均成绩

SELECT 学号,成绩,
	(SELECT AVG(成绩) FROM score) AS '平均成绩'
FROM score;

标量子查询用在having子句中

// 查询成绩大于平均成绩的学生
SELECT 学号,课程号,成绩 FROM score
GROUP BY 课程号 
HAVING AVG(成绩) > (SELECT AVG(成绩) FROM score);

(3) 列子查询: 一列多行

​ 返回的结果是一列(一列多行);不能直接使用运算符

运算符和 any 、all 一起使用,或者使用 in 。

​ >any: 大于最小的

​ >all: 大于最大的

​ <>all=not in

-- 一列多行
SELECT * FROM student WHERE sname in(
    SELECT sname FROM student WHERE ssex='男'
);

(4) 行子查询: 一行多列

​ 返回的结果是一行(一行多列)

select YEAR(sbirthday), class from student where sno='101'

(5) 表子查询: 多行多列

返回的结果是多行多列(多行多列)

select * from student where(YEAR(sbirthday),class) in (
        select YEAR(sbirthday) , class From student where ssex='女'
     )

(6) Exists子查询

返回的结果1或者0(类似布尔操作)

Mysql 起别名

AS 关键字 给表起别名建议:空格 + 别名。

-- 使用as也可以为表取别名
SELECT studentno AS 学号 FROM student stu;

-- CONCAT():拼接字符串
SELECT CONCAT('姓名:',studentname) AS 新姓名 FROM student;

聚合函数 avg

注意: where子句中不能出现聚合函数
原因:因为聚集函数要对全列数据时行计算,因而使用它的前提是:结果集已经确定!而where子句还处于“确定”结果集的过程中,因而不能使用聚集函数。

Avg():返回某一列的平均值

Sum():返回某一列的值,相加的结果

Count():返回某一列的总行数

Count(*):统计人数,不计入null值。

Count(列名):计入null值 某一列总行数

数据函数(运算)

abs() :绝对值函数 SELECT ABS ( -5 ) == 5

ceil() :天花板函数 , 有小数 进1。 SELECT CELL(13.1) == 14;

Floor() : 地板函数,有小数 向下取整。 SELECT CELL(13.9) == 13;

Exp(e) :自然对数 e 为底的 X次方。

Mod():取余 SELECT MOD( 9 , 2 ) == 1;

Round(x,y) :返回x 四舍五入 保留Y位小数 SELECT ROUND (3.1415) == 3 ;

​ SELECT ROUND (3.1415 , 2) == 3.14 (保留两位小数)

Truncate(x,y):截取x,保留y位小数

Sqrt(x): 返回x的根号3次方

字符串函数

group_concat:字段值在同一行打印出来,逗号分隔(默认)

Concat(m,n):连接字符串

Trim():取出字符串两头的空格

Length():字符串长度

Replace(): 替换

Substr():截取字符串

Lower():将大写转化成小写

Upper():将小写转化成大写

日期和时间函数

current_timestamp: 获得当前时间戳函数:

Now():返回当前日期+时间

Curdate():返回日期

Curtime():返回时间

Date_add(date,interval x unit) 返回date加上x后的日期

Date_sub(date,interval x unit) 返回date减去x后的日期

Datediff(d1,d2):计算两个日期之间的天数

Day() 获取指定日期的天(日)

Week() 获取指定日期的多少周

Year()获取时间的年份

Month()获取时间的月份

Dayofweek():返回日期中一周中第几天

Dayofmonth():返回一月中第几天

Dayofyear():返回一年中第几天

Date_format(date,format):按照格式转化日期

SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')   -- 截取到当前年

日期格式:

%a:缩写星期名

%b:缩写月名

%c:月(数值)

%d:日,数值(00-31);

%e:日,数值(0-31);

%f:微妙

%H:小时(00-23)

%h:小时(01-12)

%i:分钟(00-59)

%j:年的天(001-366)

%k:小时(0-23)

%M:月名

%m:月,数值(00-12)

%p:AM或者PM

%S:秒(00-59)

%s:秒(00-59)

%T:时间 24小时(hh:mm:ss)

%W:星期名

%Y:年(4位)

%y:年(2位)

你可能感兴趣的:(mysql,数据库,sql)