SELECT*FROM player WHERE level >1AND level <5; SELECT*FROM player WHERE level >1OR level <5; SELECT*FROM player WHERE level NOTIN (1, 3, 5); SELECT*FROM player WHERE level BETWEEN1AND10; -- LIKE是模糊查询,其中%表示任意个字符,而_代表任意一个字符 SELECT*FROM player WHERE name LIKE'王%'; SELECT*FROM player WHERE name LIKE'王_'; -- REGEXP表示正则表达式,语法规则与此前接触的一致。 SELECT*FROM player WHERE name REGEXP '...'; -- 由于在sql中null与任何值都不等,包括null,因此不能使用= null来判断其是否与null相等,应该使用is null来判断,但是对于空字符串,只能使用=来判断 SELECT*FROM player WHERE name isnull; SELECT*FROM player WHERE name =''; -- order by 用于排序,默认升序排列,后加上DESC使其降序排列 SELECT*FROM player WHEREORDERBY level DESC; -- 直接跟数字表示根据第几列的数据来排序 SELECT*FROM player WHEREORDERBY5DESC; -- 还可以在此后再多加一列来表示在第一种排序方式的基础上,以第二种方式作为后续的排列方式,例:(其中ASC表示按顺序即先排level后exp,不填写默认ASC) SELECT*FROM player WHEREORDERBY level DESC, exp ASC;
-- 还有一些常用的聚合函数:COUNT()、MAX() 、MIN() 、SUM() 、AVG() SELECTCOUNT(*) FROM player; SELECTAVG(level) FROM player;
-- group by 来分组查询 SELECT sex, count(*) FROM player groupby sex; -- SELECT 后的level代表查询level列,count(level)表示不同level中的个数,group by后的level表示按level来分组 SELECT level, count(level) FROM player groupby level; -- HAVING:筛选分组后数据 SELECT level, count(level) FROM player groupby level havingcount(level) >4; SELECT level, count(level) FROM player groupby level orderbycount(level) DEC; -- LIMIT可以限制显示的数量 -- 例如下语句只会返回前三名 LIMIT 3; -- DISTINCT可用来去重 SELECTDISTINCT sex from player;
-- UNION来合并查询结果集(并集) -- 例如下语句将会把上下语句的结果合并起来,UNION默认去重,若不想去重,可使用UNION ALL SELECT*FROM player WHERE level BETWEEN1AND3; UNION; SELECT*FROM player WHERE exp BETWEEN1AND3; -- INTERSECT 用来查找两个结果的交集 -- 用法与UNION类似 -- EXCEPT 用于查找两个结果的差集
-- 子查询的使用 SELECTAVG(level) from player; select*from player where level > (SELECTAVG(level) from player); select level, ROUND(SELECTAVG(level) from player) as average, level - ROUND(SELECTAVG(level) from player) as diff from player; -- 使用子查询创建新表 createtable new_player select*from player where level <5; insertinto new_player select*from player where level between6and10; -- EXISTS判断一个查询是否有结果,只返回0或1 selectexists (select*from player where level >10); -- 表连接 -- 内连接,返回两个表中都有的数据 INNERJOIN -- 左连接,返回左表所有数据和右表中匹配数据,右表中没有的数据用NULL填充 LEFTJOIN -- 右连接,同理 RIGHTJOIN
-- 例如:下表示将玩家同对应装备通过对应的玩家id关联起来 select*from player innerjoin equip on player.id = equip.player_id
-- 索引的创建,INDEX前可加上索引类型,UNIQUE表示唯一索引,FULLTEXT表示全文索引,SPATIAL表示空间索引,index_name为索引名称 -- UNIQUE强制列值唯一性,适用所有标量类型(INT、VARCHAR等)、允许出现NULL,常用于查询身份证号、用户名等唯一值 -- FULLTEXT是进行文本内容的语义搜索,适用于CHAR、VARCHAR、TEXT,允许空值和重复值,适用于文章内容搜索、商品描述搜索 -- SPATIAL是地理空间数据检索,适用于GEOMETRY、POINT、POLYGON等,允许重复值,适用于地图应用、位置服务 -- on tbl_name 表示要在tbl_name这张表上创建索引,(index_col_name, ...)是用一个或多个名称括起来的字段名,是我们对哪些字段创建索引,一般对于表的主键字段或常用于查询的字段创建索引,即where语句后的条件字段,来提高查询的效率。 CREATE [UNIQUE| FULLTEXT | SPATIAL] INDEX index_name on tbl_name (index_col_name, ...);
-- 查看索引 show index from tbl_name;
-- 删除索引 drop index index_name on tbl_name;
-- 可在修改表结构时创建索引 altertable tbl_name add index on index_name (name);
-- 视图作为一种虚拟存在的表,本身不包含数据,而作为一个查询语句保存在数据字典中,查询视图时会根据查询语句的定义动态生成数据 -- 例如:下表示查询player表中玩家level在前三名的数据 -- 视图的使用方式与表类似,也可使用select等语句来操作 createview view_name as select*from player orderby level desc limit 3; -- 视图中的数据是动态的,会随着原表中数据的改变而改变