# 建表 CREATE TABLE player ( id INT, name VARCHAR(100), level INT, exp INT, gold DECIMAL(10,2) );
# 查看表 DESC player;
# 修改表结构 ALTER TABLE player MODIFY COLUMN name VARCHAR(200); # 修改数据类型 ALTER TABLE player RENAME COLUMN name to nick_name; # 修改字段名 ALTER TABLE player ADD COLUMN last_login DATETIME; # 添加字段 ALTER TABLE player DROP COLUMN last_login; # 删除字段
# WHERE子句 # 搭配SELECT,UPDATE,DELETE等 SELECT * FROM player WHERE level > 1 AND (level < 5 OR exp > 1) AND exp < 5;
# null的特判 SELECT * FROM player WHERE email is null; SELECT * FROM player WHERE email is NOT null; SELECT * FROM player WHERE email = ''; # 空字符串,并非空值NULL
# IN SELECT * FROM player WHERE level IN (1,3,5);
# BETWEEN SELECT * FROM player WHERE level BETWEEN 1 AND 10;
# NOT SELECT * FROM player WHERE level NOT BETWEEN 1 AND 10;
# LIKE # %任意个字符,_任意一个字符 SELECT * FROM player WHERE name LIKE '%王%' SELECT * FROM player WHERE name LIKE '王_'
# REGEXP # 正则表达式:· 任意一个字符 ^ 开头 $ 结尾 [abc] 其中任意一个字符 [a-z] 范围内任意一个字符 A|B A或B SELECT * FROM player WHERE name REGEXP '^[王张].$' # 王或张姓二字 SELECT * FROM player WHERE email REGEXP '^zhangsan'; SELECT * FROM player WHERE email REGEXP '^[abc]'; SELECT * FROM player WHERE email REGEXP 'net$';
# ORDER BY SELECT * FROM player ORDER BY level; # 默认升序 SELECT * FROM player ORDER BY level DESC; # 降序 SELECT * FROM player ORDER BY level DESC, exp ASC; # 先level降序,然后exp升序
# 聚合函数 # AVG() COUNT() MAX() MIN() SUM()... SELECT COUNT(*) FROM player; SELECT AVG(level) FROM player;
# GROUP BY SELECT * FROM player GROUP BY sex; SELECT level, COUNT(*) FROM player GROUP BY level; # 查看每个等级玩家数量
# HAVING 筛选分组后的数据 SELECT level, count(level) from player group by level having count(level) > 4 order by count(level) DESC; # 查看大于4每个等级玩家数量并按人数降序排序
# LIMIT # 复杂些的例子: SELECT substr(name,1,1),count(substr(name,1,1)) from player GROUP BY substr(name,1,1) HAVING count(substr(name,1,1)) >= 5 ORDER BY count(substr(name,1,1)) DESC LIMIT 4,3 # 第一个3表示偏移量,第二个3表示返回数量,此处返回5-7名
# DISTINCT 去重复 SELECT DISTINCT sex from player;
# UNION 两个查询结果并集(会去重) UNION ALL 不去重 SELECT * FROM player WHERE level BETWEEN 1 AND 3 UNION (ALL) SELECT * FROM player WHERE exp BETWEEN 1 AND 3;
# INTERSECT 两个查询结果交集 SELECT * FROM player WHERE level BETWEEN 1 AND 3 INTERSECT SELECT * FROM player WHERE exp BETWEEN 1 AND 3;
# EXCEPT 两个查询结果差集 SELECT * FROM player WHERE level BETWEEN 1 AND 3 EXCEPT SELECT * FROM player WHERE exp BETWEEN 1 AND 3;
子查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
SELECT * from player where level > (SELECT avg(level) from player)
SELECT level, ROUND((SELECT avg(level) from player)) as average, level - ROUND((SELECT avg(level) from player)) as diff from player; # as取别名
# 创建新表(从子表) CREATE table player_above_5 select * from player where level < 5;
# 在新表中插入 INSERT INTO player_above_5 select * from player where level between 6 and 10;
# EXISTS # 返回 0 或 1 SELECT exists( select * from player where level > 10);