https://www.nowcoder.com/practice
这个是牛客上的题目,其实之前也上过数据库的课程,但是太久没有用,就已经忘记了,所以写个博客,没啥技术含量,纯粹是方便自己看。
一、查询SELECT
格式:SELECT <列名> FROM <表名>
SQL1:查询所有列
SELECT *FROM user_profile(实际应用中一般很少这样写,因为需要讲*转化为各个列名,效率低。)
SELECT id,device_id,gender,age,university,province FROM user_profile
SQL2:去掉重复–DISTINCT放于列名前
加入要读取学校,去掉重复的学校
SELECT DISTINCT university FROM user_profile
SQL3:查询结果限制返回函数
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。
LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。
如果只给定一个参数,它表示返回最大的记录行数目。
如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。
为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1。
初始记录行的偏移量是 0(而不是 1)。
例5.检索记录行 6-10
SELECT * FROM table LIMIT 5,5
例6.检索记录行 11-last
SELECT * FROM table LIMIT 10,-1
例7.检索前 5 个记录行
SELECT * FROM table LIMIT 5
结果为:输入前两个用户对应的device_id
1、第一种SQL是第二种SQL写法的简写,limit 0,2表示从第一条数据开始(0代表第一条),每页只显示2条数据
2、第三种写法是查询id值<=2的数据
select device_id from user_profile limit 2;
select device_id from user_profile limit 0,2;
select device_id from user_profile where id <=2;
SQL4: 查询之后将列重命名
格式:<列名>AS<新列名>
题目:现在你需要查看前2个用户明细设备ID数据,并将列名改为 ‘user_infos_example’,,请你从用户信息表取出相应结果。
SELECT device_id AS user_infos_example FROM user_profile limit 2
SQL5:条件查询
格式:SELECT <列名> FROM <表名> WHERE<条件>
题目:现在运营想要筛选出所有北京大学的学生进行用户调研,请你从用户信息表中取出满足条件的数据,结果返回设备id和学校。
select device_id,university FROM user_profile where university='北京大学'
SQL6:条件查询
题目:现在运营想要针对24岁以上的用户开展分析,请你取出满足条件的设备ID、性别、年龄、学校。
用户信息表:user_profile
SELECT device_id,gender,age,university FROM user_profile where age>24
SQL7:条件查询
题目:现在运营想要针对20岁及以上且23岁及以下的用户开展分析,请你取出满足条件的设备ID、性别、年龄。
用户信息表:user_profile
SELECT device_id,gender,age FROM user_profile where age>=20 and age<=23
SQL8:条件查询
题目:现在运营想要查看除复旦大学以外的所有用户明细,请你取出相应数据。
SELECT device_id,gender,age,university FROM user_profile where university != '复旦大学'
SQL9: 条件查询,用where过滤空数据
题目:现在运营想要对用户的年龄分布开展分析,在分析时想要剔除没有获取到年龄的用户,请你取出所有年龄值不为空的用户的设备ID,性别,年龄,学校的信息。
SELECT device_id,gender,age,university FROM user_profile where age is not NULL
SQL10、SQL11都是对where条件的限定,使用and /or
SQL12:where in 和 where not in
select device_id,gender,age,university,gpa from user_profile where university in('北京大学','复旦大学','山东大学')
其实用or也可以实现,只是这样麻烦一些
select device_id,gender,age,university,gpa from user_profile where university='北京大学' or university='复旦大学' or university='山东大学'
SQL13:字符匹配
一般形式为:
<列名> [NOT ] LIKE
匹配串中可包含如下四种通配符:
_:匹配任意一个字符;
%:匹配0个或多个字符;
[ ]:匹配[ ]中的任意一个字符(若要比较的字符是连续的,则可以用连字符“-”表 达 );
[^ ]:不匹配[ ]中的任意一个字符。
例23.查询学生表中姓‘张’的学生的详细信息。
SELECT * FROM 学生表 WHERE 姓名 LIKE ‘张%’
例24.查询姓“张”且名字是3个字的学生姓名。
> SELECT * FROM 学生表 WHERE 姓名 LIKE '张__’
如果把姓名列的类型改为nchar(20),在SQL Server 2012中执行没有结果。原因是姓名列的类型是char(20),当姓名少于20个汉字时,系统在存储这些数据时自动在后边补空格,空格作为一个字符,也参加LIKE的比较。可以用rtrim()去掉右空格。
SELECT * FROM 学生表 WHERE rtrim(姓名) LIKE '张__'
例25.查询学生表中姓‘张’、姓‘李’和姓‘刘’的学生的情况。
SELECT * FROM 学生表 WHERE 姓名 LIKE '[张李刘]%’
例26.查询学生表表中名字的第2个字为“小”或“大”的学生的姓名和学号。
SELECT 姓名,学号 FROM 学生表 WHERE 姓名 LIKE '_[小大]%'
例27.查询学生表中所有不姓“刘”的学生。
SELECT 姓名 FROM 学生 WHERE 姓名 NOT LIKE '刘%'
例28.从学生表表中查询学号的最后一位不是2、3、5的学生信息。
SELECT * FROM 学生表 WHERE 学号 LIKE '%[^235]'
SELECT device_id,age,university from user_profile where university like '北京%'
SQL14:聚合函数的使用
SQL提供的统计函数有:
COUNT(【Shift+8】):统计表中元组个数;
COUNT([DISTINCT] <列名>):统计本列列值个数;
SUM( <列名> ):计算列值总和;
AVG( <列名> ):计算列值平均值;
MAX( <列名> ):求列值最大值;
MIN( <列名> ): 求列值最小值。
上述函数中除COUNT(【Shift+8】)外,其他函数在计算过程中均忽略NULL值。
统计函数不能出现在WHERE子句中。
例如,查询成绩最高的学生的学号,如下写法是错误的:
SELECT 学号 FROM 成绩表
WHERE 成绩 = MAX(成绩)
例29.统计学生总人数。
SELECT COUNT(*) FROM 学生表
例30.统计选修了课程的学生的人数。
SELECT COUNT (DISTINCT 学号)
FROM 成绩表
例31.计算学号为“11214D24”的学生的考试总成绩之和。
SELECT SUM(成绩) FROM 成绩表
WHERE 学号 = ‘11214D24 '
select MAX(gpa)AS gpa from user_profile where university='复旦大学'
SQL15:还是条件查询
SELECT COUNT(gender) as male_num,AVG(gpa) as avg_gpa from user_profile where gender='male'
我这样写一点不严谨
看看大佬们怎么写的
表头重命名,用as语法
浮点数的平均值可能小数点位数很多,按照示例保存一位小数,用round函数
select count(gender) as male_num, round(avg(gpa), 1) as avg_gpa from user_profile where gender="male";
很基础的查询大概就这些了吧,如果有看到这的老表,不妨自己上牛客上去玩玩。(主要是我累了,后面不想写了,拜拜)