【11】查询

1. 查询语法

SELECT [ALL | DISTINCT | DISTINCTROW ]
    列1, 列2, 列3
    FROM 表名
    WHERE 查询条件
    [GROUP BY col_name]
    [HAVING where_definition]
    [ORDER BY col_name [ASC | DESC]]
    [LIMIT {[offset,] row_count | row_count OFFSET offset}]

2. 查询示例

2.1 查询全部

    SELECT * FROM Student;

2.2 查询部分列

    SELECT Stu_No,Stu_Name FROM Student;

2.3 查询结果起别名(as)

    SELECT Stu_No AS 学号,Stu_Name 姓名 FROM Student;

2.4 查询条件(where)

    SELECT * FROM Student WHERE Stu_Age > 20;
    SELECT * FROM Student WHERE Stu_Birthday BETWEEN '1996-10-1' AND '1997-3-1';
    SELECT * FROM Student WHERE Grade_Id IS NULL;
    SELECT * FROM Student WHERE Stu_Age > 20 AND Stu_Sex = '男';
    SELECT * FROM Student WHERE Stu_No = 1;

2.5 限定行数 – MySQL

    SELECT * FROM Student LIMIT 0,4; -- 查询 编号大于0 的 4 条记录
    SELECT * FROM Student LIMIT 4,2; -- 查询 编号大于4 的 2 条记录

2.6 查询结果排序(order by)

  • desc 降序排列
  • asc 升序排列(默认)
	SELECT * FROM Student ORDER BY Stu_Birthday DESC;

2.7 模糊查询(只能对字符串类型的列进行查询)

  • % 任意长度的字符
  • _ 一个长度的字符
	SELECT * FROM Student WHERE Stu_Name LIKE '%张%';
	SELECT * FROM Student WHERE Stu_Name LIKE '张%';
	SELECT * FROM Student WHERE Stu_Name LIKE '李_';

2.8 in 范围查询

    SELECT * FROM Student WHERE Grade_Id IN (1,3,5);
    SELECT * FROM Student WHERE Grade_Id NOT IN (1,3,5);

2.9 聚合函数

每个聚合函数的查询结果是一个值,且没有列名,需要指定别名;

  • count:计数
	SELECT COUNT(*) FROM Student; -- 对行计数
	SELECT COUNT(Stu_Name) FROM Student; -- 对列计数,不统计Null
	SELECT COUNT(Grade_Id) FROM Student;
	SELECT COUNT(DISTINCT Stu_Name) FROM Student; -- DISTINCT : 去重复对列计数
  • max 最大值
  • min 最小值
  • avg 求平均值
	SELECT MAX(Stu_Age) 最大年龄, MIN(Stu_Age) 最小年龄, AVG(Stu_Age) 平均年龄 FROM Student;
  • sum 求和
	SELECT SUM(Stu_Age) 年龄总和 FROM Student;

2.10 分组查询

  • GROUP BY 列1,列2 having 筛选条件

– 统计每个性别的人数

	SELECT Stu_Sex 性别, COUNT(*) 人数 FROM Student GROUP BY Stu_Sex;

– 统计每个年级的人数

	SELECT Grade_Id 年级 ,COUNT(*) 人数 FROM Student
	  WHERE Grade_Id IS NOT NULL 
	    GROUP BY Grade_Id;

– 统计每个年级、每个性别的人数

	SELECT Grade_Id 年级 ,Stu_Sex 性别 , COUNT(*) 人数 FROM Student GROUP BY Grade_Id,Stu_Sex;

– 不合理的实现 (已经分组、需要的是每组的结果,但是Stu_Name列不是针对组的,是针对每一行的)

	SELECT Stu_Sex, Stu_Name ,COUNT(*) FROM Student GROUP BY Stu_Sex;  -- 错误代码

【注意】:在分组查询中,位于select 和 from 之间的列,要么在聚合函数中,要么在 group by子句中。

  • having子句:在分组之后的结果中,对分组以后的结果进行筛选

  • having只能用在 group by 之后,不能单独使用

  • group by 子句可以直接使用列的别名 , having子句不能用列的别名

-- 查询出每个部门的名称、部门的人数、平均工资 , 保留平均工资大于2000的部门信息
select d.deptNo,d.dname,count(empNo),avg(sal) 
	from Emp e right join Dept d on d.deptNo = e.deptNo
		group by d.deptNo,d.dname
			having avg(sal) > 2000
				order by avg(sal) desc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值