不简单的SQL查询和排序语句

真不简单!!

一:使用select语句进行查询

语法:

SELECT    <列名>

FROM      <表名>

[WHERE    <查询条件表达式>]

[ORDER BY <排序的列名>[ASC或DESC]]

eg1:

SELECT               SCode,SName,SAddress

FROM   Students

WHERE               SSEX = 0

ORDER BY   SCode

二:查询所有列和行:

eg:

SELECT * FROM Course 

SELECT * FROM Students 

三:查询部分列

eg:

SELECT SName, SAddress  FROM Students 

SELECT SName ,SGrade  FROM Students

WHERE SAddress = ‘北京‘

四:列别名

eg:

SELECT SCode AS 学生编号,SName  AS 学生姓名,

        SAddress AS 学生地址 

FROM Students

WHERE SAddress <> ‘河南新乡‘

SELECT FirstName + ‘.‘ + LastName AS 姓名

FROM Employees

注意:

1. + 连接的数据类型必须兼容

2. 如果 + 连接字符型数据,结果为字符串数据的连接

3. 如果 + 连接数值型数据,结果为数值的和

五:使用等号命名列

eg:

SELECT  姓名 = FirstName+‘.‘+LastName

FROM Employees

六:查询空行

eg:

SELECT SName FROM Students WHERE SEmail IS NULL

七:使用常量列

eg:

SELECT 姓名=SName,地址= SAddress , ‘北京新兴桥‘ AS 学校名称

FROM Students

八:限制固定行数

eg:

SELECT TOP 5 SName, SAddress

FROM Students WHERE SSex = 0

九:按百分数返回行

eg:

SELECT TOP 20 PERCENT SName, SAddress

FROM Students WHERE SSex = 0

十:相关练习:

查询全部S1的学生信息

查询全部S2的学生的姓名和电话

查询全部S1女同学的信息

查询课时超过60的科目信息

查询 S2的科目名称

查询S2男同学的姓名和住址

查询无电子邮件的学生姓名和年级信息

查询出生日期在1993年之后的S2的学生姓名和年级信息

查询参加了日期为2013年2月15日的“HTML和CSS网页技术”科目考试的成绩信息

十一:升序排列

eg:

SELECT StudentID,Score  FROM Score  ORDER BY Score

SELECT StudentID AS 学生编号,(Score*0.9+5) AS 综合成绩

FROM Score

WHERE (Score*0.9+5)>60

ORDER BY Score

十二:降序排列

eg:

SELECT StudentID,Score  FROM Score  ORDER BY Score DESC

十三:按多列排序

eg:

SELECT StudentID AS 学生编号, CourseID AS 课程ID, Score AS 成绩

FROM Score

WHERE Score > 60

ORDER BY CourseID, Score

常见问题:

.SQL语句不区分大小写

.字符串和日期类型都需要单引号

.起表名的时候,千万不要起得太好,例如不要使用User作为表名。

如果表名和关键字重复了,我们可以通过[]取消转义

select * from [User]

注意:新建查询窗口中的中文空格。

select  * from Message

十四:常用的几类函数:

字符串函数

用于控制返回给用户的字符串

日期函数

用于操作日期值

数学函数

用于对数值进行代数运算

系统函数

获取有关SQL Server中对象和设置的系统信息

1:字符串函数

函数名称:CharIndex(‘str1‘,‘str2‘,index)//位置从开始

--参数含义:

--第一个参数:要查询的字符串

--第二个参数:在哪个字符串中搜索

--第三个参数:从str2的第几个字母开始搜索

eg:

select charindex(‘好好学‘,‘S1是S2的基础,所以大家好好学‘,1)

SELECT CHARINDEX(‘JBNS‘,‘My Jbns Course‘)

select charindex(‘微冷的雨‘,‘好人啊微冷的雨‘,4)

select charindex(‘妈妈说‘,‘我们要为国家争光,妈妈说,是人就要有理想‘,11)

len():获取小括号中字符串的长度,空格也算一个字符长度

eg:

select len(‘明天咱们还上课,希望大家回去好好休息‘)

select len(‘大家都是好孩子                ‘)

注意点:如果内容以多个空格结尾,那么结尾的多个空格,是不计算长度的

upper():将括号中出现的英文全部转换成大写

select upper(‘i can speak english.你能吗?‘)

select lower(‘I HAVE A DREAM‘)

select upper(‘i have a dream,俺有一个梦想‘)

LTrim():清除括号中内容左边的空格(left:right)

