主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义,而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。
可以使用多个列作为联合主键,但联合主键并不常用。
关系数据库通过外键可以实现一对多、多对多和一对一的关系。外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。
附录:表-students
id |
class_id |
name |
gender |
score |
1 |
1 |
小明 |
M |
90 |
2 |
1 |
小红 |
F |
95 |
3 |
1 |
小军 |
M |
88 |
4 |
1 |
小米 |
F |
73 |
5 |
2 |
小白 |
F |
81 |
6 |
2 |
小兵 |
M |
55 |
7 |
2 |
小林 |
M |
85 |
8 |
3 |
小新 |
F |
91 |
9 |
3 |
小王 |
M |
89 |
10 |
3 |
小丽 |
F |
88 |
SELECT * FORM
查询一个表的所有行和所有列的数据,SELECT查询的结果是一个二维表。
Select 列1,列2,列3,则可以进返回指定列,这种称为投影。
SELECT id, score points, name FROM students WHERE gender = 'M';
SELECT id, name, gender, score FROM students WHERE class_id = 1 ORDER BY score DESC;
使用ORDER BY可以对结果进行排序,可以对多列进行升序、倒序排序。
案例:
--查询第4页 SELECT id, name, gender, score FROM students ORDER BY score DESC LIMIT 3 OFFSET 9;
除了COUNT()函数外,SQL还提供了如下聚合函数:
函数 |
说明 |
SUM |
计算某一列的合计值,该列必须为数值类型 |
AVG |
计算某一列的平均值,该列必须为数值类型 |
MAX |
计算某一列的最大值 |
MIN |
计算某一列的最小值 |
注意,MAX()和MIN()函数并不限于数值类型。如果是字符类型,MAX()和MIN()会返回排序最后和排序最前的字符。
-- 使用聚合查询计算男生平均成绩: SELECT AVG(score) average FROM students WHERE gender = 'M';
要特别注意:如果聚合查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL:
-- WHERE条件gender = 'X'匹配不到任何行: SELECT AVG(score) average FROM students WHERE gender = 'X';
分组
GROUP BY
-- 查出每个班级的平均分,结果集应当有6条记录: SELECT class_id, gender,AVG(score) FROM students GROUP BY gender,class_id;
class_id |
gender |
AVG(score) |
1 |
M |
89 |
1 |
F |
84 |
2 |
F |
81 |
2 |
M |
70 |
3 |
F |
89.5 |
3 |
M |
89 |
语法: INSERT INTO (字段1,字段2) VALUES (值1,值2,值N...)
添加一条记录
insert into students(class_id,name,gender,score)values (2,'daniu','M',80)
添加多条记录
insert into students(class_id,name,gender,score)values (2,'daniu','M',80),(3,'xxx','M',90)
语法: update 表名 set 字段1=值1,字段2=值2 where ...;
eg: update students set name=‘大牛’,score=66 where id=6;
UPDATE students SET score=60;
这时,整个表的所有记录都会被更新。所以,在执行
UPDATE语句时要非常小心,最好先用SELECT语句来测试WHERE条件是否筛选出了期望的记录集,然后再用UPDATE更新。
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
语法
delete from 表名 where..;
DELETE FROM students;
这时,整个表的所有记录都会被删除。所以,在执行DELETE语句时也要非常小心,最好先用SELECT语句来测试WHERE条件是否筛选出了期望的记录集,然后再用DELETE删除。
Query OK, 1 row affected (0.01 sec)
关系模型
查询数据
修改数据