MySQL-select查询语句
Select 查询语句
查询最基本的方式是SELECT语句,其功能十分强大。它能够以任意顺序、从任意数目的列中查询数据,并在查询过程中进行计算,甚至能包含来自其他表的数据。
一、Select 语句基本格式
SELECT语句的语法结构如下:
SELECT [ALL | DISTINCT][TOP n] <选择列表>
[FROM] {<表或视图名>} [,…n]
[WHERE] <搜索条件>
[GROUP BY] {<分组表达式>}[,…n]
[HAVING] <分组条件>
[ORDER BY] {<字段名[ASC|DESC]>} [,…n]
用[ ]括起来的是可选项,SELECT 是必需的
选择列表指定了要返回的列
WHERE 子句指定限制查询的条件 ,在搜索条件中,可以使用比较操作符、字符串、逻辑操作符来限制返回的行数
FROM 子句指定了返回的行和列所属的表
DISTINCT 选项从结果集中消除了重复的行,TOP n 选项限定了要返回的行数,PERCENT 百分比
GROUP BY 子句是对结果集进行分组
HAVING 子句是在分组的时候,对字段或表达式指定搜索条件
ORDER BY 子句对结果集按某种条件进行排序,ASC升序(默认),DESC降序
二、查询案例:
关键字DISTINCT的含义是对结果中的重复行只选择一个,以保证行的唯一性。
列名之后使用AS关键字来更改查询结果中的列标题名。如sno AS 学号;
查询一个表全部列,选择表的全部列时,可以使用星号“*”来表示所有的列。
可以使用TOP n [PERCENT]可选子句。其中n是一个正整数,表示返回查询结果的前n行。若使用PERCENT关键字,则表示返回结果的前n%行。
案例:
1、查询标表所有记录
检索students表、course表和sc表中的所有纪录。
T-SQL语句为:
USE StuInfo
SELECT * FROM student
SELECT * FROM course
SELECT * FROM sc
也可以将三个表的操作合并为一条语句,使结果在一个表中显示:
SELECT student.*, course.*, sc.* FROM student, course, sc
2、为列设置别名
通常情况下,当从一个表中取出列值时,该值与列的名称是联系在一起的。如上例中从student表中取出学号与学生姓名,取出的值就与sno和sname有联系。当希望查询结果中的列使用新的名字来取代原来的列名称时,可以使用以下方法:
-
列名之后使用AS关键字来更改查询结果中的列标题名。如sno AS 学号;
-
直接在列名后使用列的别名,列的别名课带双引号、单引号或不带引号。
案例:
检索student表中学生的Sno、Sname、Sage和Sdept,结果中各列的标题分别指定为学号、学生姓名、年龄和所属院系。
SELECT sno as 学生学号, sname 学生姓名, sage '年龄' ,sdept "所属院系" FROM student
3、计算列值
使用SELECT语句对列进行查询时,SELECT后可以跟列的表达式。也就是说,使用SELECT语句不仅可以查询原来表中已有的列,还可以通过计算得到新的列。
案例:
查询sc表中的学生成绩,并且显示折算后的分数。(折算方法:原始分数*1.2)
SELECT sno,grade AS 原始分数, grade*1.2 AS 折算后分数 FROM sc
4、去除重复记录
关键字DISTINCT的含义是对结果中的重复行只选择一个,以保证行的唯一性。
案例:
从student表中查询所有的院系信息,并去掉重复信息。T-SQL语句为:
SELECT DISTINCT sdept FROM student
注:与DISTINCT相反,当使用关键字ALL时,将保留结果中的所有行。在省略DISTINCT和ALL的情况下,SELECT语句默认为ALL。
5、限制返回行数
若SELECT语句返回的结果行数非常多,而用户只需要返回满足条件的前几条纪录,可以使用TOP n [PERCENT]可选子句。其中n是一个正整数,表示返回查询结果的前n行。若使用PERCENT关键字,则表示返回结果的前n%行。
案例:
查询student表中前10个学号。
SELECT TOP 10 * FROM student
三、条件查询:
1、使用比较运算符
使用“=” 比较运算符,只选择一条记录。还可以通过“>”、“<”、“>=”、“<=”等比较运算符,选出多条记录。
2、使用字符串比较符LIKE
LIKE 只可用于下列数据类型:char、nchar、varchar、nvarchar 和datetime。常用的通配符如表4.3所示。
例如:
like 'a%' 表示以a开头的任意字符串;
like '%a%' 表示包含a的任意字符串;
like 'a_' 表示以a开头后面是一个字符的字符串;
like '[a,b,c,d]%' 表示以a、b、c、d中任意一个字符开头的任意字符串
like 'a[^b]%' 表示以a开头,第二个字符不是b的任意字符串
select s_id,s_name
from student
where s_name like '张%'
3、使用逻辑运算符
使用逻辑运算符AND、OR和NOT来连接一系列表达式并且简化查询处理。
4、检索一定范围内的值BETWEEN…AND
5、使用值列表作为搜索条件IN
在WHERE子句中,可使用IN搜索条件检索与指定值列表相匹配的行。如in (2,3,4) not in (2,3,4) 不在这个范围之内。
6、检索未知值
值为“空”并非没有值,而是一个特殊的符号“NULL”。一个字段是否允许为空,需要在建立表的结构时设置。当要判断一个表达式的值是否为空值时,使用IS NULL关键字
四、对查询结果进行排序
ORDER BY子句格式为:
ORDER BY 排序表达式 [ASC|DESC]
其中ASC代表升序,DESC表示降序,默认时为升序排列。对数据类型为TEXT、NTEXT和IMAGE的字段不能使用ORDER BY进行排序。
五、SQL 日期日期函数:
常用日期时间函数表
常见日期时间函数的缩写
例:
datename(year,getdate())表示从当前日期中获取年。
Dateadd(dd,1,'1978-1-3')表示把1加到日期数据中的年上,结果为:‘1979-1-3’。
Datediff(yy,'1978-1-1','1979-2-3')得到的结果为1
六、对查询结果进行统计
聚合函数
注意:SUM和AVG后的列或表达式的值必须为数值型;除了COUNT函数之外,如果没有满足where子句的行,所有聚合函数都将返回一个空值,而COUNT返回的是0。
任务5 检索0003号课程的最高成绩和最低成绩
MAX()返回表达式中的最大值,MIN()返回表达式中的最小值,这两个函数不仅可以用于数值类型数据,也可以用于字符型和日期/时间类型的值。
select max(result) 最高成绩,min(result) 最低成绩
from s_c
where course_id='0003'
任务6 检索男女生人数
统计个数需要使用count()函数。Count有2种形式:count(*)用于计算表中总的行数,不管某列有数值或者是空值;count(列名)用于计算指定列的函数,计算时忽略列值为空的行。
select s_sex 性别 ,count(*) 人数
from student
group by s_sex
对结果进行分组:
GROUP BY子句用于对表或视图中的数据按字段分组,还可以利用HAVING短语按照一定的条件对分组后的数据进行筛选。
GROUP BY子句格式为:
GROUP BY [ALL] 分组表达式 [HAVING 查询条件]
选择条件中包含聚合函数时,必须使用having子句,而having子句必须与group by 子句一起使用,用来实现对分组之后的结果进行筛选。
Having子句与where子句功能有些类似,两者的区别在于:having子句中可以包含聚合函数,而where子句不可以;where子句的条件在分组之前执行,having子句的条件在分组之后执行。
七、条件查询
条件查询是用的最多的一种查询方式,通过在WHERE子句中设置查询条件可以挑选符合需要的数据、修改某一记录、删除某一记录。
在SELECT语句中,WHERE子句必须紧跟在FROM子句之后,其基本格式如下:
格式:where<查询条件>
常用的查询条件:
查询条件 |
运算符 |
说明 |
比较 | =(等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、!=(不等于)、<>(不等于)、!<(不小于)、!>(不大于) | 比较大小 |
运算逻辑 | AND、OR、NOT | 用于逻辑运算符判断,也可用于多重条件的判断 |
字符匹配 | LIKE、NOT LIKE | 判断值是否与指定字符通配格式相符 |
确定范围 | BETWEEN...AND...、NOT BETWEEN...AND... | 判断值是否在范围内 |
确定集合 | IN、NOT IN | 判断值是否为列表中的值 |
空值 | IS NULL、IS NOT NULL | 判断值是否为空 |
1、使用比较运算符
案例:
在student表中查询信息系(IM)的学生
SELECT * FROM student WHERE sdept=N'IM'
在课程表中查询学分为4分的课程
SELECT * FROM 课程 WHERE 学分 = 4
2、使用逻辑运算符
逻辑运算符包括AND、OR和NOT,用于连接WHERE子句中的多个查询条件。当一条语句中同时含有多个逻辑运算符时,取值的优先顺序为:NOT、AND和OR。
案例:
在student表中查询年龄在小于18或者大于22,并且籍贯是河南的学生信息。
SELECT * FROM student WHERE (sage<18 or sage>22) and jg=N'河南'
3、使用LIKE模式匹配
LIKE 只可用于下列数据类型:char、nchar、varchar、nvarchar 和datetime。常用的通配符如表4.3所示。
like 'a%' 表示以a开头的任意字符串;
like '%a%' 表示包含a的任意字符串;
like 'a_' 表示以a开头后面是一个字符的字符串;
like '[a,b,c,d]%' 表示以a、b、c、d中任意一个字符开头的任意字符串
like 'a[^b]%' 表示以a开头,第二个字符不是b的任意字符串
select s_id,s_name
from student
where s_name like '张%'
案例:
在students表中查询姓“赵”的学生信息。
SELECT * FROM student WHERE sname like N'赵%'
检索不姓“张”也不姓“孙”的学生的学号和姓名
SELECT s_id,s_name FROM student WHERE s_name NOT LIKE ‘[张孙]%’
检索所有姓张的同学
SELECT s_id,s_name FROM student WHERE s_name = '张%'
检索不姓“张”也不姓“孙”的学生的学号和姓名
SELECT s_id,s_name FROM student WHERE s_name like '[^张孙]%'
或
SELECT s_id,s_name FROM student WHERE s_name not like '[张孙]%'
4、范围查询
范围有关的关键字有两个:BETWEEN和IN。
使用BETWEEN…AND…来指出查询范围。其中,AND的左端给出查询范围的下限,AND的右端给出查询范围的上限。
案例:
查询成绩在60到80分的学生情况
SELECT * FROM 成绩表 WHERE grade between 60 and 80
查询年龄不在20~23岁之间的学生姓名、系别和年龄
Select Sname,Sdept,Sage From Student Where Sage Not Between 20 and 23
关键字IN用来表示查询范围属于指定的集合。集合中列出所有可能的值,当表中的值与集合中的任意一个值匹配时,即满足条件。
案例:
查询外语系、经管系系和计算机系学生的姓名、性别
Select Sname,Ssex From Student Where Sdept in ('外语','计算机','经管')
查询既不是外语、文传,也不是计算机系的学生的姓名和性别
SELECT Sname,Ssex FROM Student WHERE Sdept not in ('外语','计算机','文传')
5、涉及空值NULL的查询
值为“空”并非没有值,而是一个特殊的符号“NULL”。一个字段是否允许为空,需要在建立表的结构时设置。当要判断一个表达式的值是否为空值时,使用IS NULL关键字
案例:
查询缺少单科成绩的学生的信息。
SELECT * FROM sc WHERE grade IS NULL
检索没有填写家庭住址的学生的学号和姓名
select s_id,s_name from student where s_address is null
说明:如果查询不为空则使用is not null,例如查询家庭住址不为空的学生的学号和姓名,则语句为:select s_id,s_name from student where s_address is not null ,而不能使用其它形式。
6、year年份查询
常用日期时间函数表
常见日期时间函数的缩写
说明:GETDATE()为日期时间函数,功能是获得当前系统的日期和时间;year()函数的功能是获得日期时间数据中的年。
例:datename(year,getdate())表示从当前日期中获取年。
Dateadd(dd,1,'1978-1-3')表示把1加到日期数据中的年上,结果为:‘1979-1-3’。
Datediff(yy,'1978-1-1','1979-2-3')得到的结果为1
案例:
检索学生的学号、姓名及年龄
select s_id ,s_name ,year(GETDATE())-year(s_borndate) as age from student
检索年龄在22~25的学生的学号和姓名
SELECT s_id,s_name FROM student WHERE YEAR(GETDATE()) -YEAR (s_borndate) BETWEEEN 22 AND 25
使用ORDER BY子句可以按一个或多个属性列排序
升序:ASC;降序:DESC;缺省值为升序
当排序列含空值时
ASC:排序列为空值的元组最先显示
DESC:排序列为空值的元组最后显示