SQL语法
- 添加
- 删除
- 修改
- 查询
- 基本查询
- 条件查询
- 分组函数/聚合函数
- 分组查询
- 排序
- 分页查询(限制查询)
- 多表查询
- 连接查询根据年代分类
- 连接查询根据连接方式分类
- 1、内连接
- 2、左外连接
- 3、右外连接
- 多张表连接的语法格式
- 嵌套查询
- SQL语句书写顺序
添加
INSERT INTO 表名
VALUES (每个属性对应的值);
删除
DELETE FROM 表名
WHERE 条件 //如果不写条件,那么该表的内容会被全部删除
修改
UPDATE 表名
SET 字段名=字段值,字段名=字段值...
WHERE 条件 //与删除一样,如果不写where条件,那么所有记录都会被修改
查询
基本查询
SELECT * FROM 表名 //查询所有
SELECT 字段名,字段名...
FROM 表名 //查询指定字段
SELECT DISTINCT 字段名,字段名...
FROM 表名 //查询指定字段,返回唯一不同的值
条件查询
-- 单条件查询
SELECT * FROM 表名 WHERE condition
-- 多条件查询
SELECT * FROM 表名 WHERE condition1 and condition2 //得到两个条件都满足的记录
SELECT * FROM 表名 WHERE condition1 or condition2 //得到两个条件至少满足一个的记录
-- 指定字段查询范围
SELECT * FROM 表名 WHERE name in ('张三','李四') //查询括号中每个name对应的记录
SELECT * FROM 表名 WHERE age between (10,20) //查询age在 [10,20) 区间的记录
更多运算符如下:
分组函数/聚合函数
sum 求和
avg 取平均
max 取最大值
min 取最小值
count 取得记录数 //count(*)表示取得当前查询表所有记录; count(字段名称),不会统计为null的记录
分组查询
-- 按照字段值进行分组,查找组内的平均年龄
SELECT AVG(age) FROM 表名 GROUP BY 字段名
排序
SELECT * FROM 表名 ORDER BY 字段名 (ASC) //按照字段值进行排序,默认正序
SELECT * FROM 表名 ORDER BY 字段名 DESC //倒序排序
-- 先按照字段1的值进行倒序排序,再将字段1的值相同的记录按照字段2正序排序
SELECT * FROM 表名
ORDER BY 字段名1 DESC,字段名2
-- 先按照字段1的值进行倒序排序,再将字段1的值相同的记录按照字段2倒序排序
SELECT * FROM 表名
ORDER BY 字段名1 DESC,字段名2 DESC
分页查询(限制查询)
SELECT * FROM 表名 LIMIT A OFFSET B;
第一种解释(分页):
A = pageSize
// 页面大小,即每个页面的记录数
B = pageSize * (pageIndex - 1)
// pageIndex是第几页,SQL的页数从0开始,pageIndex从1开始,所以要 - 1, B必须为A的整数倍
另一种解释:从第B+1条记录开始,查询A条记录(记录从第一条开始);B可以不是A的整数倍
例如:select * from user limit 3 offset 5
//查询出第六条到第八条记录
多表查询
SELECT s.name,c.class_name
FROM student s,class c //如果没有连接条件,那么查询结果为俩张表的指定字段的所有记录
连接查询根据年代分类
1、SQL92写法 缺点:表连接条件与查询条件放在一起,没有分离
格式:select xxx from A 表名,B表名 where 表连接条件 and 数据查询条件
SELECT s.name,c.class_name
FROM student s,class c
WHERE s.class_num = c.class_num //用where写连接条件
2、SQL99写法 优点:表连接独立,结构清晰,如果结果数据不满足要求,可再追加where条件进行过滤;
格式:select xxx from A 表名 join B 表名 on 表的连接条件
select student.name,class.class_name FROM student
JOIN class ON student.class_num = class.class_num
连接查询根据连接方式分类
1、内连接
SELECT student.name,class.class_name FROM student
INNER JOIN class ON student.class_num = class.class_num
2、左外连接
包含左边表的全部行(不管右边的表中是否存在与他们匹配的行),以及右边表中全部匹配的行
SELECT student.name,class.class_name from student
LEFT JOIN class on student.class_num = class.class_num
3、右外连接
包含右边表的全部行(不管右边的表中是否存在与他们匹配的行),以及左边表中全部匹配的行
SELECT student.name,class.class_name FROM student
RIGHT JOIN class ON student.class_num = class.class_num
多张表连接的语法格式
select xxx from A表
join B表 on 连接条件1
join C表 on 连接条件2
嵌套查询
一般在子查询中,程序先运行在嵌套在最内层的语句,再运行外层。
因此在写子查询语句时,可以先测试下内层的子查询语句是否输出了想要的内容,
再一层层往外测试,增加子查询正确率。否则多层的嵌套使语句可读性很低。
select t1.name FROM
(SELECT student.name,relationship.cno FROM student
INNER JOIN relationship on student.sno = relationship.sno) t1 //t1是内层子查询的结果的别名/简称
WHERE t1.cno = '1001';
SQL语句书写顺序
SELECT DISTINCT <字段名>
FROM <表名>
JOIN <表名>
ON <连接条件>
WHERE <筛选条件>
GROUP BY <字段名>
HAVING <筛选条件>
UNION
ORDER BY <字段名>
LIMIT <限制行数>;