select ltrim(‘                              生活不是林黛玉,      ‘

select rtrim(‘         生活不是林黛玉,      ‘)

--既想移除左边空格,也想移除右边空格

select rtrim(ltrim(‘         生活,      ‘))

select ltrim(rtrim(‘   你还好吧!   ‘))

select len(rtrim(‘今年奇怪了,北京没下雪,    ‘))

substring(‘字符串‘,截取的位置,截取的长度)

select substring(‘好吧,我爱自己伟大的祖国,真的‘,6,1)

right():从字符串右边返回指定类型的字符

select left(‘大家今天好像都没有交日记本,我去‘,3)

select right(‘大家今天好像都没有交日记本,我去‘,2)

replace(‘str1‘,‘要替换的字符‘,‘目标字符‘):

select replace(‘周杰伦,残疾人,虽然手不残疾,但是X残疾‘,‘残疾‘,‘好‘)

stuff(‘字符串‘,删除的起始位置,删除的长度,‘插入的字符串‘)

select stuff(‘我爱你中国,我爱你故乡‘,4,2,‘北京‘)

select stuff(‘我们都要有理想,为了理想我们熬夜,当然以牺体为代价‘,6,2,‘自信‘)

2:日期函数

--01.getdate():获取当前日期和时间

select getdate()

--1000ms是s

--02.dateadd(按年/月/日添加,增量,时间)

select dateadd(yy,100,‘2014-8-6‘)

select dateadd(year,-20,getdate())

--03.datediff(按年/月/日求差,小时间,大时间)

select datediff(year,‘1998-01-01‘,getdate())

--04.datename:获取某个日期是星期几

select datename(dw,‘2014-08-06‘)

--05.datepart(mm,日期):获取指定日期对应的年/月/日部分

select datepart(yy,getdate())

--Year yy

--Month mm

--Day  dd

--push(推)  pull(拉)

--通过该方式也可以获取当天是周几

select datepart(dw,getdate())

3:数学函数

--01.rand():产生一个到之间的随机数

select right(rand(),4)

Select rand()

--如果产生四位数(-9999)

--02.abs:取绝对值

select abs(-10)

select abs(10)

--非负数

--03.ceiling:天花板,你要看天花板,抬头,向上取整

select ceiling(1.999991)

--04.floor:向下取整

select floor(1.999999)

select ceiling(1.000000000000001)

select floor(2.999999999999999)

--04.power(5,2)求幂值

select power(4,4)

select 1*2/3+5-56+100-5/100

select power(2,3)

--05.round:将一个数字四舍五入到指定精度

select round(42.564,1)

--06.sign:如果括号中写的是一个正数,返回,如果是负数,返回-1

--如果是返回

select sign(20)

select sign(0)

--07.sqrt()开平方

select sqrt(9)

4:系统函数

相关练习:

1:某公司印了一批充值卡,卡的密码是随机生成的,现在出现这个问题:

    卡里面的字母“O和数字0”、“字母i和数字1”,用户反映说看不清楚,公司决定,把存储在数据库中的密码中所有的“O”都改成“0”,把所有的“i”都改成“1”;

请编写SQL语句实现以上要求

数据库表名:Card

密码列名:PassWord

分析:

实现卡密码更新的功能,需要使用UPDATE语句

牵涉到字符串的替换,需要使用到SQL Server中的函数REPLACE()

答案:

UPDATE Card SET PassWord = REPLACE(PassWord ,‘O‘,‘0‘)

UPDATE Card SET PassWord = REPLACE(PassWord ,‘i‘,‘1‘)

2:在数据库表中有以下字符数据,如:

  13-1、13-2、13-3、13-10、13-100、13-108、13-18、13-11、13-15、14-1、14-2

现在希望通过SQL语句进行排序,并且首先要按照前半部分的数字进行排序,然后再按照后半部分的数字进行排序,输出要排成这样:

  13-1、13-2、13-3、13-10、13-11、13-15、13-18、13-100、13-108、14-1、14-2

数据库表名:SellRecord

列名:ListNumber、

分析:

排序:ORDER BY

在ORDER BY的排序列中,需要重新计算出排序的数字

前半部分的数字:

找到“-”符号的位置

取其左半部分

使用CONVERT函数将其转换为数字:

 后半部分的数字:

找到“-”符号的位置

把从第一个位置到该位置的全部字符替换为空格

使用CONVERT函数将其转换为数字:0

答案:

SELECT ListNumber

FROM    SellRecord

ORDER BY

CONVERT(int, LEFT(ListNumber, CHARINDEX(‘-‘, ListNumber)-1)),

CONVERT(int, STUFF(ListNumber,1, CHARINDEX(‘-‘, ListNumber), ‘‘))

3:

使用SELECT语句查询数据

使用函数处理数据

需求说明:

查询年龄超过20周岁的Y2的学生信息

查询1月份过生日的学生信息

查询今天过生日的学生姓名及所在年级

查询学号为“Y21003007”的学生Email的域名

新生入学,为其分配一个Email地址 

分析:

年满20周岁的条件

DATEDIFF(DD,BornDate, GETDATE())>=365*20 

获取Email的域名

RIGHT(Email, LEN(Email) - CHARINDEX(‘@‘,Email) )

获取当前日期的年、月、日

CONVERT(VARCHAR(4), DATEPART(YYYY,GETDATE()))

获取4位随机数 

RIGHT(RAND(),4) 

世上无难事,只怕有心人。

时间: 2024-11-19 19:07:41

不简单的SQL查询和排序语句的相关文章

要提高SQL查询效率where语句条件的先后次序应如何写

我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2)WHERE子句中

