SQL常用语法

1、添加数据操作

(1)使用INSERT VALUES 语句插入数据

   语法: INSERT INTO  table_or_view (字段名1,...,字段名n)

          VALUES (字段值1,...,字段值n)

   注释: insert:插入 、 into:到什么里面去 、table_or_view: 用于指定向数据表中添加的表或试图的名称

          字段名:是指该数据表中的列名    字段值:用于指定向数据插入的数据值

   例如: insert into stuinfo (stuNo ,stuName,birthday,stuTel,stuAddress,className)

          values ('13580901028' , '李文' , '90-03-17' , '2222273' , '广东珠海' ,'Y2T116');

          insert into stuinfo (stuNo ,stuName,birthday,stuTel,stuAddress,className)

          values ('27489301028' , '査小文' , '80-01-11' , '9322273' , '广东深圳' ,'Y1T146');

 (2)使用INSERT SELECT 语句插入数据(该语句比INSERT语句效率高得多)

   语法: INSERT table_name SELECT column_list FROM table_list WHERE sarch_condirions

   例如:现在想要对学员信息表做一个备份,我们可以创建一张跟学员表结构一样的学员信息备份表,然后再从表中查         询出数据并插入到学员信息备份表中。

   代码:CREATE TABLE StuInfo_bak  (创建学生信息备份表)

        (

           StuNo varchar (12) not null ,

           StuName varchar (12) not null ,

           StuAge int ,

           StuSex nchar (1) not null

                  check (StuSex='男' or StuSex='女'),

           StuTel varchar (30) ,

           StuAddress varchar (50) default ('地址不详'),

           Birthday datetime ,

           classname varchar (12)

          )

        ---从Stuinfo表中查出记录直接插入Stuinfo_bak表中

        ---insert into StuInfo_bak select * from StuInfo

        inert into StuInfo_bak ( StuNo ,StuName,StuAge,StuSex,StuTel,StuAddress,Birthday,classname)

        select  StuNo ,StuName,StuAge,StuSex,StuTel,StuAddress,Birthday,classname  

        from StuInfo

  (3) 使用SELECT INTO 语句创建表

  例如 :select  StuNo ,StuName,StuAge,StuSex,StuTel,StuAddress,Birthday,classname

               into stuInfo_bak

         from StuInfo    

       ----这样不仅创建了表stuinfo_bak,而且stuinfo表中的数据也一起插入stuinfo_bak表中去了。

2、更新数据操作

(1)UPDATE 语法

     UPDATE <table name>

     SET <colum>=<value>  [,<colum>=<value>]

     [WHERE <search condition>]

    例如:将学员信息表中的学员的学号为"13540607014"的年龄改为38岁,可以使用如下更新语句。

          但数据类型必须是数值型。

    -----修改年龄38岁

    update StuInfo

    set stuage = 38

    where stuno = '13540607014'

    ------查看这个学员的信息,看是否已改变

    select * from StuInfo where stuno = '135340607104'

    (2)修改年龄为实际年龄                                             ---datediff是指两日期差

    update StuInfo set stuage = datediff( yyyy,birthday,GETDATE() )   ---GETDATE是指获取当前日期

    select * from StuInfo

    ----修改年龄加一岁且电话号码前加"-"

    update StuInfo set stuage = stuage+1 , StuTel = '0756-' + StuTel

    ----查看这个学员的信息,看看是否改变

    select * from StuInfo

(3)根据其他表更新行

   例如: 商品信息表和厂商信息表

          update 商品信息

          set 厂商编号=(select 厂商编号 FROM 厂商信息 where 厂商名称='牛牛集团')

          where 商品名称 = '新版美国EML雅诗兰黛ANR特润眼部精华眼霜ML'

(4) 使用top表达式(可用top来限制update语句中修改的行数)

    例如:某商场搞活动,需要随机抽取5件商品降低25%,就是说商品信息表中的随机5件商品价格降低25%

         UPDATE TOP (5) 商品信息

         SET 商品价格 = 商品价格*0.75

