zoukankan      html  css  js  c++  java
  • 不简单的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) 

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

  • 相关阅读:
    Android自定义之仿360Root大师水纹效果
    Android之TextView的Span样式源码剖析
    Android之TextView的样式类Span的使用详解
    随着ScrollView的滑动,渐渐的执行动画View
    仿微信主界面导航栏图标字体颜色的变化
    android自定义之 5.0 风格progressBar
    Android性能优化之内存篇
    Android性能优化之运算篇
    How to install Zabbix5.0 LTS version with Yum on the CentOS 7.8 system?
    How to install Zabbix4.0 LTS version with Yum on the Oracle Linux 7.3 system?
  • 原文地址:https://www.cnblogs.com/weiguangyi/p/4931509.html
Copyright © 2011-2022 走看看