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) 

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

  • 相关阅读:
    innerHTML和outerHTML的区别
    递归,汉诺塔
    js 中的 Math.ceil() Math.floor Math.round()
    JS中的异常exception
    CSS样式中visited,hover,active , focus这四个分别表示什么意思?
    用户在设置密码时,提醒请输入半角字符(vue+element+valid)
    设置用户密码时,将全角转换为半角
    后台返回对象数组,对象属性相同时,只取一个对象
    远程链接mongoDB robomongo
    mongodb 入坑
  • 原文地址:https://www.cnblogs.com/weiguangyi/p/4931509.html
Copyright © 2011-2022 走看看