DML

DML 语句主要针对数据表的增删改查操作,即对数据表的 INSERT、DELETE、UPDATE、SELECT 操作

1.SELECT查询
查询可以使用AND OR NOT

  1. //查询
  2. SELECT * FROM students;
  3. SELECT * FROM students WHERE score >= 80;
  4. SELECT * FROM students WHERE NOT class_id = 2;
  5. SELECT * FROM students WHERE score >= 80 OR gender = 'M';
  6. SELECT * FROM students WHERE score >= 80 AND gender = 'M';
  7. SELECT * FROM students WHERE (score < 80 OR score > 90) AND gender = 'M';

使用别名

  1. //以下SELECT语句将列名score重命名为points,而id和name列名保持不变:
  2. SELECT id, score points, name FROM students;

排序

  1. SELECT id, name, gender, score FROM students ORDER BY score;
  2. SELECT id, name, gender, score FROM students ORDER BY score DESC;
  3. //如果有WHERE子句,那么ORDER BY子句要放到WHERE子句后面
  4. SELECT id, name, gender, score
  5. FROM students
  6. WHERE class_id = 1
  7. ORDER BY score DESC;
  8. //ORDER BY score DESC, gender表示先按score列倒序,如果有相同分数的,再按gender列排序:
  9. SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;

分页查询

  1. SELECT id, name, gender, score
  2. FROM students
  3. ORDER BY score DESC
  4. LIMIT 3 OFFSET 0;
  5. //跳过三条数据,查询第二页的数据
  6. SELECT id, name, gender, score
  7. FROM students
  8. ORDER BY score DESC
  9. LIMIT 3 OFFSET 3;

聚合查询

  1. //计数
  2. SELECT COUNT(*) FROM students;
  3. //取个别名方便查看
  4. SELECT COUNT(*) num FROM students;
  5. //分组聚合
  6. SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;
  7. //也可以使用多个列进行分组。例如,我们想统计各班的男生和女生人数:
  8. SELECT class_id, gender, COUNT(*) num FROM students GROUP BY class_id, gender;

除了COUNT

SUM 计算某一列的合计值,该列必须为数值类型
AVG 计算某一列的平均值,该列必须为数值类型
MAX 计算某一列的最大值
MIN 计算某一列的最小值

多表查询

  1. SELECT
  2. s.id sid,
  3. s.name,
  4. s.gender,
  5. s.score,
  6. c.id cid,
  7. c.name cname
  8. FROM students s, classes c
  9. WHERE s.gender = 'M' AND c.id = 1;

连接查询

  1. //内连接——INNER JOIN来实现
  2. SELECT s.id, s.name, s.class_id, c.name class_name, s.gender, s.score
  3. FROM students s
  4. INNER JOIN classes c
  5. ON s.class_id = c.id;

对于这么多种JOIN查询,到底什么使用应该用哪种呢?其实我们用图来表示结果集就一目了然了。
假设查询语句是:

  1. SELECT ... FROM tableA ??? JOIN tableB ON tableA.column1 = tableB.column2;

我们把tableA看作左表,把tableB看成右表,那么INNER JOIN是选出两张表都存在的记录:
DML-数据操作语言 - 图1
LEFT OUTER JOIN是选出左表存在的记录:
DML-数据操作语言 - 图2
RIGHT OUTER JOIN是选出右表存在的记录:
DML-数据操作语言 - 图3
FULL OUTER JOIN则是选出左右表都存在的记录:
DML-数据操作语言 - 图4