3、删除数据操作

(1)DELETE 语法

     DELETE FROM <table name>

     [WHERE  <searh condition> ]

(2)使用DELETE 语句

   ----删除学员备份表所有数据

   DELETE FROM Stuinfo_bak

   ----删除学员信息表中的地址为"珠海" 的所有信息

   DELETE FROM stuinfo where stuAddress like '%珠海%'

   ----删除学员信息表中的20%的学员信息

   DELETE TOP (20) PERCENT stuinfo

   ----删除学员信息表中前4行

   DELETE TOP(4) stuinfo

(3)使用TRUNCATE TABLE 语句

   ----需要删除学员信息表中的所有数据

   TRUNCATE TABLE stuinfo  (注意,如有外键引用的表,不能用truncate来删除表数据

4、SELECT  简单查询

(1)查询全部行和列

   语法:select  {列举所有字段段名|*} from 表名

   例如:-------先删除这张表中数据

         delete from StuInfo

         -------再从备份表中插入数据到学员表

         insert into StuInfo select * from StuInfo_bak

         -------查询全表

         Select * from stuinfo ;

         -------按字段 列表查询

         Select stuNo , stuName ,stuAge ,stuSex ,stuTel,stuAddress from stuinfo ;

(2)查询全部行全部列

   语法:select column1 , column2 ... from 表名

   例如:Select stuNo , stuName from stuinfo ;

         Select stuName, stuTel ,stuAddress from stuinfo ;

(3)查询部分行和全部列

   语法:select 所有字段名 from表名 where查询条件语句集合

   例如:-------查询手机号码是1380013800的学员的所有资料

                Select * from stuinfo where stuTel= '1380013800'

         -------查询姓名为李志锋的学员的所有资料

                Select * from stuinfo where stuname='刘志峰'

         (where字句中的条件可以是多个,多个条件之间可用 or 或 and)

        --------查询手机号以139开头的珠海的学员的所有资料

        Select stuNo,stuName,stuAge,stuSex,stuTel,stuAddress from stuinfo

        where stuTel like '139' and stuAddress like '%珠海%'

(4)查询部分行部分列

   语法:select 部分字段名 from 表名 where查询条件语句集合

   例如:-------查询手机号以139开头的珠海的学员的学号、姓名与具体地址

         Select stuno ,stuName ,stuAddress from StuInfo

         where stuTel like '139%' and stuAddress like '%珠海%'

(5)添加top n 查询顶部几条记录

   语法:Select top n 部分字段名 from 表名

   例如:------查询手机号以139开头的珠海的前3个学员的学号、姓名、地址

         Select  top 3 stuNo ,stuName , stuAddress from Stuinfo

         where stuNo like '139%'

         and stuAddress like '%珠海%’

(6)添加top n percent 查询百分比的记录

   语法:Select top 10 percent 部分字段名|所有字段名 from 表名

   例如:------查询手机号以139开头的珠海的学员的学号、姓名、地址显示前10%的记录

         select top 10 percent stuno ,stuName ,stuAddress from StuInfo

         where stuTel like '139%'

         and stuAddress like '%珠海%'

(7)使用+号并列查询

   语法:select 字段名m + 字段名 n , 其他字段名 from 表名

   例如:-----查询手机号以139开头的珠海的学员的学号、姓名、地址,出生日期

         select stuNo ,stuName + '(+stuAddress+')' , birthday from stunifo

         where stuTel like '139%'

         and stuAddress like '%珠海%'

(8)查询中使用as以别名显示字段名

   语法:select字段名m + 字段名n as 别名 ,其他字段名 from表名

   例如:-----查询手机号以139开头的珠海的学员的学号、姓名、地址,出生日期

         select stuNo ,stuName + '(+stuAddress+')'as fullName , birthday from stunifo

         where stuTel like '139%'

         and stuAddress like '%珠海%'

