主键:
主键是关系表中记录的唯一标识。主键的选取非常重要:主键不要带有业务含义(指:
身份证号,email这些看似唯一的字段
),而应该使用BIGINT自增或者GUID类型。主键也不应该允许
NULL
。
可以使用多个列作为联合主键,但联合主键并不常用。
外键:
关系数据库通过外键可以实现一对多、多对多和一对一的关系。外键既可以通过数据库来约束,也可以不设置约束,仅依靠应用程序的逻辑来保证。
索引:
通过对数据库表创建索引,可以提高查询速度。
通过创建唯一索引,可以保证某一列的值具有唯一性。
数据库索引对于用户和应用程序来说都是透明的。
查询:
使用SELECT查询的基本语句
SELECT * FROM <表名>
可以查询一个表的所有行和所有列的数据。
SELECT查询的结果是一个二维表。
条件查询:
语法:
SELECT * FROM
<
表名
>
WHERE
<
条件表达式
>
通过
WHERE
条件查询,可以筛选出符合指定条件的记录,而不是整个表的所有记录。
AND 与:条件表达式可以用
<条件1> AND <条件2>
表达满足条件1并且满足条件2
OR 或:
第二种条件是
<条件1> OR <条件2>
,表示满足条件1或者满足条件2
NOT 非:
第三种条件是
NOT <条件>
,表示“不符合该条件”的记录
如果不加括号,条件运算按照
NOT
、
AND
、
OR
的优先级进行,即
NOT
优先级最高,其次是
AND
,最后是
OR
。加上括号可以改变优先级。
BETWEEN(区间):
WHERE score BETWEEN 60 AND 90;
常用的条件表达式
条件
|
表达式举例1
|
表达式举例2
|
说明
|
使用=判断相等
|
score = 80
|
name = 'abc'
|
字符串需要用单引号括起来
|
使用>判断大于
|
score > 80
|
name > 'abc'
|
字符串比较根据ASCII码,中文字符比较根据数据库设置
|
使用>=判断大于或相等
|
score >= 80
|
name >= 'abc'
|
|
使用<判断小于
|
score < 80
|
name <= 'abc'
|
|
使用<=判断小于或相等
|
score <= 80
|
name <= 'abc'
|
|
使用<>判断不相等
|
score <> 80
|
name <> 'abc'
|
|
使用LIKE判断相似
|
name LIKE 'ab%'
|
name LIKE '%bc%'
|
%表示任意字符,例如'ab%'将匹配'ab','abc','abcd'
|
投影查询:
如果我们只希望返回某些列的数据,而不是所有列的数据,我们可以用
SELECT 列1, 列2, 列3 FROM ...<表名>
,让结果集仅包含指定列。这种操作称为投影查询。
例:SELECT id, score points, name FROM students;
使用
SELECT *
表示查询表的所有列,使用
SELECT 列1, 列2, 列3
则可以仅返回指定列,这种操作称为投影。
SELECT
语句可以对结果集的列进行重命名。
排序:
ORDER BY
子句:从低到高
列:
SELECT id, name, gender, score FROM students ORDER BY score;(按照分数排序)
倒序( 在末尾
加上
DESC
表示“倒序”):
SELECT id, name, gender, score FROM students ORDER BY score
DESC
;
如果
score
列有相同的数据,要进一步排序,可以继续添加列名。
例,使用
ORDER BY score DESC, gender
表示先按
score
列倒序,如果有相同分数的,再按
gender
列排序:
SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;
默认的排序规则是
ASC
:“升序”,即从小到大。
ASC
可以省略,即
ORDER BY score ASC
和
ORDER BY score
效果一样
--查询一班成绩的按照倒序排序(两个条件,先限制条件为一班,再把一班学生的成绩按照倒序排序)
SELECT id,name,gender,score from students where class_id=1 ORDER BY score desc;
使用ORDER BY可以对结果集进行排序;
可以对多列进行升序、倒序排序。
分页(数据过多时采用分页查询):
分页实际上就是从结果集中“截取”出第M~N条记录。这个查询可以通过
LIMIT <M> OFFSET <N>
子句实现
OFFSET
超过了查询的最大数量并不会报错,而是得到一个空的结果集。
注意:
OFFSET是可选的,如果只写LIMIT 15,那么相当于LIMIT 15 OFFSET 0。
在MySQL中,LIMIT 15 OFFSET 30还可以简写成LIMIT 30, 15。
使用LIMIT <M> OFFSET <N>分页时,随着N越来越大,查询效率也会越来越低。
使用LIMIT <M> OFFSET <N>可以对结果集进行分页,每次查询返回结果集的一部分;
分页查询需要先确定每页的数量和当前页数,然后确定LIMIT和OFFSET的值。
聚合查询:
COUNT(*):
表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是
COUNT(*)
COUNT(*)
和
COUNT(id)
实际上是一样的效果,可以使用where
进行条件查询:
--
使用聚合查询并设置WHERE条件:
SELECT COUNT(*) boys FROM students WHERE gender = 'M';
函数
|
说明
|
SUM
|
计算某一列的合计值,该列必须为数值类型
|
AVG
|
计算某一列的平均值,该列必须为数值类型
|
MAX
|
计算某一列的最大值
|
MIN
|
计算某一列的最小值
|
COUNT
|
计算某一列的总和
|
聚合分组查询:
按class_id分组
例子:SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;
一定不能少“,”逗号
使用SQL提供的聚合查询,我们可以方便地计算总数、合计值、平均值、最大值和最小值;
聚合查询也可以添加WHERE条件。
多表查询: