DQL(Data Query Language,数据查询语言)。可以通过SELECT 查询数据库数据,可以进行简单的单表查询或者多表的复杂查询和嵌套查询。它是数据库语言中最核心、最重要的语句。
SELECT [ALL | DISTINCT]
{ * | table. * | [table.field1 [as alias1] [,table.field2 [as alias2]] [,...]] }
FROM table_name [as table_alias]
[left | out | inner join table_name2] # 联合查询
[ WHERE ...] # 指定结果需满足的条件
[GROUP BY ..] # 指定结果按照那几个字段来分组
[HAVING ..] # 过滤分组的记录必须满足的次要条件
[ORDER BY ...] # 指定查询记录按一个或者多个条件排序
[LIMIT {[offset,] row_count | row_count OFFSET offset }];
# 指定查询的记录是从那条至哪条
1.查询表中所有的数据列结果,采用“*”符号。(效率低)
2.查询指定字段/列
除了照本宣科的查询指定字段外,还可以给查询出的字段临时更换名字,AS关键字可以把经计算或总结的结果用另一个新名称来代替,可以省略,别名可不添加引号,表格也可添加别名。
DISTINCT 去掉 SELECT 查询返回的记录结果中重复的记录(所有返回列的值都相同),只返回一条,ALL关键字是默认的,返回所有的记录,与之相反。
WHERE 条件语句一般用于检索数据表中符合条件的记录,搜索条件可由一个或多个逻辑表达式组成,结果一般为真或假。
在WHERE条件语句中也可以出现关系运算符和比较运算符,关系运算符 > < >= <= <> !=,数值数据类型的记录之间才能进行算术运算,相同数据类型的数据之间才能进行比较
between …and 可以滚据一个范围值来检索,等同于>= 和 <= 联合使用
in范围查询,查询的字段x的值,至少与括号中的一个值相同,多个值之间用英文逗号隔开。
在数据表中,很多列的数据如果不指定默认值,默认值为Null,Null代表“无值”,区别在于零值0和空符串“ ”,只能出现在定义允许为NULL的字段,须使用IS NULL 或 IS NOT NULL 比较操作符去比较。
通过上方的图片,从表结构和数据上我们知道,这些表之间通过一个或多个外键(逻辑)进行关联,某些表的某些数据分散到了其他表存储。
连接查询分类包括:
内链接(inner join):等值和非等值的连接查询、自身连接查询
外连接(out join):左连接(LEFT JOIN)、有链接(RIGHT JOIN)。
# 内连接:显式内连接、隐式内连接
# 查询学生的姓名和所在年级
SELECT stuName,gradeId FROM student;
# 采用显式内连接[推荐给多表起别名 区分清楚 防止出现模糊不清错误]
# 内连接可以理解为交集
SELECT
stu.stuName,g.gradeName
FROM
student stu
INNER JOIN grade g
ON stu.gradeId = g.gradeId; # 关联条件
上方的内链接一般称为显示内链接,还有一种内链接方式为隐式内链接。
# 采用隐式内连接查询 笛卡尔积
SELECT
stu.stuName,g.gradeName
FROM
student stu,grade g
SELECT
stu.stuName,g.gradeName
FROM
student stu,grade g
WHERE
stu.gradeId = g.gradeId;
# 查询所有的学生姓名、课程名称、考试成绩
SELECT
stu.stuName,sub.subjectName,r.result
FROM
student stu,`subject` sub,result r
WHERE
stu.stuId = r.stuId
AND
sub.subjectId = r.subjectId;
外连接查询分为两种,左外连接,右外连接。
左外连接:从左表(table_1)中返回所有的记录,即便在右(table_2)中没有匹配的行。
SELECT 字段1,字段2,...
FROM table_1
LEFT [OUTER] JOIN
table_2
ON
table_1.字段x = table2_2.字段y;
右外连接:从右表(table_2)中返回所有的记录,即便在左(table_q)中没有匹配的行。
SELECT 字段1,字段2,...
FROM table_1
RIGHT [OUTER] JOIN
table_2
ON
table_1.字段x = table2_2.字段y;
有时候信息的关联可能发生在一张表内,那么这时候就需要进行自连接查询,其实也是可以随意使用内连接和外连接,只不过实在同一张表中进行这些操作而已。
CREATE TAHLE IF NOT EXISTS category(
id int(10) auto_increment primary key,
categoryName varchar(32) not null;
pid int(10)
);
# 查询游戏名称和所属分类
SELECT
c1.categoryName,c2.categoryName
FROM
category c1,category c2
WHERE
c1.pid = c2.id
某些需求需要以某字段的排序顺序进行查询,这时候就需要排序查询ORDER BY语句,它是对SELECT语句查询得到的结果,按某些字段进行排序,与DESC(降序)或ASC(升序)搭配使用,默认为升序。
SELECT
stu.stuName,sub.subjectName,r.result
FROM
student stu,`subject` sub,result r
WHERE
stu.stuId = r.stuId
AND
sub.subjectId = r.subjectId
ORDER BY
r.result DESC;
限制查询(分页)
在出现数据量比较大的时候,在一页查看数据是一件非常麻烦的事情,经常需要数据分页显示
# 查询前三条男生信息
SELECT * FROM students WHERE gender='男' limit 0,3;
在实现分页查看数据时,例如:现在每页显示10条数据,我想查看第三页的数据。那么我们在使用LIMIT时,这个页码对应的LIMIT位置偏移量有一个计算公式:(currentPage 页码-1)* pageSize每页显示的数据条数。
子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句或其他子查询的查询
子查询使用注意事项: