码迷,mamicode.com
首页 > 数据库 > 详细

SQL小知识

时间:2016-02-10 00:28:56      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:

1、char/nchar, varchar/nvarchar

    char(10)只能放五个中文,定长,如果只放一个字节,后面就是就是九个空格(一个中文两个字节)

    nchar(10)放十个中文,定长

    varchar(10)放五个中文,变长,如果只放一个字节, 就只放一个字节

    nvarchar(10)放十个中文,变长。。。

2、创建一个数据库,在数据库里面创建表,以及添加表里的项

    create datebase Library

    go

    use Library

    go

    create table Users 

       (

         UID int primary key,

         userName nvarchar(20)not null

         userPwd nvarchar(20)not null

        )

     create table Books

        (BID int primary key,

         bookName nvarchar(20)not null,

         price int not null

         authors nvarchar(15),

         )

3、select语句用法

       select*from Products--查询出Products表里面的所有信息

       select ProductID,ProductName from Products where ProductID=1--查询出ProductID=1的所有ProductID和ProductName

      use pubs

      go

      select address from authors where au id=‘172-31-11-1176‘--先导入指定的数据库pubs,查询出authors表里面,au id为172-32-1176的address

       select productID,productName from prooducts order by productID asc--默认是asc(可以不写)从小到大排序,desc是从大大小

       select*from products where UnitPrice>20--查询出products表里面UnitPrice>20的信息

      selecrt*from Emloyeees where LastName=‘King‘and City=‘London‘

      use pubs

      go

      select*from emloyee where fname=‘Paul‘ and job_id=5

      select*from Products where ProductID in(4,5,6)--查询出Product表中Produc为4,5,6,所有信息。

      select*from  Product where UnitPrice<10 and UnitPricr<30 order by UnitPrice--查询出Products表中UnitPrice<10并且UnitPrice<30的所有信息,并按照UnitPrice的大小由小到大排序

      select*from  Product where  UnitPrice between 10 and 30 order by UnitPrice上面的另外一种写法

      select*from  Employees where FirstName like ‘A%‘--查询出Emloyees中FirstName里面的第一个字母是A的所有人信息

      select*from Emloyees where FirstName like ‘%A%‘--查询出Emloyees中FirstName里面中间有A的所有人信息

      select*from Employees where FirstName like‘%A‘--查询出Employees中FirstName里面最后一个字母是A的所有人信息

      select count(*)from Employees--查询出Employees表中的所有记录数

      select min(UnitPrice)from Products--查询出Products表中的Unitprice的最小值

      select max(UnitPirce)from Products--查询出Products表中的Unitprice的最大值

      select avg(Unitpirce)from Products--查询出Products表中的Unitprice的平均值

      select sum(Unitpirce)from Product--查询出Products表中的Unitprice的总和

      select top5*from Products--查询出前五条的记录信息

      select*from Products where Unitpirce>--有子查询,查找出比平均值高的商品信息

         (

                select avg(Unitpirce)from Products

            )

 4、insert/update

     insert into BOOK(bookName,bookPirce,bookAuthors)

     values(‘C#基础‘,‘35‘,‘ji‘)

     insert into BOOK(bookName, bookPirce,bookAuthors)

     values(‘VB基础‘,‘12‘,‘ni‘)

     insert into BOOK(bookName,bookPirce,bookAurhers)

     values(‘C基础‘,‘35‘,‘das‘)

     updadte  BOOK set bookPirce=30 where bookName=‘C#基础‘--修改BOOK表,让bookName为C#基础的项中的boolPirce=30

      delete BOOK where bookName=‘C#基础‘

 

  5、有一个student表(学号,姓名,系名,课程名,成绩),查询至少修了四门课程的学生学号,姓名以及平均成绩的SQL语句。

   select stu,sname,avg(sorce)

   from student

   group by stu,sname

   having count(*)>=4

 

 6、

   select distinct[name]from Category         //查出Category中不重复的name

   select count(distinct name) from Category   //查出Categpry中不重复的name的数量

 7、连接

   inner join on,left join on, right join on 区别:

   表A记录如下:

   aID                           aNum

    1                               a20050111

    2                               a20050112

    3                               a20050113

    4                               a20050114

    5                               a20050115

   表B记录如下:

    bID                              bName

      1                                 2006032401

      2                                 2006032402

      3                                 2006032403

      4                                 2006032404

      8                                 2006032408

  实验如下:

    1. left join

      sql 语句如下:

      select*fromA

      left join B

      on A aID=B.bID

      结果如下:

      aID                          aNum                               bID

       1                              a20050111                        1

       2006032401

       2                              a20050112                        2

       2006032402

       3                              a20050113                        3

       2006032403

       4                              a20050114                        4

       2006032404

       5                              a20050115                        NULL

         (所影响的行数为5行)

         结果说明:      left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join 是以左表为准的,换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为:A.aID=B.bID)      

B表记录不足的地方均为NULL

       

   2、right join

     sql语句如下:

       select*from A

       right joinB

       on A.aID=B.bID

       结果如下:

       aID                               aNum                           bID

        1                                   a20050111                         1

         2006032401

        2                                   a20050112                          2

         2006032402

        3                                   a20050113                          3

         2006032403

        4                                   a20050114                          4

         2006032404

        NULL                            NULL                                   8

         2006032408

        (所影响的行数为5行)

         结果说明:  仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.

       3.inner join

        sql语句如下:

        select*fromA

        innerjoinB

        onA.aID=B.bID

         结果如下:

         aID                                    aNum                                  bID

         bName

         1                                       a20050111                            1

          2006032401

         2                                       a20050112                            2

          2006032402

         3                                       a20050113                            3

          2006032403                     

         4                                       a20050114                            4

          2006032404      

        结果说明:

        很明显,这里只显示出了A.aID=B.bID的记录,这说明inner join并不以谁为基础。它只显示符合条件的记录。

 

   8、用这种查询语句就可以查出指定区间记录的数据了

       select*from

         (select id ,row_number() over(orde by id desc)as row from[entry])Entry where row between 1 and 5000

   9、给表添加一字段

     alter table   Category

     add

     age int  null

      删除表:    drop table Users

   10、约束

     1.UNIQUE约束,于PK的区别:

       一张表只能有一个PK,但可以有多个UNIQUE约束

       PK约束定义主键不能为空,但UNIQUE可以为空值

       方法:点"管理索引和键"---"添加"---"类型"选择"唯一键"---"列"添加进多个UNIQUE--关闭保存

       它的作用是,当那多个unique同时都相同的时候,就会报错,实现了实体的完整性。

       也可以用SQL语言来实现:

        //单列处理

        creat table T2

        (ID int primary key idertity(1,1),Ename nvarchar(20)unique)

        //组合处理

         creat table T3

         (ID int primary key identity(1,1)

           Ename nvarchar(20)

           Ebir datetime

           unique(Ename,Ebir)

          )            

       2.check约束,它的作用是,约束一个键值,实现域完整性

         方法:

         "管理 checK约束"---"添加"---"常规"表达式---写入你要约束的键值的表达式比如:

         laborage>=2000 and laborage<=5000 ---"关闭"保存

         这样,在输入laborage的值的时候,如果不是大于等于2000小于等于5000就会报错

        也可以用SQL语言实现

         creat table T1

        (

         工资 money not bull check(工资between 2000 and 4000)

         )

     

  11.选择出生年月日

       select year(getdate())  //获取当前的年

       select month(getdate())   // 获取当前的月

       select day(getdate())     //获取当前的天

       select*from employ where month(birthday)=8      //打印出8月份过圣体的员工的所有信息

       selcet*from employ where year(getdate())-year(birthday)>25//year(getdate())为当前年份,打印出年龄大于25岁的员工的所有信息

       select*from employ where year(birthday)=2008 and month(birthday)=8 and day(birthday)=12//打印出生日为2008-8-12日的所有员工信息

      select dateadd(yy,100,gatdate())//当天加上100年的时间,getdate()可以换成具体的某一天比如写成:‘2108/12/31‘

      select dateadd(mm,1,getdate()) //当天加一个月的时间

      select dateadd(dd,100,getdate()) //当天加100前天的时间 

      select datediff(yy,getdae(),‘2108/12/31‘) //当天距离2108/12/31还有多少年

      select datediff(mm, getdate(),2108/12/31‘)

      select datediff(dd,getdate(),2108/12/31‘)

      

 

  Month 

       mm、m

        Dayofyear

          dy、y

        Day

           dd、d

        Week

           wk、ww

        Weekday

           dw、w

        Hour 

           Hh

       Minute

           mi、n

       Second

           ss、s

       Millisecond

          Ms

     

     12.isnull

           select title,content, isnull(categoryID,0)from news  //为null的categoryID用0显示出来

 

     13.case用法

    //查找categoryID=13的state,并对sate进行判断

     select state,case

     when(state=1)then‘待审‘

     when(state=2)then‘已审‘

     end as pro_state

     from category where categoryID=13

     // 查找出低级的多少个,中级的多少个,高级的多少个

        select Count(*)as[Count]from category

        group by

        case

        when categoryID<15then‘低级‘

        when categoryID between 15 and20 then‘中级‘

        else‘高级‘

        end

    //查出category中的CategoryID,name,以及判断每个categoryID的大小

      select CategoryID,name,

      case

      when categoryID<15 then‘低级‘

      when categoryID beteween 15 and 20 then‘中级‘

      else‘高级‘

      end as categoryRange from category

SQL小知识

标签:

原文地址:http://www.cnblogs.com/screen2015/p/5165034.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!