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 StuInfoSELECT * FROM studentSELECT * FROM courseSELECT * 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:排序列为空值的元组最后显示

 

 

 

 

收录于合集 #数据库
 7
上一篇数据库增删改语句下一篇LAMP 架构
阅读 89
Linux分布式主任
55篇原创内容
 
posted @ 2023-06-30 09:41  往事已成昨天  阅读(279)  评论(0编辑  收藏  举报