(9)查询中使用=号代替as的用途

课堂案例:

----------查询姓张的学员

          select * from student where studentName like '张%’

----------查询教员登录名最后一位为6教员信息

          select * from teacher where loginId like '%6'

----------查询教员的编号在6-10之间

          select * from teacher where techerId between 6 and 10

----------查询教员的登录名倒数第二个字符为2的教员信息

          select * from teacher where loginId like '%2_'

----------在stuInfo表中添加一条记录,指定每一列

          insert into stuinfo (stuNo,stuName,stuSex,stuAge,stuAddress)

          values ('1005' , '王五' , '男’,'23' ,'广东珠海' )

----------在stuInfo表中添加一条记录,指定部分列

          insert into stuinfo (stuNo,stuName, stuSex)

          values ('1005' , '王五' , '男’)

----------在成绩表一次性添加多条记录

          insert into stuMarks

          select '1004', 50 ,70.5 union

          select '1005', 74 , 83 union

          select '1006', 99 , 81

----------数据表的备份

          select * from infobak

----------对信息表stuInfo备份到一个新表InfoBak

          select * into InfoBak from stuInfo

          select * from stuMarks

          select * from marksBak

----------备份成绩表的结构

          selecet into marksbak--新表

          from sruMarks

          where 1=2

----------将成绩表中的记录添加成绩备份表中

          inset into marksbak

          select stuNo , writeEaxm from stumark

----------将学号为1005的笔试成绩加4分

          select * from stuMarks

          update stuMarks set writeEaxm = writeEaxm - 4

             where stuNo = 1005

----------对所有学员的机试和笔试均加5分

          update stuMarks

             set writeExam = writEaxm+5 ,labEaxm = labEaxm+5

          update stuMarks

             set writeEaxm=100

             where writeEaxm >= 95

          update stuMarks

             set writeEaxm=writeEaxm+5

             where writeEaxm<95

          update stuMarks            

             set labExam=100

             where labExam>=95

          update stuMarks

             set labExam=labExam+5

             where labExam<95     

---------删除infobak表中的所有记录

    方法1:delete from InfoBak

    方法2:truncate table infobak

---------将信息表中的记录添加infoBak表中

         insert into InfoBak

         select * from stuInfo

---------删除年龄为空的记录

        delete from InfoBak

        where stuAge is null

--------删除信息表中的所有记录

        truncate table stuinfo

        select * from stuInfo

        select * from stumarks

        delete from stuInfo

           where stuNo=1004

        delete from stuMarks

           where stuNo=1004

   

        use MySchool

--------查看学员表中前10%条记录

        select top 10 percent * from student

--------添加测试记录

        insert into Emp

        select '三','张' union

        select '比尔','盖茨' union

        select '拉里','艾里森' union

        select '四','李'

 select * from Emp

 select id,姓名=lastName+firstName from emp

 select id,firstName+lastName as 姓名 from emp

 -------查看成绩表的总成绩,要求每列汉化

        select  考号=examNo,学号=stuno,

        笔试成绩=writeExam,机试成绩=labExam,

        writeExam+LabExam as 总成绩

        from stumarks

 --------查询教员表中登录名最后一位为1-4的教员信息

 --方法1:

       select * from Teacher

       where LoginId like '%[1-4]'

 --方法2

       select * from Teacher

       where LoginId like '%[1234]'

 --方法3

       select * from Teacher

       where LoginId like '%[^5-9,0]'

 -------身份证的约束

      if exists(select * from sys.tables

           where name='stu')

      drop table stu

      go

        create table stu

        (

          id int identity(100001,1) primary key,sName varchar(50),

          sId char(18)   

         )

 ------给身份证添一个约束

 if exists(select * from sys.objects

   where name='stuSid')

 alter table stu

   drop constraint stuSid

 go

 alter table stu

   add constraint stuSid

   check(sid like '[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]

         [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9,X,x]')

  

  insert into stu

  select '段平','421023198910242499' union

  select '刘汶兵','360732199405184912'

 ------按教员的年龄升序排列

 select * from teacher

  order by birthday desc

-----按教员的姓名升序排列

select * from teacher

  order by teacherName asc

------五个聚全函数

--Sum :求和

--Avg :平均值

--Count: 计数

--Max  :最大值

--Min  :最小值

     select  * from Student

-----统计每一个班的学员人数

     select classId,班级人数=COUNT(*)

     from student

     group by classId

------查询最高笔试成绩,最高机试成绩

     select 最高笔试成绩=MAX(writeExam),

            最高机试成绩=MAX(labExam)  from stumarks

      

-----显示笔试平均成绩,机试总成绩

     select 笔试平均成绩=AVG(writeEXam),

            机试总成绩=SUM(labExam) from stuMarks

  

------显示成绩表中第一名总成绩

     select top 1 *,writeExam+labExam from stumarks

           order by writeExam+labExam desc

     select max(writeExam+labExam) from stumarks

     select * from stuinfo

--显示信息表中男女的平均年龄,并且平均年龄在20岁以上

     select stuSex,AVG(stuAge) from stuInfo

 ----where stuAge>=19

     group by stuSex

     having AVG(stuAge)>=19

1、使用from语句

   例如: 对数据库中的" stuinfo " 表进行简单查询,并对"stuInfo"表定义别名为"s"

   语法:    Select * From StuInfo AS s

2、使用WHERE子句

   在SELECT 查询语句中,使用WHERE 子句时

   一般语法结构为:SELECT condition FROM table WHERE searchcondition

   注释:searchcondition 是指为用户选取所需要查询的数据行的条件,既查询返回的记录的满足条件。

   对用户所需要的所有行,search_condition 条件为true;而对其他行,search_condition条件为false

(1)比较运算符( =、< 、> 、>=、 <= 、<>和!=(<>和!=都表示不等于) )

  例如:在"student"数据库"stuinfo"表示查询学号为'13540607014'的‘学员姓名’、‘出生日期’以及‘地址’

   eg1: SELECT stuNo,stuName,birthday,stuAddress

        FROM stuinfo

        WHERE stuNo = '13540607014'

  例如:查询"学员信息" 表中"年龄"小于30岁的‘学员姓名’、‘出生日期’以及‘地址’

   eg2: SELECT stuNo,stuName,birthday,stuAddress

        FROM stuinfo

        WHERE stuage<30

  例如:查询"学员信息" 表中"年龄"不等于30岁的‘学员姓名’、‘出生日期’以及‘地址’

   eg3: SELECT stuNo,stuName,birthday,stuAddress

        FROM stuinfo

        WHERE stuage<>30

(2)逻辑运算符

  例如:在"student"数据库查询"学员信息"表中年龄>=20,且<=30的‘学员姓名’、‘出生日期’以及‘地址’

  eg1:  USE student

        SELECT stuNo,stuName,birthday,stuAddress

        FROM stuinfo

        WHERE stuage>=20 and stuage<= 30

  eg2:  USE student

        SELECT stuNo,stuName,birthday,stuAddress

        FROM stuinfo

        WHERE stuAddress='珠海' and (stuage>=20 or stuage<= 30 )

(3)使用IN条件

   语法:WHERE expression [NOT] IN value_list

   注释:value_list是指列表值 , 当值不止一个时需要将这些值用括号括起来,各列表值之间使用逗号隔开。

   例如:在"学员信息"表中查询 '学号' 为'2345'、'6786'、'5543'、'9876'的'学员姓名'、'出生日期’以及‘地址’

   eg1: USE student

        SELECT stuNo,stuName,birthday,stuAddress

        FROM stuinfo

        WHERE stuno in ('2345'、'6786'、'5543'、'9876')

(4)使用BETWEEN条件

  语法:WHERE expression [NOT] BETWEEN values1 AND values2

  例如:在"student"数据库查询"学员信息"表中年龄>=20,且<=30的‘学员姓名’、‘出生日期’以及‘地址’

  eg1:  USE student

        SELECT stuNo,stuName,birthday,stuAddress

        FROM stuinfo

        WHERE stuage between 20 and 30

  例如:想要查询"年龄"在20至30以外的所有数据

  eg2:  USE student

        SELECT stuNo,stuName,birthday,stuAddress

        FROM stuinfo

        WHERE stuage not between 20 and 30

(5)使用LIKRE匹配条件

   语法:WHERE expression [NOT] LIKE 'string '

   例如:在"学员信息"表中查询'地址为'珠海'的'学员姓名'、'出生日期’'年龄'以及‘地址’

    eg: USE student

        SELECT stuNo,stuName,birthday,stuAddress

        FROM stuinfo

        WHERE stuAddress like '%珠海%'

(6)使用IS NULL条件

   语法:WHERE column IS [NOT] NULL

   例如:在"学员信息"表中查询'出生日期’为NULL的学员信息

   eg:  USE student

        SELECT stuNo,stuName,birthday,stuAddress

        FROM stuinfo

        WHERE birthday is null

3、使用ORDER BY 子句

(1)语法:ORDER BY order_expression [ASC|DESC]

   注释:order_expression表示用于排序列或列的别名及表达式。 ASC是指升序。DESC是指降序。

   例如:将‘STUDENT’数据库的"学员信息"表按照'年龄'进行升序排序

   eg:USE student

      SELECT * FROM stuinfo

      ORDER BY stuAge ASC

(2)例如:对学员信息表中的数据查询是先按“性别”进行升序,如果“性别”列中有相同的数据,那么在按“年龄”进行升序 。

   语法:SELECT * FROM stuinfo ORDER BY stuSex ASC , stuAge DESC

4、使用GROUP BY 子句

   语法:GROUP BY group_by_expression [WITH ROLLUP | CUBE ]

   注释:group_by_expression 表示分组所依据的列,ROLLUP 表示只返回第一个分组条件指定的列统计行,若改变列的         顺序就会使返回的结果行数据发生变化。CUBE是ROLLUP 的扩展,表示除了返回由GROU BY 子句指定的列外,还         返回按组统计的行。

   例如:要在学员信息表中按照"出生日期"查询出对应每年出生的统计人数

   eg:   USE STUDENT

         selcet YEAR (birthday) year , COUNT (*)as amount

         from Stuinfo

         group by YEAR       (birthday)

5、使用HAVING子句

   语法:HAVING search_conditions

   注释:search_conditions是指查询所需要的条件,即返回查询结果的满足条件。

   eg :  USE STUDENT

         selcet YEAR (birthday) year , COUNT (*)as amount

         from Stuinfo

         group by YEAR       (birthday)

         having count(*)>3

6、高级查询

(1)基本连接

   用户再进行基本连接操作时,要遵循的原则

   *SELECT 子句列表中,每个目标列前面都要加上基表名称

   *FROM 子句应包括所有使用的基表

   *WHERE 子句应定义一个同等连接

   例如:“STUNDENT”数据库中"学员信息"表和"考试信息"表,都包含了"学号"列,根据该列在WHERE子句中建立同等

           连接查询年龄小30岁的学员的学号、姓名、性别、出生日期、机试成绩、笔试成绩。

   eg: --------为查询方便,先向考试成绩表exam插入考试成绩数据

       --------插入成绩表

      insert into Exam values ( '1354865466' , 95 ,56 );

      insert into Exam values ( '1324860446' , 65 ,76 );

      insert into Exam values ( '1664865876' , 92 ,96 );

      insert into Exam values ( '1355332546' , 85 ,76 );

      select s.stuno ,s.stuName , s.studSex , s.birthday,s.Written , e.Lab

      from StuInfo s , Exam e

      where s.stuno = e.stuno

         and stuAge<30

(2)JOIN 关键字

   语法:SELECT select_list

         FROM table join_type JOIN table2 [ON join_conditions]

         [WHERE search_conditions]

         [ORDER BY order_expression]

   注释:Table1与table2为基表; join_type指定连接类型,join_conditions指定连接条件

   例如:“student”数据库中"学员信息"表和"考试信息"表,都包含了"学号" 列,可用join关键字将两表建立连接

   eg : USE student

        select s.stuno ,stuName ,studSex , birthday,s.Written , e.Lab

        from StuInfo s , Exam e

        on s.stuno = e.stuno

         and stuAge<30 

(3)内连接

  1*、等值连接语法:

         SELECT select_list

         FROM table INNER JOIN table2 [ON join_conditions]

         [WHERE search_conditions]

         [ORDER BY order_expression] 

   eg : USE student

        select s.stuno ,stuName ,studSex , birthday,s.Written , e.Lab

        from StuInfo s join Exam e

        on s.stuno = e.stuno

        where stuAge<30

        order by s.birthday

  2*、非等值连接

     例如:在"学员信息"表和"考试信息"表中查询学员的学号、姓名、性别、出生日期、机试成绩、笔试成绩,

           同时要求学员的年龄在20-30岁之间的学员信息。

    eg: USE student

        select s.stuno ,stuName ,studSex , birthday,s.Written , e.Lab

        from StuInfo s join Exam e

        on s.stuno = e.stuno

        and s.stuAge between 20 and 30

        order by s.birthday

  3*、自然连接

     例如:基于表"学员信息"表和"考试成绩"创建一个自然连接查询,限定条件为两个基表中的学员编号,在结果集中显            示学号、姓名、年龄、出生日期、笔试成绩、机试成绩。

    eg: USE student

        select s.stuno ,stuName ,studSex , birthday,s.Written , e.Lab

        from StuInfo s inner join  Exam e

        on s.stuno = e.stuno

        where stuAge<30

        order by s.birthday

7、外连接

8、使用子查询

(1)返回多行子查询

   1、使用in关键字

   语法:SELECT select_list

         FROM table_courcde

         WHERE expression IN/NOT IN (subquery)

    注释:subquery表示子查询,括号外围的查询结果作为限定条件,进行查询。

    eg: USE student

        SELECT * FROM stuInfo

        WHERE stuno IN (select stuno from exam where Written >=60 and Lab>=60 )

   2、使用EXISTS关键字

   语法: SELECT select_list

          FROM table_courcde

          WHERE EXISTS/NOT EXISTS (subquery)

     例如:以上面案例为例,查询没有考试成绩的学员信息

    eg: USE student

        SELECT * FROM stuInfo s

        WHERE NOT EXISTS (select stuno from exam e where e.stuno=s.stuno )

   3、比较运算符

   语法:SELECT select_list

         FROM table_courcde

         WHERE expression operator [ANY|ALL|SOME](subquery)

      注释: operator指运算符  , ANY|ALL|SOME 比较的关键字

    eg: USE student

        SELECT * FROM stuInfo s

        WHERE stuno=ANY

        (select stuno from exam e where Written >=60 and Lab>=60 )

(2)返回单行的子查询

  语法: SELECT select_list

         FROM table_courcde

         WHERE expression operator (subquery)

   eg:  USE student

        SELECT * FROM stuInfo s

        WHERE stuno=ANY

        (select stuno from exam e where examno=10 )

(3)嵌套子查询

   语法:eg:USE student

         SELECT * FROM stuinfo

         WHERE stuno IN (select stuno from exam e where Written >=60 and Lab>=60 )

猜你喜欢

转载自www.cnblogs.com/maoxiuying/p/9079187.html