对表进行查询数据
SELECT语句
select语句用来查询数据库数据,是数据库语言中最核心、最重要的语句,也是使用频率最高的语句。
select语法:
/*
SELECT [ALL | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] #联合查询
[WHERE ...] #指定结果需满足的条件
[GROUP BY ...] #指定结果按照哪几个字段来分组
[HAVING] #过滤分组的记录必须满足的次要条件
[ORDER BY ...] #指定查询记录按一个或多个条件排序
[LIMIT {[offset,]row_count | row_countOFFSET offset}];
# 指定查询的记录从哪条至哪条
*/
查询指定字段:
Select 字段名1,字段名2,字段名3,... from 表名;
对表中的列的数据进行查询,结果为该列的所有值。
select StudentName,StudentNo from student;
/*在student表中,对学生学号和学生姓名进行查询*/
*,星号代表全部的意思,可以用来查询整个表的数据。
AS语句
as语句用来起别名,可以给列起别名,也可以给表起别名,还可以给计算或总结的结果起一个新的名字。
select StudentNo AS 学号,StudentName as 姓名 from student; //给指定的数据列起别名
select StudentName,StudentNo from student as s; //给表起别名
select 100*3-1 as 计算结果; //给计算的结果起别名
DISTINCT关键字的使用
用于去除select语句查询结果中重复的记录,只保留一条。
select distinct StudentNo from result; //在成绩表中,因为一个学生会考多门课程,所以不使用distinct关键字,那么查询的结
果会是同一个学号会出现多次,使用之后,重复的学号就被去掉了。
where语句
where条件语句用于检索数据表中符合条件的记录,搜索条件可由一个或多个逻辑表达式组成。
逻辑操作符
操作符名称 | 语法 | 描述 |
---|---|---|
AND或&& | a AND b 或 a && b | 逻辑与,同时为真人,结果才为真 |
OR或丨丨 | a AND b 或 a丨丨b | 逻辑或,只要有一个为真,结果就为真 |
NOT或! | NOT a或!a | 逻辑非,若操作数为假,结果则为真 |
select StudentNo,StudentResult
from result
where StudentResult>=95 and StudentResult<=100; // 查询成绩在95到100之间的学生的学号和成绩。
select StudentName from student where Address='' or Address is null; //查询地址为null的学生姓名
select StudentNo,StudentResult
from result
where StudentNo!=1000; //查询学号不是1000的学生的学号和成绩
比较操作符
操作符名称 | 语法 | 描述 |
---|---|---|
is NULL | a is NULL | 若操作符为NULL,则结果为真 |
is NOT NULL | a is NOT NULL | 若操作符不为NULL,则结果为真 |
BETWEEN | a BETWEEN b AND c | 若a范围在b与c之间,则结果为真 |
LIKE | a LIKE b | SQL模式匹配,若a匹配b,则结果为真 |
IN | a IN (a1,a2,a3,…) | 若a等于a1,a2。。。中的某一个,则结果为真 |
select StudentName from student where BornDate is null; //查询出生日期没有填写的学生姓名
select StudentName from student where BornDate is not null ; //查询出生日期填写的学生姓名
select StudentNo,StudentResult
from result
where StudentResult between 95 and 100; //查询成绩在95到100之间的学生学号和姓名
select StudentNo,StudentName from student where StudentName like '%文%'; //查询名字中带有文字的学生学号和姓名
select StudentNo,StudentName from student where StudentNo in (1000,1001,1002); //查询学号是1000,1001,1002的学生学号和姓名
连接查询
在查询数据时,由于要查询的数据在两张表中,这时就需要进行连接查询。
连接查询分为内连接,外连接和自连接。外连接又分为左连接和右连接。
操作符名称 | 描述 |
---|---|
INNER JOIN | 如果表中有至少一个匹配,则返回行 |
LEFT JOIN | 即使右表中没有匹配 ,也从左表中返回所有的行 |
RIGHT JOIN | 即使左表中没有匹配,也从右表中返回所有的行 |
select s.StudentNo,StudentName,SubjectNo,StudentResult
from student s
inner join result r
on r.StudentNo=s.StudentNo;
//通过学号这个公共字段将student表和result表进行内连接,查询学生学号,姓名,课程号和成绩。
//内连接是组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集部分。
select s.StudentNo,StudentName,SubjectNo,StudentResult
from student s
right join result r
on s.StudentNo=r.StudentNo;
//通过学号这个公共字段将student表和result表进行右连接,查询学生学号,姓名,课程号和成绩。
//左表只会显示符合搜索条件的记录,而右表的记录将会全部表示出来。左表记录不足的地方均为NULL。
select s.StudentNo,StudentName,SubjectNo,StudentResult
from student s
left join result r
on s.StudentNo = r.StudentNo;
//通过学号这个公共字段将student表和result表进行左连接,查询学生学号,姓名,课程号和成绩。
//左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
自连接
数据表与自身进行连接
我们以先行课为例:
id代表课程号,subjectname代表课程名字,AdvanceClassid代表先行课id
先行课表示我们在学习这门课程之前要先学习这门课程的先行课,比如说我们要学习计算机,那么我们要先学习数学。如果要学习数据库,那么要先学习计算机。所以说数学是计算机的先行课,计算机是数据库的先行课。
我们将这张表进行自连接,那么就可以得到上述这些结果。
select a.subjectname as '先行课',b.subjectname as '课程名'
from subject as a,subject as b
where a.id=b.AdvanceClassid;
得到的结果就为:
ORDER BY语句
order by语句用于对查询的结果进行排序,默认是按照ASC进行升序,使用关键字DESC可以对结果降序排序。
select s.StudentNo,StudentName,SubjectName,StudentResult
from student s
inner join result r
on s.StudentNo=r.StudentNo
inner join subject sub
on r.SubjectNo=sub.SubjectNo
where SubjectName='数据库结构-1'
order by StudentResult desc;
//查询 课程为数据库结果-1的所有信息(学号,学生姓名,课程名,课程成绩) 将结果进行降序排序
分页
分页的关键字为LIMIT,可以将查询的结果进行分页
语法:
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
//其中 [offset,] rows 指的是从第几行开始 , rows OFFSET offset 指的是每页有多少行
//例如:
select * from student
limit 0,5;
//查询学生的所有信息,从第0行开始,显示5行
GROUP BY语句
“Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
比如说我们想要查看每个课程的考试人数是多少
select count(*)as 考试人数,SubjectNo as 课程号
FROM result
GROUP BY SubjectNo;
//以课程号分组,查询每个课程号的考试人数
HAVING语句
HAVING语句是在GROUP BY语句之后使用,对分组的数据进行过滤。 所以,有GROUP BY语句才能有HAVING子句。
SELECT SubjectNo AS 课程号,COUNT(*)AS 考试人数
FROM result
WHERE SubjectNo BETWEEN 10 AND 16
GROUP BY SubjectNo
HAVING COUNT(*)>=18;
//查询课程号在10到16之间,并且考试人数大于等于18人的课程号和考试人数
简单的数据库函数
SELECT ABS(-8); //取绝对值
SELECT CEILING(9.4); //向上取整
SELECT FLOOR(9.4); //随机数
SELECT RAND(); //返回0-1之间的随机数
SELECT CHAR_LENGTH('I LOVE YOU'); //返回字符串包含的字符数
SELECT REPLACE('I LOVE YOU','YOU','THE WORLD'); //替换字符串
SELECT SUBSTR('狂神说坚持就能成功',4,6); //截取字符串
SELECT NOW(); //获取当前日期和时间
SELECT YEAR(NOW()); //获取当前年份
SELECT MONTH(NOW()); //获取当年月份
SELECT VERSION(); //获取版本信息
SELECT USER(); //获取用户信息
聚合函数
函数名称 | 描述 |
---|---|
COUNT() | 返回满足select条件记录总和数 |
SUM() | 返回数字字段或表达式列做统计,返回一列的总和 |
AVG() | 返回数字字段或表达式做统计,返回一列的平均值 |
MAX() | 可以为数值字段、字符字段或表达式列做统计,返回最大的值 |
MIN() | 可以为数值字段、字符字段或表达式列做统计,返回最小的值 |