SQL语法
添加
sql
INSERT INTO 表名
VALUES (每个属性对应的值);
删除
sql
DELETE FROM 表名
WHERE 条件 //如果不写条件,那么该表的内容会被全部删除
修改
sql
UPDATE 表名
SET 字段名=字段值,字段名=字段值...
WHERE 条件 //与删除一样,如果不写where条件,那么所有记录都会被修改
查询
基本查询
sql
SELECT * FROM 表名 //查询所有
SELECT 字段名,字段名...
FROM 表名 //查询指定字段
SELECT DISTINCT 字段名,字段名...
FROM 表名 //查询指定字段,返回唯一不同的值
条件查询
sql
-- 单条件查询
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) 区间的记录
更多运算符如下:
分组函数/聚合函数
sql
sum 求和
avg 取平均
max 取最大值
min 取最小值
count 取得记录数 //count(*)表示取得当前查询表所有记录; count(字段名称),不会统计为null的记录
分组查询
sql
-- 按照字段值进行分组,查找组内的平均年龄
SELECT AVG(age) FROM 表名 GROUP BY 字段名
排序
sql
SELECT * FROM 表名 ORDER BY 字段名 (ASC) //按照字段值进行排序,默认正序
SELECT * FROM 表名 ORDER BY 字段名 DESC //倒序排序
sql
-- 先按照字段1的值进行倒序排序,再将字段1的值相同的记录按照字段2正序排序
SELECT * FROM 表名
ORDER BY 字段名1 DESC,字段名2
sql
-- 先按照字段1的值进行倒序排序,再将字段1的值相同的记录按照字段2倒序排序
SELECT * FROM 表名
ORDER BY 字段名1 DESC,字段名2 DESC
分页查询(限制查询)
sql
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
//查询出第六条到第八条记录
多表查询
sql
SELECT s.name,c.class_name
FROM student s,class c //如果没有连接条件,那么查询结果为俩张表的指定字段的所有记录
连接查询根据年代分类
1、SQL92写法 缺点:表连接条件与查询条件放在一起,没有分离
格式:select xxx from A 表名,B表名 where 表连接条件 and 数据查询条件
sql
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 表的连接条件
sql
select student.name,class.class_name FROM student
JOIN class ON student.class_num = class.class_num
连接查询根据连接方式分类
1、内连接
sql
SELECT student.name,class.class_name FROM student
INNER JOIN class ON student.class_num = class.class_num
2、左外连接
包含左边表的全部行(不管右边的表中是否存在与他们匹配的行),以及右边表中全部匹配的行
sql
SELECT student.name,class.class_name from student
LEFT JOIN class on student.class_num = class.class_num
3、右外连接
包含右边表的全部行(不管右边的表中是否存在与他们匹配的行),以及左边表中全部匹配的行
sql
SELECT student.name,class.class_name FROM student
RIGHT JOIN class ON student.class_num = class.class_num
多张表连接的语法格式
sql
select xxx from A表
join B表 on 连接条件1
join C表 on 连接条件2
嵌套查询
一般在子查询中,程序先运行在嵌套在最内层的语句,再运行外层。
因此在写子查询语句时,可以先测试下内层的子查询语句是否输出了想要的内容,
再一层层往外测试,增加子查询正确率。否则多层的嵌套使语句可读性很低。
sql
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语句书写顺序
sql
SELECT DISTINCT <字段名>
FROM <表名>
JOIN <表名>
ON <连接条件>
WHERE <筛选条件>
GROUP BY <字段名>
HAVING <筛选条件>
UNION
ORDER BY <字段名>
LIMIT <限制行数>;