select device_id from user_profile limit 2offset0 # 跳过0条,从第一条数据开始取,取两条数据
3、BETWEEN 语句
当需要查询某个范围值的时候,一般使用两种语句,between and, 以及 and 语句
1 2 3 4 5 6 7 8 9 10
SELECT device_id, gender, age FROM user_profile where age between20and23 # 等价于 SELECT device_id, gender, age FROM user_profile where age >=20and age <=23
4、NOT IN 语句
当需要查询集合中指定属性值时,使用 IN ,除此属性值之外的所有值使用 NOT IN
1
列名 [NOT] IN'属性值'
IN:当列中的值与IN中的某个常量值相等时,则结果为True,表明此记录为符合查询条件的记录。 NOT IN:当列中的值与某个常量值相等时,结果为False,表明此记录为不符合查询条件的记录。
1 2 3 4
SELECT * FROM user_profile where university NOTIN'复旦大学'
当需要过滤空值时
1 2 3 4 5 6 7 8 9
SELECT device_id, gender, age, university FROM user_profile WHERE age !=''; # 或者 SELECT device_id, gender, age, university FROM user_profile WHERE age isNOTNULL
5、AND OR 语句
bool 值运算关系
1 2 3 4
SELECT device_id, gender, age, university, gpa FROM user_profile WHERE gpa >3.5AND gender ='male'
混合使用,AND 的优先级大于 OR
1 2 3 4
SELECT device_id, gender, age, university, gpa FROM user_profile WHERE (gpa >3.5and university ='山东大学') OR (gpa >3.8and university ='复旦大学')
6、模糊匹配
数据库中要进行模糊查询,主要使用以下操作
_ :下划线,代表匹配任意一个字符;
% :百分号,代表匹配0个或多个字符;
[]: 中括号,代表匹配其中的任意一个字符;
[^]: ^尖冒号 代表 非,取反的意思;不匹配中的任意一个字符。
1 2 3 4 5 6 7 8 9 10 11
like 模糊查询用法: '%北京' 北京开头的 '_北京%' 第二三个字为北京 '%北京%' 含有北京的
tips: 你了解哪些数据库优化技术? 答:SQL语句优化也属于数据库优化一部分,而我们的 like 模糊查询会引起全表扫描,速度比较慢,应该尽量避免使用like关键字进行模糊查询。
SELECT device_id,age,university FROM user_profile WHERE university LIKE'%北京%'
7、SQL 中相应的一些函数
1、max
查找某个条件限制下的最小最大值时候,一般有两种方法:第一种为使用 最高分-降序排序,取第一一位。第二种为使用 max 函数也行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
SELECT max(gpa) FROM user_profile WHERE university ='复旦大学'
# 上为第二种,下为第一种方法
SELECT gpa FROM user_profile WHERE university ='复旦大学' ORDERBY gpa DESC limit 1
# orderby 为升序排列,orderbydesc 为降序排列
2、count、round、avg 函数
count 用于统计某个值的数量,round 用于保留几位小数,avg 用于求某一列的平均值
1 2 3 4
select COUNT(gender) as male_num, round(avg(gpa), 1) as avg_gpa from user_profile where gender ='male'
3、聚合函数结果作为筛选条件时,不能用where,而是用having语法,配合重命名即可;
1 2 3 4 5 6 7
SELECT university, avg(question_cnt) as avg_question_cnt, avg(answer_cnt) as avg_answer_cnt FROM user_profile GROUPBY university HAVING avg_question_cnt <5OR avg_answer_cnt <20
#以上结果中会包含重复的列 SELECT*FROM 学生表 INNERJOIN 班级表 ON 学生表.班号=班级表.班号
#去除重复列! SELECT 学号, 姓名, 班级表.班号, 班名 FROM 学生表 JOIN 班级表 ON 学生表.班号=班级表.班号
# 举几个多表连接的例子,多体会 select u.university, count(q.question_id) /count(DISTINCT (q.device_id)) as avg_answer_cnt from user_profile as u rightjoin question_practice_detail as q on u.device_id = q.device_id groupby u.university
select device_id, gender, age, gpa from user_profile where university ='山东大学' unionall select device_id, gender, age, gpa from user_profile where gender ='male'
使用以下语句,会去重 where university ='山东大学'or gender ='male'