当前位置:Gxlcms > 数据库问题 > SQL语句

SQL语句

时间:2021-07-01 10:21:17 帮助过:4人阅读

  • create database School;
  • --删除数据库
  • drop database School;
  • --创建数据库的时候指定一些选项
  • create database School;
  • on primary--配置主数据文件
  • (
  • name=‘School‘,--逻辑名称,数据库内部用的名字
  • filename=‘‘,--保存路径
  • size=5MB,--设置初始化大小
  • filegrowth=10MB10%,--设置增长速度
  • maxsize=100MB--设置最大大小
  • )
  • log on--配置主日志文件
  • (
  • name=‘‘,--设置逻辑名称
  • filename=‘‘,--设置路径
  • size=3MB,
  • filegrowth=3%,
  • maxsize=20MB
  • )

  • 创建表

    1. //每个项设置后面都加逗号 最后一项不加
    2. --切换数据库
    3. use School;
    4. --在School数据库中创建一个学生
    5. create table TblStudent
    6. (
    7. --表中的定义在这对的小括号中
    8. --开始创建列
    9. --列名 数据类型 自动编号(从几开始,增长步长) 是否为空(不写默认允许,或者写null 不允许空写 not null)
    10. --tsid int identity(1,1) not null
    11. --设置名为tsid 类型为int 1开始增长,每次增长1的主键列
    12. tsid int identity(1,1) primary key,
    13. )

    插入数据

    1. --查询表
    2. select * from TblClass
    3. --insert向表插入数据(一次只能插一条)
    4. insert into TblClass(tclassName,tclassDesc) values(‘tclassName的值‘,‘tclassDesc的值‘)
    5. --TblClass后面的括号设置在哪些列插入数据,value后面的括号要与前面的一一对应.如果要给除自动编号的所有列插入数据,TblClass后面的括号可省
    6. --插入同时返回指定列的数据:在value前加上output inserted.列名


    1. --向自动编号列插入数据
    2. --先把一个选项打开 倒数第二个是列名
    3. set IDENTITY_INSERT tblclass on
    4. insert........
    5. --最后记得把选项关掉
    6. --听过一条语句插入多条数据
    7. insert into TblClass(tclassName,tclassDesc)
    8. select ‘...‘,‘...‘ union
    9. select ‘...‘,‘...‘ union
    10. select ‘...‘,‘...‘ union
    11. select ‘...‘,‘...‘ --最后一项不用union
    12. --把一个表的书数据插入另一个表
    13. insert into 被插表(列名,列名)
    14. select 列名,列名 from 数据来源表
    15. --插入汉字记得在字符串前加入N

    更新数据

    1. update 表名 set 列名=值,列名2=值2 where 条件 and..or...
    2. --如果没有条件,所有数据都会更新

    删除数据

    1. --删除
    2. delete from 表名 where 条件
    3. --删除整表数!据!与drop不同,两种
    4. --1,delete from 表名
    5. --速度慢
    6. --自动编号依然保留当前已经增长的位置
    7. delete from 表名
    8. --2,truncate table 表名
    9. --速度快
    10. --自动编号重置
    11. truncate table 表名

    修改表设置

    1. --修该列
    2. --删除指定列
    3. alter table 表名 drop column 列名
    4. --增加指定列
    5. alter table 表名 add 列名(这里跟创建表一样)
    6. --修改指定列
    7. alter table 表名 alter column 列名
    8. --增加约束
    9. --给指定列添加主键约束
    10. alter table 表名 add constraint 约束名 primary key(列名)
    11. --给指定列添加非空约束
    12. alter table 表名 alter column 列名 数据类型 not null
    13. --给指定列添加唯一约束
    14. alter table 表名 add constrainy UQ开头的约束名 unique(列名)
    15. --给指定列添加默认约束
    16. alter table 表名 add constraint 约束名 default(值) for 列名
    17. --给指定列添加检查约束
    18. alter table 表名 add constraint 约束名 check(表达式)
    19. --增加外键约束 alter table 表名 add constraint FK_约束名 foreign key(外键列名)references 主键表名(列名)
    20. --删除多个约束
    21. alter table 表名 drop constraint 约束名,...,...
    22. --创建多个约束
    23. alter table 表名 add constraint 约束名 unique(列名), constraint 约束名 check(表达式), constraint 约束名 foreign key(要引用列) references 被引用表(列) 
    24. on delete cascade on update cascade --设置级联删除和更新


    查询数据(select,top,distinct)

    1. --数据检索,查询指定列的数据,不加where返回所有
    2. select 列名,列名,... from 表名 where 条件
    3. --用select显示东西,列名可省略,列名可以不‘‘起来,除非名字有特殊符号
    4. select (空格或者as) 列名
    5. --top获得前几条数据,选到的都是向上取整
    6. select top (数字或数字 percent) * from 表名 order by 列名 (asc//升序,默认值 desc//降序)
    7. --Distinct去除查询出的重复数据,只要有一点不同(显示出来的列的内容不同)不算重复,比如自动增长的那列
    8. select distinct 要显示的 from 表名 ...

    联合查询(union,union all)

    1. 合并行叫做"联合"
    2. 联合必须保证每行的数据数目与第一行一致,数据类型兼容
    3. 列名为第一行的列名
    4. union all 在联合时不会去除重复数据,也不自动排序
    5. 不能分别排序
    6. 常用:底部总和
    7. 例:
    8. select
    9. 商品名称,
    10. 销售总价格=(sum(销售数量*销售价格))
    11. from MyOrders
    12. group by 商品名称
    13. union all
    14. select ‘销售总价:‘,sum(销售数量*销售价格) from MyOrders

    连接查询(join....on...)

    A表 join B表 on 两表关系   例:
    1. select*from TblClass
    2. jion tblstudent on TblClass.tClassId=TblStudent.tSClassId
    3. //查询出两个表符合TblClass.tClassId=TblStudent.tSClassId的数据行,并显示其所有数据
    连接分为内连接和外连接  内连接:   1,普通内连接     inner join.. on..     仅筛选两个表都有匹配的数据,例如:
    1. select*from TblClass
    2. jion tblstudent on TblClass.tClassId=TblStudent.tSClassId
            //这里先把两个表的数据拿出,把TblClass.tClassId,与TblStudent.tSClassId相同的那    行构成新的行,        //进一步构成新的表,如果TblClass.tClassId有个值为3,而TblStudent.tSClassId没有,那么新的表不会有这行数据,另外这个表是临时存在于内存
    1. select * from TestJoin1Emp emp inner join TestJoin2Dept dept on emp.EmpDeptid=dept.DeptId
    2. --两者等效
    3. select * from TestJoin1Emp emp , TestJoin2Dept dept
    4. --假设emp与dept,行数分别是3,5.select * from 这两个表,实际会形成3*5=15行的临时表
    5. --再在这个表中筛选,而这个表叫做笛卡尔表
    6. where
    7. emp.EmpDeptid=dept.DeptId



      自连接    特点:关系列的值引用的本表中主键列信息     例子:
    1. create table groups
    2. (
    3. gid int identity(1,1) primary key not null,
    4. gname nvarchar(10),
    5. gparent int
    6. )
    7. select * from groups
    8. insert into groups values(‘总部‘,0)
    9. insert into groups values(‘北京分公司‘,1)
    10. insert into groups values(‘上海分公司‘,1)
    11. insert into groups values(‘.net部门‘,2)
    12. insert into groups values(‘.net部门‘,3)
    13. --查询部门对应的上级部门
    14. use Temp
    15. select deparment.gname as ‘部门名称‘,company.gname as ‘所属部门‘
    16. from groups as deparment
    17. inner join groups as company
    18. on deparment.gparent=company.gid
      外连接:   1,左外连接   语法:左表 left join右表on...   左表的信息全部输出,右表的信息在左表有匹配才输出   未匹配的用null填充
       原理:先连接两个表为笛卡尔表,再找到匹配行,把左表剩下的补上   2,右外连接   语法:左表 right join 右表 on ...   类似左外连接   3,完全外连接   语法:full outer join    简写为join   信息全部显示,没有的用null填充     多表查询案例
    1. ------多表查询案例分析:
    2. -- dbo.Branch:结构表: 银行,开发商,政府房管局
    3. --dbo.BuildingInfo: 建筑信息表。 天堂花园 1号楼。
    4. --dbo.ProjectInfo:项目信息表。天堂花园1期。
    5. --dbo.UserInfo:用户信息表
    6. ---查询建筑信息表,顺便:建筑信息所属的项目名,项目所属的机构名字,项目创建人的名字
    7. select B.*,P.ProjectName,BR.BranchName,u.UName as SubBy from dbo.BuildingInfo as B
    8. left join dbo.ProjectInfo as P on B.ProjectId=P.Id
    9. left join dbo.Branch as Br On P.BranchId=BR.Id
    10. left join dbo.UserInfo as U On P.SubBy=U.Id



    模糊查询,通配符

    1. --模糊查询,通配符,当使用通配符必须使用like,可以在like前面加no 表示除了匹配数据的数据
    2. --%,表示匹配任意多个字符
    3. --例子,查询以张开头的字符串
    4. select * from 表名 where 列名 like N‘张%‘
    5. --查询包含%的字符串
    6. select * from 表名 where 列名 like ‘%[%]%‘

    7. -- _ ,表示一个任意字符
    8. -- [ ],表示匹配一个字符,这个字符是[]访问内的通常是[0-9][a-z]
    9. -- ^ 非

    排序(order by)

    order by 一定是放在最后order by 列或(列+列),列,列..   desc/asc    --可多个列    

    判断NULL值

    在数据库中,NULL更任何数据对比或运算都返回null与任何值运算返回null使用特殊的运算符 is.....where 列名 is null.....where 列名 is not null
     

    分组(group by)

    当在查询中使用了group by分组后,select选择的列必须是group by中包含的列或者该列必须在聚合函数中 
    1. --例子,统计学生表中每个班的男生人数,且显示id
    2. select
    3. 班级id=tsclassId
    4. 男同学人数=count(*)
    5. from TblStudent
    6. where tsgender=‘男‘
    7. group by (tsclassId,这就是group by包含的列,可以逗号添加多个列,意味着分组后在分组) 
    8. --有时候要把一些信息放到group by后才能放到select,这时不一定担心,在group by 语句写过多会造成过多的分组,
    9. --例子如下
    10. --列1 列2 列 3
    11. --A aa 少壮不努力
    12. --B bb 老大LOL
    13. --如果group 列1,列2 因为当列1为A,列2必须aa,列1B,列2必须bb时最终只会会分成两个组,所以有时候不用担心分组过多
    --对得到的组进一步筛选(having)
    1. --例子:按笔记编号分组,筛选出班级人数大于10的班级
    2. select
    3. tsclassId as 班级编号
    4. count(*) as 人数
    5. from TbStudent
    6. --如果这里有where,where这不能用聚合函数
    7. group by tsclassId
    8. having count(*)>10//having的内容只能是select选择的内容

    select 列 into 新表 语法

     1,insert into 表1(列1,列2) select 列1,列2 from 表2 where//向已经存在的表中插入其他表的数据 2,select * into 表2 from 表1 where//执行完这句话,表2才生成,如果表2存在则报错,复制数据类型,增长特性,约束不复制
     


    子查询

    把一个查询的结果在另一个查询中使用就叫子查询。(将一个查询语句做为一个结果集供其他SQL语句使用)子查询的几种情况:子查询作为数据源,子查询作为where条件,子查询作为列select 列=(子查询)当子查询作为数据源时必须给它器别名
    子查询基本分类:     独立子查询             子查询可以独立运行     相关子查询         子查询中引用了父查询中的结果      例:
    1. select * from TblStudent as ts
    2. where exists//如果查到数据返回true
    3. (
    4. select * from TblClass as tc where
    5. tc.tclassId=ts.tsclassId and
    6. (tc.tclassname=‘高一一班‘or tc.tclassname=‘高二二班‘)
    7. )
    返回TblStudent中根据tsclassid在TblClass中找到的班级名称为高一一班或高二二班的整行数据

    只有返回且仅返回一行、一列数据的子查询才能当成单值子查询。子查询返回的值不止一个。当子查询跟随在=、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
    如果子查询是多行单列的子查询,这样的子查询的结果集其实是一个集合。可以使用in关键字代替=号





    分页(row_number())

    分页要统一排序这里有两种方法1,通过top设每页数据5条,第一页,top 5第二页除了第一页查到的,剩下的数据集的前5条第三页除了前两页查到的,剩下的数据集的前5条......
    1. select top 5 * from Customers where CustomerId not in

    人气教程排行