SQL查询效率where语句条件

有索引的列优先,都有索引的看查询出来的数据量,少的优先 in ,not in,<>,is null,is not null 等由于不会走索引,尽量不要使用. WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响,如 Select * from zl_yhjbqk where dy_dj = '1K以下' and xh_bz=1 Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1K以下' 以上两个SQL中dy_dj及xh_bz两个字

提高SQL查询效率(SQL优化)

要提高SQL查询效率where语句条件的先后次序应如何写 http://blog.csdn.net/sforiz/article/details/5345359 我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表

oracle SQL语句练习MERGE、模糊查询、排序、

Oracle支持的SQL指令可分为数据操作语言语句.数据定义语言语句.事务控制语句.会话控制语句等几种类型:1.数据操作语言语句数据操作语言语句(Data manipulation language,DML)用于进行数据的检索和更新操作.数据检索是数据库应用中使用频率最高的操作类型,因此数据检索的效率对数据库的整体性能影响显著.数据更新包括数据的插入.修改和删除等操作,数据更新操作具有一定的风险性,在其执行过程中DBMS必须保证数据的一致性,以确保数据有效.SELECT.INSERT.DELET

浅析SQL查询语句未显式指定排序方式,无法保证同样的查询每次排序结果都一致的原因

本文出处:http://www.cnblogs.com/wy123/p/6189100.html 标题有点拗口, 先抛出问题:一个查询没有明确指定排序方式,那么,第二次执行这个同样的查询的时候,查询结果会不会与第一次的查询结果排序方式完全一样? 答案是不确定的,两个完全一样的查询,结果也完全一样,两次(多次)查询结果的排序方式有可能一致,有可能不一致. 如果不一致,又是什么原因导致同样的查询默认排序方式不一致? 以下简单分析几种情况,说明为什么查询同样的查询会出现默认排序结果不一样的情况.当然对

常用SQL查询语句

一.简单查询语句 1. 查看表结构 SQL>DESC emp; 2. 查询所有列 SQL>SELECT * FROM emp; 3. 查询指定列 SQL>SELECT empmo, ename, mgr FROM emp; SQL>SELECT DISTINCT mgr FROM emp; 只显示结果不同的项 4. 查询指定行 SQL>SELECT * FROM emp WHERE job='CLERK'; 5. 使用算术表达式 SQL>SELECT ename, sa

Sql Server 优化 SQL 查询:如何写出高性能SQL语句

1. 首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用 “全表扫描”方式. 可见,执行计划并不是固定的,它是“个性化的”.产生一个正确的“执行计划”有两点很重要: (1)    SQL语句是否清晰地告诉查询优化器它想干什么? (2)

【知了堂学习笔记】SQL查询基础语句(单表查询、多表查询)

SQL查询基础 1.单表查询 从数据库中查找数据 专业的称谓又称为投影 基本查询语句结构 select 列 from 表 * 所有列不是所有其他东西 查询所有数据 例:SELECT * FROM t_studen 需要执行比较细的操作  加上条件筛选:查询id为2号的学生信息 SELECT * FROM t_student WHERE id=2; 筛选的执行步骤 例:SELECT * FROM t_student WHERE id=2; SELECT *          (3) 再查询  筛选

优化SQL查询:如何写出高性能SQL语句

1.首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句,如果用来从一个10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用“全表扫描”方式. 可见,执行计划并不是固定的,它是“个性化的“.产生一个正确的”执行计划“有两点很重要: (1)SQL语句是否清晰地告诉查询优化器它想干什么? (2)查询优化器得到