Database基础_SELECT语句
一、基本句式
1. 选取特定的字段作为输出对象
SELECT attr1, attr2, attr3,... FROM tableName;
该语句会按照指令中字段的顺序依次输出对应的数据,另外地,SELECT不会按照特定顺序来检索行。
SELECT installSize, version, gameID FROM games;
在MySQL的Workbench上的输出结果:
2. SELECT WHERE条件
1) 句式:
SELECT attr1, attr2, attr3,... FROM tableName WHERE condition;
该语句会按照WHERE后的条件进行筛选,只输出符合条件的结果,WHERE后一次只能接一个字段
SELECT installSize, version, gameID FROM games WHERE gameID=100;
2) 执行上述语句时,系统内部执行了以下步骤:
1 FROM 读取table中的所有数据,所有记录设为待选状态
2 WHERE 使用条件进行筛选,选中符合条件的记录
3 SELECT 保留被选中的记录,输出结果到窗口
因此,只要你使用了SELECT, 系统都会把整个指定的表格全部读取一遍,无论后面的条件句是什么。
二、操作符(Operator)
除了“=”以外,SQL还有很多其他的操作符,用来形成更复杂的筛选条件
1. 不等式
--注:不等式也可以用来判断日期和字符串(大小写不敏感)
WHERE gameID > 100;
WHERE gameID < 100;
WHERE gameID <= 100;
WHERE gameID >= 100;
WHERE gameID <> 100; -- 不等于,"<>"是ANSI标准的不等号,大部分系统也支持使用"!="
2. IN
- IN之后可以返回一个集合,筛选出所有能与集合内任意一个元素相同的记录
- 由于IN判断的是一个集合,你可以在IN中插入多项数据,甚至嵌套SELECT,因为SELECT的本质也是返回数据(注意,嵌套中的SELECT必须只能返回一个字段)
SELECT * FROM games
WHERE gameID IN (100,101);
SELECT * FROM games
WHERE gameID IN (SELECT gameID FROM games WHERE gameID=100); --吃饱了撑的
3. BETWEEN...AND...
WHERE attri BETWEEN lo AND hi 可以返回指定字段处于闭区间[lo,hi]之间所有的记录
SELECT * FROM games
WHERE gameID BETWEEN 101 AND 103;
如果不小心将上下限的位置颠倒过来,系统虽然不会报错,但同时也不会返回任何数据
4. LIKE
LIKE配合通配符"%"的使用可以进行模糊匹配,
WHERE name LIKE "%Joey";
WHERE name LIKE "Joey%";
WHERE name LIKE "%Joey%";
WHERE name LIKE "Jo%ey";
无论如何使用通配符,“%”都代表着“任意长度的字符串”,他可以是其他字符,也可以是数字,也可以什么都没有,也就是说“%Joey”依然会返回开头是Joey的字符串,而如果字符串的开头或结尾不加%,那只会返回以“Joey”为开头/结尾的字符串
5. IS NULL
一般情况下,由于NULL的特殊性,对一个字段进行筛选时,如果有的记录中该字段是NULL,那么即使他符合某些操作符的筛选条件(如!=),他也不会被选中。而只有IS NULL可以筛选出指定字段是空的记录
SELECT * FROM person WHERE Soulmate IS NULL;
总会找到你。
6. NOT
NOT加入以上语句会对筛选条件进行取反并输出。
WHERE NOT gameID>100; WHERE gameID NOT IN (100,101); WHERE gameID NOT BETWEEN 101 AND 103; WHERE name NOT LIKE "%Joey"; WHERE Soulmate IS NOT NULL;
三、运算符、关键词、聚合函数
仅仅一个WHERE怎么能满足我们复杂的逻辑条件,引入更多语句是十分必要的。
1. 运算符(AND / OR)
1) 基本句式:
SELECT attri FROM table WHERE condition1 AND condition2;
SELECT attri FROM table WHERE condition1 OR condition2;
2) 优先级:
AND的执行优先级要强于OR,也就是说,AND会无关你的语句顺序进行筛选。
原始数据:
需求:找出ID在101以下,102以上之中version不为“a”且发售日期在2021年的游戏
查询:
SELECT * FROM games
WHERE gameID<101 OR gameID>102
AND version NOT LIKE "a"
AND releaseDate="2021-12-11";
结果:
不符合条件,因为以上语句中AND被优先执行了,想要满足条件必须使用括号来提高OR的优先级
SELECT * FROM games
WHERE (gameID<101 OR gameID>102)
AND version NOT LIKE "a"
AND releaseDate="2021-12-11";
结果:
2. 排序(ORDER BY)
ORDER BY 的使用可以让结果按照指定字段的顺序进行输出
——————施工中——————