文章内容相关练习题:牛客网在线编程_SQL篇_非技术快速入门
目录
扩展知识点(`GROUP BY`、`HAVING`和`ORDER BY`)
基础查询
基础查询
SQL1 查询所有列
题目:现在运营想要查看用户信息表中所有的数据,请你取出相应结果
--查询所有字段
select * from user_profile
-- select 选择
-- * 通配符
-- from 来自
-- user_profile 表名
--执行顺序为 from [] select []
SQL2 查询多列
题目:现在运营同学想要用户的设备id对应的性别、年龄和学校的数据,请你取出相应数据
--查询多个字段,用逗号隔开
--device_id,gender,age ,university
select device_id,gender,age ,university from user_profile;
简单处理查询结果
SQL3 查询结果去重
题目:现在运营需要查看用户来自于哪些学校,请从用户信息表中取出学校的去重数据。
select distinct university from user_profile;
-- SELECT: 这个关键字指示我们要从数据库中选择(检索)数据。
-- DISTINCT: 这个关键字告诉数据库我们只希望获取唯一的值,即去除重复的结果。
-- university: 这是我们希望检索的字段名称。在这个查询中,我们想要获取"大学"这一列的值。
-- FROM: 这个关键字告诉数据库我们要从哪个数据表中获取数据。
-- user_profile: 这是我们要查询的数据表的名称。在这个例子中,数据表名为"用户资料"。
扩展知识点(DISTINCT)
除了"DISTINCT"之外,SQL还提供了其他一些类似于"DISTINCT"的操作语句,用于实现数据的去重或聚合。以下是一些常用的类似于"DISTINCT"的操作语句:
1. GROUP BY:
"GROUP BY"语句用于将数据按照指定的列进行分组,并对每个组进行聚合操作。它可以用于计算每个组的总和、平均值、最大值、最小值等。
示例:
```
SELECT department, COUNT(*) as num_employees
FROM employees
GROUP BY department;
```
上述查询将按照部门(department)列对"employees"表中的数据进行分组,并计算每个部门的员工数量。
2. HAVING:
"HAVING"语句用于在"GROUP BY"之后对分组的结果进行过滤。它允许我们筛选出满足特定条件的分组结果。
示例:
```
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
```
上述查询将先按照部门(department)列对"employees"表中的数据进行分组,并计算每个部门的平均薪资。然后,"HAVING"子句将只返回平均薪资超过50000的部门。
3. UNION:
"UNION"用于合并两个或多个查询的结果,并去除重复的行。它可以用于合并具有相同列结构的查询结果。
示例:
```
SELECT column1, column2 FROM table1
UNION
SELECT column1, column2 FROM table2;
```
上述查询将从"table1"和"table2"表中分别选择"column1"和"column2"的值,并合并这两个结果集,去除重复的行。
4. INTERSECT:
"INTERSECT"用于获取两个查询结果的交集,返回同时在两个结果集中存在的行。
示例:
```
SELECT column1, column2 FROM table1
INTERSECT
SELECT column1, column2 FROM table2;
```
上述查询将从"table1"和"table2"表中分别选择"column1"和"column2"的值,并返回同时在两个结果集中存在的行。
5. EXCEPT (or MINUS in some databases):
"EXCEPT"用于获取第一个查询结果集中存在而第二个查询结果集中不存在的行。
示例:
```
SELECT column1, column2 FROM table1
EXCEPT
SELECT column1, column2 FROM table2;
```
上述查询将从"table1"和"table2"表中分别选择"column1"和"column2"的值,并返回只在"table1"中存在而在"table2"中不存在的行。
这些类似于"DISTINCT"的操作语句提供了更多的灵活性,允许我们在数据检索和处理时进行更多的操作和筛选。
SQL4 查询结果限制返回行数
题目:现在运营只需要查看前2个用户明细设备ID数据,请你从用户信息表 user_profile 中取出相应结果。
select device_id from user_profile where id < 3;
-- SELECT: 这个关键字指示我们要从数据库中选择(检索)数据。
-- device_id: 这是我们希望检索的字段名称。在这个查询中,我们想要获取"设备ID"这一列的值。
-- FROM: 这个关键字告诉数据库我们要从哪个数据表中获取数据。
-- user_profile: 这是我们要查询的数据表的名称。在这个例子中,数据表名为"用户资料"。
-- WHERE: 这个关键字用于添加条件,以限制我们的查询结果。它允许我们筛选出符合特定条件的记录。
-- id < 3: 这是我们的条件子句。我们要找到"ID"字段值小于3的记录。这样,我们将仅获取满足这个条件的数据行。
SQL5 将查询后的列重新命名
题目:现在你需要查看前2个用户明细设备ID数据,并将列名改为 'user_infos_example',,请你从用户信息表取出相应结果。
select device_id user_info_example from user_profile where id <3;
-- SELECT: 这个关键字指示我们要从数据库中选择(检索)数据。
-- device_id: 这是我们希望检索的字段名称。在这个查询中,我们想要获取"设备ID"这一列的值。
-- user_info_example: 这是对"设备ID"字段重新命名的别名。通过使用"AS"关键字,我们可以将"设备ID"列的名称改为"用户信息示例",以便结果集中显示这个新的名称。
-- FROM: 这个关键字告诉数据库我们要从哪个数据表中获取数据。
-- user_profile: 这是我们要查询的数据表的名称。在这个例子中,数据表名为"用户资料"。
-- WHERE: 这个关键字用于添加条件,以限制我们的查询结果。它允许我们筛选出符合特定条件的记录。
-- id < 3: 这是我们的条件子句。我们要找到"ID"字段值小于3的记录。这样,我们将仅获取满足这个条件的数据行。
条件查询
基础操作符
SQL6 查找学校是北大的学生信息
题目:现在运营想要筛选出所有北京大学的学生进行用户调研,请你从用户信息表中取出满足条件的数据,结果返回设备id和学校。
select device_id,university from user_profile where university = "北京大学";
--SELECT: 这个关键字指示我们要从数据库中选择(检索)数据。
--device_id, university: 这是我们希望检索的字段名称。在这个查询中,我们想要获取"设备ID"和"大学"这两列的值。
--FROM: 这个关键字告诉数据库我们要从哪个数据表中获取数据。
--user_profile: 这是我们要查询的数据表的名称。在这个例子中,数据表名为"用户资料"。
--WHERE: 这个关键字用于添加条件,以限制我们的查询结果。它允许我们筛选出符合特定条件的记录。
--university = "北京大学": 这是我们的条件子句。我们要找到"大学"字段值为"北京大学"的记录。这样,我们将只获取满足这个条件的数据行。
扩展知识点(WHERE)
在"WHERE"语句中,条件由一个或多个逻辑表达式组成。这些逻辑表达式可以使用运算符(如比较运算符、逻辑运算符等)来构建。
常见的条件类型包括:
-
比较条件:
- 等于:
column = value
- 不等于:
column <> value
或column != value
- 大于:
column > value
- 大于等于:
column >= value
- 小于:
column < value
- 小于等于:
column <= value
- 等于:
-
字符串匹配条件:
- LIKE:用于模糊匹配字符串。
column LIKE 'abc%'
:匹配以"abc"开头的值。column LIKE '%xyz'
:匹配以"xyz"结尾的值。column LIKE '%pqr%'
:匹配包含"pqr"的值。
- LIKE:用于模糊匹配字符串。
-
逻辑条件:
- AND:同时满足多个条件。
condition1 AND condition2
- OR:满足任意一个条件。
condition1 OR condition2
- NOT:否定一个条件。
NOT condition
- AND:同时满足多个条件。
-
IN条件:
column IN (value1, value2, ...)
: 判断列的值是否包含在括号中指定的值列表中。
-
BETWEEN条件:
column BETWEEN value1 AND value2
: 判断列的值是否在指定的范围内。
-
IS NULL和IS NOT NULL条件:
column IS NULL
: 判断列的值是否为NULL。column IS NOT NULL
: 判断列的值是否不为NULL。
在实际查询中,可以根据需要组合这些条件来获取所需的数据。
例如:
SELECT name, age FROM students WHERE age >= 18 AND city = 'New York';
-- 上述查询从"students"表中选择"姓名"和"年龄"列的数据
-- 只返回年龄大于等于18岁且所在城市为"New York"的学生记录。
SQL7 查找年龄大于24岁的用户信息
题目:现在运营想要针对24岁以上的用户开展分析,请你取出满足条件的设备ID、性别、年龄、学校。
select device_id,gender,age,university from user_profile where age >=24;
-- SELECT: 这个关键字指示我们要从数据库中选择(检索)数据。
-- device_id, gender, age, university: 这是我们希望检索的字段名称。在这个查询中,我们想要获取"设备ID"、"性别"、"年龄"和"大学"这四列的值。
-- FROM: 这个关键字告诉数据库我们要从哪个数据表中获取数据。
-- user_profile: 这是我们要查询的数据表的名称。在这个例子中,数据表名为"用户资料"。
-- WHERE: 这个关键字用于添加条件,以限制我们的查询结果。它允许我们筛选出符合特定条件的记录。
-- age >= 24: 这是我们的条件子句。我们要找到"年龄"字段值大于等于24岁的记录。这样,我们将只获取满足这个条件的数据行。
SQL8 查找某个年龄段的用户信息
题目:现在运营想要针对20岁及以上且23岁及以下的用户开展分析,请你取出满足条件的设备ID、性别、年龄。
select device_id,gender,age from user_profile where age between 20 and 23;
-- SELECT: 这个关键字指示我们要从数据库中选择(检索)数据。
-- device_id, gender, age: 这是我们希望检索的字段名称。在这个查询中,我们想要获取"设备ID"、"性别"和"年龄"这三列的值。
-- FROM: 这个关键字告诉数据库我们要从哪个数据表中获取数据。
-- user_profile: 这是我们要查询的数据表的名称。在这个例子中,数据表名为"用户资料"。
-- WHERE: 这个关键字用于添加条件,以限制我们的查询结果。它允许我们筛选出符合特定条件的记录。
-- age BETWEEN 20 AND 23: 这是我们的条件子句。我们要找到"年龄"字段值在20岁至23岁之间的记录。这样,我们将只获取满足这个条件的数据行。
SQL9 查找除复旦大学的用户信息
题目:现在运营想要查看除复旦大学以外的所有用户明细,请你取出相应数据
select device_id,gender,age,university from user_profile where university !="复旦大学";
-- SELECT: 这个关键字指示我们要从数据库中选择(检索)数据。
-- device_id, gender, age, university: 这是我们希望检索的字段名称。在这个查询中,我们想要获取"设备ID"、"性别"、"年龄"和"大学"这四列的值。
-- FROM: 这个关键字告诉数据库我们要从哪个数据表中获取数据。
-- user_profile: 这是我们要查询的数据表的名称。在这个例子中,数据表名为"用户资料"。
-- WHERE: 这个关键字用于添加条件,以限制我们的查询结果。它允许我们筛选出符合特定条件的记录。
-- university != "复旦大学": 这是我们的条件子句。我们要找到"大学"字段值不等于"复旦大学"的记录。这样,我们将只获取满足这个条件的数据行。
SQL10 用where过滤空值练习
题目:现在运营想要对用户的年龄分布开展分析,在分析时想要剔除没有获取到年龄的用户,请你取出所有年龄值不为空的用户的设备ID,性别,年龄,学校的信息。
select device_id,gender,age,university from user_profile where age is not null;
-- SELECT: 这个关键字指示我们要从数据库中选择(检索)数据。
-- device_id, gender, age, university: 这是我们希望检索的字段名称。在这个查询中,我们想要获取"设备ID"、"性别"、"年龄"和"大学"这四列的值。
-- FROM: 这个关键字告诉数据库我们要从哪个数据表中获取数据。
-- user_profile: 这是我们要查询的数据表的名称。在这个例子中,数据表名为"用户资料"。
-- WHERE: 这个关键字用于添加条件,以限制我们的查询结果。它允许我们筛选出符合特定条件的记录。
-- age IS NOT NULL: 这是我们的条件子句。我们要找到"年龄"字段值不为空的记录。这样,我们将只获取满足这个条件的数据行
扩展知识点(IS NOT NULL)
在SQL中,"IS NOT NULL"是一个条件表达式,用于判断一个字段的值是否不为空(非NULL)。NULL是一个特殊的值,表示缺少数据或未知数据,而"IS NOT NULL"用于排除这些缺失值,只选择字段值不为空的记录。
"IS NOT NULL"的用法如下:
```
SELECT column1, column2, ...
FROM table_name
WHERE column_name IS NOT NULL;
```
--其中:
-- `column1, column2, ...`: 是我们希望检索的字段名称。
-- `table_name`: 是我们要查询的数据表的名称。
-- `column_name`: 是我们要检查是否不为空的字段名称。
类似于"IS NOT NULL"的条件表达式还有"IS NULL",它用于判断一个字段的值是否为空(NULL)。这两个条件表达式是互补的。
除了"IS NULL"和"IS NOT NULL",SQL中还有其他类似的条件表达式,用于比较、模糊匹配等操作。一些常见的条件表达式包括:
1. 比较运算符:
- `=`:等于
- `<>` 或 `!=`:不等于
- `>`:大于
- `<`:小于
- `>=`:大于等于
- `<=`:小于等于
2. LIKE运算符:
- 用于模糊匹配,支持使用通配符 "%" 和 "_"
- 例如:`column_name LIKE 'abc%'`,匹配以 "abc" 开头的值。
3. IN运算符:
- 用于判断一个字段的值是否在一个给定的值列表中。
- 例如:`column_name IN ('value1', 'value2', ...)`
4. BETWEEN运算符:
- 用于判断一个字段的值是否在一个指定的范围内。
- 例如:`column_name BETWEEN value1 AND value2`
5. 逻辑运算符:
- `AND`:同时满足多个条件。
- `OR`:满足任意一个条件。
- `NOT`:否定一个条件。
这些条件表达式允许我们在SQL查询中添加条件,用于筛选出满足特定条件的数据行,从而获取我们需要的数据。
高级操作符
SQL11 高级操作符练习(1)
题目:现在运营想要找到男性且GPA在3.5以上(不包括3.5)的用户进行调研,请你取出相关数据。
select device_id,gender,age,university,gpa from user_profile where gender ="male" and gpa > 3.5;
-- SELECT: 这个关键字指示我们要从数据库中选择(检索)数据。
-- device_id, gender, age, university, gpa: 这是我们希望检索的字段名称。在这个查询中,我们想要获取"设备ID"、"性别"、"年龄"、"大学"和"GPA"这五列的值。
-- FROM: 这个关键字告诉数据库我们要从哪个数据表中获取数据。
-- user_profile: 这是我们要查询的数据表的名称。在这个例子中,数据表名为"用户资料"。
-- WHERE: 这个关键字用于添加条件,以限制我们的查询结果。它允许我们筛选出符合特定条件的记录。
-- gender = "male": 这是我们的第一个条件子句。我们要找到"性别"字段值为"男性"的记录。这样,我们将只获取满足这个条件的数据行。
-- gpa > 3.5: 这是我们的第二个条件子句。我们要找到"GPA"字段值大于3.5的记录。这样,我们将只获取满足这个条件的数据行。
SQL12 高级操作符练习(2)
题目:现在运营想要找到学校为北大或GPA在3.7以上(不包括3.7)的用户进行调研,请你取出相关数据(使用OR实现)
select device_id,gender,age,university,gpa from user_profile where university ="北京大学" or gpa >3.7;
-- SELECT: 这个关键字指示我们要从数据库中选择(检索)数据。
-- device_id, gender, age, university, gpa: 这是我们希望检索的字段名称。在这个查询中,我们想要获取"设备ID"、"性别"、"年龄"、"大学"和"GPA"这五列的值。
-- FROM: 这个关键字告诉数据库我们要从哪个数据表中获取数据。
-- user_profile: 这是我们要查询的数据表的名称。在这个例子中,数据表名为"用户资料"。
-- WHERE: 这个关键字用于添加条件,以限制我们的查询结果。它允许我们筛选出符合特定条件的记录。
-- university = "北京大学": 这是我们的第一个条件子句。我们要找到"大学"字段值为"北京大学"的记录。这样,我们将只获取满足这个条件的数据行。
-- gpa > 3.7: 这是我们的第二个条件子句。我们要找到"GPA"字段值大于3.7的记录。这样,我们将只获取满足这个条件的数据行。
-- or: 这是逻辑运算符,用于将两个条件合并。在这个查询中,我们使用"or"表示我们要找到满足第一个条件或第二个条件的记录。
扩展知识点(or和and的优先级)
在SQL语句中,"AND"运算符的优先级高于"OR"运算符。这意味着在没有使用括号的情况下,"AND"运算符会先被执行,然后才是"OR"运算符。
例如,考虑以下SQL查询语句:
```
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 OR condition3;
```
-- 在这个查询中,"AND"运算符优先级较高,所以它会先对`condition1 AND condition2`进行求值。
-- 然后,再将结果与`condition3`进行"OR"运算。
如果我们想要改变条件的优先级,可以使用括号来明确指定条件的组合。例如:
```
SELECT column1, column2, ...
FROM table_name
WHERE (condition1 AND condition2) OR condition3;
```
-- 在这个查询中,使用括号明确表示`condition1 AND condition2`应该首先求值,
-- 然后再与`condition3`进行"OR"运算。
总结起来,SQL中"AND"运算符的优先级高于"OR"运算符,但通过使用括号,我们可以显式地控制条件的组合和求值顺序。
SQL13 Where in 和Not in
题目:现在运营想要找到学校为北大、复旦和山大的同学进行调研,请你取出相关数据。
select device_id,gender,age,university,gpa from user_profile where university in ("北京大学","复旦大学","山东大学");
-- SELECT: 这个关键字指示我们要从数据库中选择(检索)数据。
-- device_id, gender, age, university, gpa: 这是我们希望检索的字段名称。在这个查询中,我们想要获取"设备ID"、"性别"、"年龄"、"大学"和"GPA"这五列的值。
-- FROM: 这个关键字告诉数据库我们要从哪个数据表中获取数据。
-- user_profile: 这是我们要查询的数据表的名称。在这个例子中,数据表名为"用户资料"。
-- WHERE: 这个关键字用于添加条件,以限制我们的查询结果。它允许我们筛选出符合特定条件的记录。
-- university IN ("北京大学", "复旦大学", "山东大学"): 这是我们的条件子句。我们要找到"大学"字段值为"北京大学"、"复旦大学"或"山东大学"的记录。这样,我们将只获取满足这个条件的数据行。
SQL14 操作符混合运用
题目:现在运营想要找到gpa在3.5以上(不包括3.5)的山东大学用户 或 gpa在3.8以上(不包括3.8)的复旦大学同学进行用户调研,请你取出相应数据
select device_id,gender,age,university,gpa from user_profile where (gpa >3.5 and university ='山东大学') or (gpa>3.8 and university='复旦大学');
SQL15 查看学校名称中含北京的用户
题目:现在运营想查看所有大学中带有北京的用户的信息,请你取出相应数据。
select device_id,age,university from user_profile where university like "北京%"
-- SELECT device_id, age, university: 这部分是选择要显示在查询结果中的列。
-- 在这里,我们选择了"user_profile"表中的"device_id"、"age"和"university"这三列数据。
-- FROM user_profile: 这部分指定了我们要从哪个数据表中获取数据,即"user_profile"表。
-- WHERE university LIKE "北京%": 这部分用于过滤数据,只选择符合特定条件的行。在这个查询中,我们指定了"university"列必须满足特定的模式,即以"北京"开头。
-- 这里使用了LIKE关键字来进行模糊匹配。而"北京%"表示"university"列的值必须以"北京"开头,后面可以是任意字符。例如,符合条件的大学名称可以是"北京大学"、"北京理工大学"等等。
扩展知识点(模糊查询)
SQL模糊查询是一种查询技术,允许在数据库中使用通配符来匹配符合特定模式的数据。SQL模糊查询常用于在字符串字段中查找包含特定字符或字符模式的数据。在SQL中,有两个主要的通配符用于模糊查询:
1. 百分号(%):表示零个或多个字符的任意序列。
2. 下划线(_):表示单个字符的任意值。
下面是模糊查询的基本语法:
```
SELECT column1, column2, ...
FROM table_name
WHERE column_name LIKE pattern;
```
-- 在上述语法中,`column_name`是要进行模糊查询的字段名,而`pattern`是用于匹配的模式,可以包含百分号或下划线。
现在,让我们来看几个使用模糊查询的场景:
1. 查找以特定字符开头的数据:
```
SELECT * FROM employees
WHERE first_name LIKE 'J%';
```
-- 以上查询将返回`employees`表中`first_name`字段以字母`J`开头的所有员工。
2. 查找以特定字符结尾的数据:
```
SELECT * FROM products
WHERE product_name LIKE '%shoes';
```
-- 以上查询将返回`products`表中`product_name`字段以字母`shoes`结尾的所有产品。
3. 查找包含特定字符的数据:
```
SELECT * FROM customers
WHERE email LIKE '%@gmail.com';
```
-- 以上查询将返回`customers`表中`email`字段包含`@gmail.com`的所有客户。
4. 查找特定长度的数据:
```
SELECT * FROM products
WHERE product_code LIKE 'ABC____';
```
--以上查询将返回`products`表中`product_code`字段以`ABC`开头且后面有四个字符的所有产品。
5. 使用多个通配符组合查询:
```
SELECT * FROM orders
WHERE order_date LIKE '2023-08%';
```
-- 以上查询将返回`orders`表中`order_date`字段以`2023-08`开头的所有订单。
模糊查询在处理实际应用程序中的数据时非常有用。例如,在电子商务网站中,可以使用模糊查询来搜索产品名称或描述。在客户管理系统中,可以使用模糊查询来查找具有相似信息的客户。在日志分析或报表系统中,模糊查询也经常用于筛选特定日期范围内的数据。总的来说,模糊查询为数据库中的数据探索和筛选提供了灵活而强大的功能。
高级查询
计算函数
SQL16 查找GPA最高值
题目:运营想要知道复旦大学学生gpa最高值是多少,请你取出相应数据
select max(gpa) from user_profile where university ="复旦大学";
-- SELECT: 这是一个SQL查询语句的关键字,表示我们要从数据库中检索数据。
-- max(gpa): 这部分是查询的主体,它表示我们要找出"gpa"字段的最大值。max()是一个聚合函数,用于计算给定字段的最大值。
-- FROM user_profile: 这指定了我们要从名为"user_profile"的数据库表中检索数据。"user_profile"是表的名称,其中包含了学生的个人信息,包括"university"和"gpa"字段。
-- WHERE university = "复旦大学": 这是一个条件子句,用于筛选符合条件的记录。在这里,我们指定了条件为"university"字段等于"复旦大学"的记录。
SQL17 计算男生人数以及平均GPA
题目:现在运营想要看一下男性用户有多少人以及他们的平均gpa是多少,用以辅助设计相关活动,请你取出相应数据。
select count(gender) male_num,avg(gpa) avg_gpa from user_profile group by gender having gender ='male';
-- SELECT: 这是一个SQL查询语句的关键字,表示我们要从数据库中检索数据。
-- count(gender) male_num: 这部分是查询的主体,它使用聚合函数count()来计算每个分组中"gender"字段等于"male"的记录数量,并将结果命名为"male_num"。
-- avg(gpa) avg_gpa: 这部分是另一个聚合函数,使用avg()来计算每个分组中"gpa"字段的平均值,并将结果命名为"avg_gpa"。
-- FROM user_profile: 这指定了我们要从名为"user_profile"的数据库表中检索数据。"user_profile"是表的名称,其中包含了学生的个人信息,包括"gender"和"gpa"字段。
-- GROUP BY gender: 这是一个分组语句,它将根据"gender"字段的值对数据进行分组。在这里,我们将数据分成两个组,一个是"gender"为"male"的组,另一个是"gender"为"female"(或其他性别)的组。
-- HAVING gender = 'male': 这是一个筛选条件子句,用于筛选分组后的数据。在这里,我们只保留"gender"为"male"的组。
分组查询
SQL18 分组计算练习题
题目:现在运营想要对每个学校不同性别的用户活跃情况和发帖数量进行分析,请分别计算出每个学校每种性别的用户数、30天内平均活跃天数和平均发帖数量。
select
gender,university,count(gender) user_num,avg(active_days_within_30) avg_active_day,avg(question_cnt) avg_question_cnt
from user_profile
group by university,gender;
-- SELECT: 这是一个SQL查询语句的关键字,表示我们要从数据库中检索数据。
-- gender, university: 这部分指定了我们想要在结果中显示的字段,即"gender"和"university"字段,用逗号分隔。
-- count(gender) user_num: 这部分是查询的主体,它使用聚合函数count()来计算每个分组中"gender"字段的记录数量,并将结果命名为"user_num",表示用户数量。
-- avg(active_days_within_30) avg_active_day: 这是另一个聚合函数,使用avg()来计算每个分组中"active_days_within_30"字段的平均值,并将结果命名为"avg_active_day",表示平均30天内活跃天数。
-- avg(question_cnt) avg_question_cnt: 这也是一个聚合函数,使用avg()来计算每个分组中"question_cnt"字段的平均值,并将结果命名为"avg_question_cnt",表示平均问题数量。
-- FROM user_profile: 这指定了我们要从名为"user_profile"的数据库表中检索数据。"user_profile"是表的名称。
-- GROUP BY university, gender: 这是一个分组语句,它将根据"university"和"gender"字段的值对数据进行分组。这样,我们会得到每个大学和性别组合的统计信息。
SQL19 分组过滤练习题
题目:现在运营想查看每个学校用户的平均发贴和回帖情况,寻找低活跃度学校进行重点运营,请取出平均发贴数低于5
select
university,avg(question_cnt) avg_question_cnt,avg(answer_cnt) avg_answer_cnt
from user_profile
group by university
having avg(question_cnt) < 5 or avg(answer_cnt) <20;
-- SELECT: 这是一个SQL查询语句的关键字,表示我们要从数据库中检索数据。
-- university: 这部分指定了我们想要在结果中显示的字段,即"university"字段,表示大学名称。
-- avg(question_cnt) avg_question_cnt: 这部分是查询的主体,它使用聚合函数avg()来计算每个大学中"question_cnt"字段的平均值,并将结果命名为"avg_question_cnt",表示平均问题数量。
-- avg(answer_cnt) avg_answer_cnt: 这也是一个聚合函数,使用avg()来计算每个大学中"answer_cnt"字段的平均值,并将结果命名为"avg_answer_cnt",表示平均回答数量。
-- FROM user_profile: 这指定了我们要从名为"user_profile"的数据库表中检索数据。"user_profile"是表的名称,其中包含了用户的个人信息和活动数据,包括"university"、"question_cnt"和"answer_cnt"字段。
-- GROUP BY university: 这是一个分组语句,它将根据"university"字段的值对数据进行分组。这样,我们会得到每个大学的统计信息。
-- HAVING avg(question_cnt) < 5 or avg(answer_cnt) < 20: 这是一个筛选条件子句,用于筛选分组后的数据。在这里,我们使用HAVING关键字来过滤满足以下条件的大学:平均问题数量少于5或平均回答数量少于20。
的学校或平均回帖数小于20的学校。
SQL20 分组排序练习题
题目:现在运营想要查看不同大学的用户平均发帖情况,并期望结果按照平均发帖情况进行升序排列,请你取出相应数据
select
university,avg(question_cnt) avg_question_cnt
from user_profile
group by university order by avg(question_cnt);
-- SELECT: 这是一个SQL查询语句的关键字,表示我们要从数据库中检索数据。
-- university: 这部分指定了我们想要在结果中显示的字段,即"university"字段,表示大学名称。
-- avg(question_cnt) avg_question_cnt: 这部分是查询的主体,它使用聚合函数avg()来计算每个大学中"question_cnt"字段的平均值,并将结果命名为"avg_question_cnt",表示平均问题数量。
-- FROM user_profile: 这指定了我们要从名为"user_profile"的数据库表中检索数据。"user_profile"是表的名称,其中包含了用户的个人信息和活动数据,包括"university"和"question_cnt"字段。
-- GROUP BY university: 这是一个分组语句,它将根据"university"字段的值对数据进行分组。这样,我们会得到每个大学的统计信息。
-- ORDER BY avg(question_cnt): 这是一个排序语句,它根据平均问题数量"avg_question_cnt"的值对结果进行排序。默认情况下,排序是升序的,即从小到大。
扩展知识点(SQL函数)
SQL中的`COUNT`和`SUM`是两种常用的聚合函数,用于对数据进行计数和求和操作。它们通常用于对数据库表中的数据进行统计和汇总。
1. `COUNT`函数:
- `COUNT`函数用于计算指定列或表中的行数(记录数量)。
- 语法:`SELECT COUNT(column_name) FROM table_name;`
- 示例:统计"users"表中的用户数量。
```
SELECT COUNT(*) FROM users;
```
-- 这将返回"users"表中的总行数,即用户的数量。
2. `SUM`函数:
- `SUM`函数用于计算指定列中的数值之和。
- 语法:`SELECT SUM(column_name) FROM table_name;`
- 示例:计算"orders"表中所有订单的总销售额。
```
SELECT SUM(order_amount) FROM orders;
```
-- 这将返回"orders"表中所有订单的销售额总和
3. `AVG`函数:
- `AVG`函数用于计算指定列中数值的平均值。
- 语法:`SELECT AVG(column_name) FROM table_name;`
- 示例:计算"products"表中所有产品价格的平均值。
```
SELECT AVG(product_price) FROM products;
```
-- 这将返回"products"表中所有产品价格的平均值。
4. `MIN`函数:
- `MIN`函数用于找出指定列中的最小值。
- 语法:`SELECT MIN(column_name) FROM table_name;`
- 示例:找出"employees"表中所有员工的最低薪资。
```
SELECT MIN(salary) FROM employees;
```
-- 这将返回"employees"表中所有员工的最低薪资。
5. `MAX`函数:
- `MAX`函数用于找出指定列中的最大值。
- 语法:`SELECT MAX(column_name) FROM table_name;`
- 示例:找出"products"表中所有产品的最高价格。
```
SELECT MAX(product_price) FROM products;
```
-- 这将返回"products"表中所有产品的最高价格。
6. `GROUP BY`子句:
- `GROUP BY`子句用于对结果进行分组,根据指定的列对数据进行聚合计算。
- 语法:`SELECT column1, column2, ... FROM table_name GROUP BY column1, column2, ...;`
- 示例:统计"orders"表中每个客户的订单总数。
```
SELECT customer_id, COUNT(*) AS order_count FROM orders GROUP BY customer_id;
```
-- 这将返回每个客户的订单数量。
以上这些SQL语句和聚合函数是SQL查询和数据处理中的重要组成部分。它们使得数据的汇总、统计和分析变得更加方便和高效。
扩展知识点(`GROUP BY`、`HAVING`和`ORDER BY`)
`GROUP BY`、`HAVING`和`ORDER BY`是SQL中用于数据分组、过滤和排序的重要子句,它们在查询过程中有不同的作用。以下是它们之间的使用注意事项:
1. `GROUP BY`:
- `GROUP BY`用于将查询结果按照一个或多个列进行分组。
- 在使用`GROUP BY`时,查询结果将以分组为单位进行聚合计算,通常与聚合函数(如`COUNT`、`SUM`、`AVG`等)一起使用。
- 注意事项:
- 在`SELECT`子句中,除聚合函数外,列名必须出现在`GROUP BY`子句中,或者作为聚合函数的参数。
- 不能在`SELECT`子句中直接使用未包含在`GROUP BY`子句中的非聚合列。
- `GROUP BY`通常用于配合聚合函数,对数据进行分组和计算汇总统计。
2. `HAVING`:
- `HAVING`子句用于对分组后的数据进行筛选,类似于`WHERE`子句对整个结果集进行筛选。
- `HAVING`通常与`GROUP BY`一起使用,用于过滤分组后的数据,只保留满足指定条件的分组。
- 注意事项:
- `HAVING`子句必须出现在`GROUP BY`子句之后,但在`ORDER BY`子句之前。
- 只有用于分组的列和聚合函数可以在`HAVING`子句中使用,不能直接使用未包含在`GROUP BY`子句或聚合函数中的其他列。
- `HAVING`常用于限制分组结果,筛选出满足特定条件的分组。
3. `ORDER BY`:
- `ORDER BY`用于对查询结果进行排序,可以按照一个或多个列进行排序。
- 默认情况下,`ORDER BY`按照指定列的升序进行排序(从小到大)。
- 可以使用`DESC`关键字来进行降序排序(从大到小)。
- 注意事项:
- `ORDER BY`子句必须出现在`SELECT`语句的最后。
- 可以对未在`SELECT`子句中显示的列进行排序。
- `ORDER BY`常用于以特定的顺序显示查询结果,便于观察和分析。
综上所述,`GROUP BY`、`HAVING`和`ORDER BY`是SQL查询中常用的子句,它们各自有不同的作用。在使用它们时,要注意遵循相应的语法规则,确保正确实现数据的分组、过滤和排序。同时,灵活运用这些子句可以让我们更好地处理数据库中的数据,得到符合需求的查询结果。