彩世界平台-彩世界时时app-彩世界开奖app苹果下载

热门关键词: 彩世界平台,彩世界时时app,彩世界开奖app苹果下载

您的位置:彩世界平台 > 工作委员会 > SQL Server 数据库基础笔记分享(上)

SQL Server 数据库基础笔记分享(上)

发布时间:2019-08-30 12:55编辑:工作委员会浏览(176)

    前言

    前言

    本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作约束,视图,存储过程,触发器的基本了解。

    本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作约束,视图,存储过程,触发器的基本了解。

    注:内容比较基础,适合入门者对SQL Server 数据库的了解!!!

    注:内容比较基础,适合入门者对SQL Server 数据库的了解!!!

    正文

    正文

    1.子查询

    1.主键:

    --把一个查询结果作为另外一个查询的查询源
    select * from (select * from Student where tbage between 3 and 5)
    as ct where tbname=5 --ct是新创的表名

    主键的作用:保证表中的每条数据的唯一性
    特点: 主键不能重复 不能为空
    分类:
    逻辑主键:选择为表中增加的那些“自动编号”列或者“GUID”列为主键(没有实际业务上的意义)的主键 (建议使用逻辑主键)
    业务主键:选择表中那些在业务中有实际意义的列作为主键
    》》》》》》》》》选择主键的策略,选什么样的列作为主键《《《《《《《《《
    1》主键,建议选择那些一般不会被修改的列
    2》选择单列,不选择多列(不用组合主键)
    3》选择那些简单列(整数列(自动编号))

    --把另外一个查询的结果作为当前查询的条件来使用。
    --子查询中=、!= 、< 、> 、<= 、>=之后只能返回单个值,如果多个值就会报错
    --解决办法 可以用in 代替
    select * from Student
    where tbage in(select tbage from Student where tbname=3)

     

    select * from Student
    where tbage=(select tbage from Student where tbname=3)

    2.char(),nchar(),varchar()之间的区别

    》》》》》》子查询分页《《《《《《

    》》》》》》》》》char(10)与varchar(10)的区别《《《《《《《《《
    char(10) 固定长度,表示在数据库中存储的时候占用10个字节的空间,如果超出10个则报错,如果不够10个则用空格补全。
    varchar(10) 可变长度,表示该列最多可以存储10个字节,如果实际存储不够10个字节,则会在存储的时候自动计算一下实际的存储个数,而动态的改变长度。【节省空间】

    --1》显示第一页的数据
    --分页查询的时候首先是将数据排序
    select * from Student order by id desc

    》》》》》》》》》char(10)与nchar(10)的区别《《《《《《《《《

    --2》第一页 显示5条数据
    select Top 5 * from Student order by id desc

    char(10) 可以存储10个字母或者5个汉字。 用来存储数据的时候,英文站1个字节,中文站2个字节。

    --3》第二页
    select top 5 * from Student
    where id not in (select top 5 * from Student order by id desc)
    order by id desc

    nchar(10) 表示可以存储10个字母或10个汉字,因为每个字符都是按照unicode方法来存储的。当使用nchar(10),来存储数据的时候无论存储的是中文还是英文都是每个字符占2个。

    --4》第三页
    select top 5 * from Student
    where id not in (select top (2*5) * from Student order by id desc)
    order by id desc

     

    》》》开窗函数分页《《《

    3. 创建数据库

    --第七页数据 每页5条数据
    --over属于开窗函数

    --创建一个数据库
    create database School

    select * from
    (
    select * ,row_number() over( order by id desc) as paixu from Student
    ) as tbl
    where tbl.paixu between 6*5+1 and 7*5

    --删除数据库
    drop database School

    2.连表查询

    --创建数据库的时候,指定一些数据库的相关参数。
    create database School
    on primary --主数据文件
    (
    name='School',
    size=10mb,
    filename='c:school.mdf',
    filegrowth=10%,
    maxsize=100mb
    )
    log on --日志文件
    (
    name='School_log',
    filename='c:school.ldf',
    size=5mb,
    filegrowth=5mb,
    maxsize=50mb
    )

    --查询所有学生的姓名、年龄及所在班级 (班级在另一个表中)
    --当多个列在不同的表中时,要跨表查询,所以一般可以使用inner join
    --tc ts是对表名起的别名
    select
    ts.tsname,
    ts.tsage,
    tc.tclassname
    from TblStudent as ts
    inner join TblClass as tc on ts.tsclassid=tc.tclassid(只查询两个表中都有的数据)

    --切换数据库
    use school
    go

    --》》》full join 是查询所有的数据(没有的为空)

    4. 创建表

    ---子查询写法
    select
    tsname,
    tsage,
    班级名称=(select tclassname from TblClass where TblClass.tclassid=TblStudent.tsclassid)
    from TblStudent

    --创建表
    create table Class
    (
    ClassId int identity(1,1) primary key,
    ClassName varchar(50) not null,
    ClassDesc varchar(50) not null
    )

    --查询学生姓名、年龄、班级及成绩(成绩属于第三张表)
    select
    ts.tsname,
    ts.tsage,
    tc.tclasssname,
    tscore.tenglish,
    tscore.tmath
    from TblStudent as ts
    inner join TblClass as tc on ts.tsclassid=tc.tclassid 
    inner join TblScore as tscore on tscore.tsid=ts.tsid

    --删除表
    drop table Class

     

    --向Class表中插入数据
    insert into Class(ClassName,ClsDesc)values('大三','三年');

    --》》》左外联接(左联接)

    --insert into...values.. 这种写法每次只能插入一条数据

    --查询没有参加考试的学生的姓名与编号
    --把左表(left join 关键字左边的表)中的全部记录都显示出来,对于那些在右表中能找到匹配的记录,显示对应匹配数据,对于那些右表中找不到匹配的记录显示为null
    select
    ts.tsid,
    ts.tsname,
    TblScore.*
    from TblStudent as ts
    left outer join TblSore.tsid=ts.tsid   --outer可以不写

    --向Class表中插入多条数据
    --重复数据不重复插入,union关键字本身就具有去掉重复的意思
    --union | union all (重复插入)
    insert into Class
    select '大三','三年' union
    select '三五','间谍' union
    select '一一','多久' union
    select '六七','得到'

    --》》》右外联接
    --表示要将右表(right join 右边的表)中的所有数据都显示,左表中只显示那些匹配的数据。

    --将Class表中的数据备份到Student表中
    --这种写法会将Class表中的所有数据插入到Student表中
    --前提是Student表不存在,如果这个表存在则报错。
    select * into Student from Class

    select
    ts.tsid,
    ts.tsname,
    TblScore.*
    from TblStudent as ts
    right outer join TblSore.tsid=ts.tsid

    --向一个已经存在的表中插入数据,数据的来源是Class表
    insert into Student(ClassName,ClsDesc)
    select ClassName,ClsDesc from Class

    --右外联与左外联都是先将匹配的数据找到,然后再将那些没有匹配的数据添加进来,(注意:不是一起查询出来的,有先后顺序)

     

    --》》》练习:查询所有学生(参加和未参加的考试)的学生姓名、年龄、成绩,如果没有参加考试显示缺考,如果小于english或者math 小于60分显示不及格
    select
    ts.tsname,
    ts.tsage,
    tscore.tsid,
    case
    when tscore.tenglish is null then '缺考'
    else convert(varchar(10),tscore.tenglish)
    end as 英语成绩,
    case
    when tscore.tmath id null then '缺考'
    else convert (varchar(10),tscore.tmath)
    end as 数学成绩,
    是否报考=
    case
    when tscore.tscoreid is null then '是'
    else '否'
    end
    from TblStudent as ts
    left join TblScore as tscore on ts.tsid=tscore.tsid

    --查询表中数据
    select * from Class

    3.视图

    5.update 数据

    视图本身并不存储数据,只是存储的查询语句,如果把真实表中的数据修改后,则通过视图查询到的结果也变了。

    --将所有年龄小于20岁的人的年龄都改成19(tage是Class表后加属性)
    update Class set tage=19 where tage<20

    视图的目的是方便查询,所以一般情况下不能对视图进行增删改查

    --将年龄为19岁的并且性别为0的人的姓名两边★改为☆
    update Class set ClassName =replace (tname,'★','☆') where tage=19 and tgender=0

    --在视图中的查询语句,必须为每一列创建一个列名
    create view vw2
    as
    select
    tsname,
    case
    when tsage>13 and tsage<=16 then '少年'
    when tsage>50 then '老年'
    else '青壮年'
    end as 称呼
    from TblStudent

    6.删除数据

    --在视图中不能使用order by语句。除非:另外还指定了top 或for xml
    --错误
    create view vw3
    as
    select * from TblStudent order by tsage desc

    delete from Class --删除所有数据 自动编号没有恢复到默认值 可以根据条件来删除
    truncate table Class --重新设置了自动编号 删除只能一次性都清空,不能根据条件来删除 清除速度(性能)比delete语句快的多

    --正确
    create view vw3
    as
    select top 3 * from TblStudent order by tsage desc

    delete from Class where tage=19 or tage is null --删除19岁或者空值

    4.声明变量与使用

    》》》》》》》》》删除重复数据只保留一条(id最小的一条)《《《《《《《《《
    》》》》》》》》》删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录 《《《《《《《《《
    delete from people
    where peopleName in (select peopleName from people group by peopleName having count(peopleName) > 1)
    and peopleId not in (select min(peopleId) from people group by peopleName having count(peopleName)>1)

    --》》》局部变量
    --声明变量
    declare @name varchar(10)
    declare @age int

     

    --赋值
    set @name='yhz'
    set @age=17

    7.条件查询,模糊查询

    --输出值
    print @name
    print @age

    --查询数学没有及格的学生的学号
    select
    fid as 学号,
    fmath as 分数
    from MyStudent where fmath<60

    --使用set与select为变量赋值的区别
    declare @rcount int
    set @rcount=(select count(*) from TblStudent)
    print @rcount

    --查询年龄在20-30岁之间的男学生
    select
    fname as 姓名 from MyStudent where fage between 20 and 30 and fgender='男'

    declare @rcount int
    select @rcount=count(*) from TblStudent
    print @rcount

    --查询班级id 1 2 3 的所有学生
    select * from MyStudent where classid in (1,2,3)

    --》》》全局变量
    print @@language
    print @@version
    print 'aaa'+100
    --通过判断@@error变量中是否不为0,就可以判断上一条sql语句执行是否出错了
    --如果@@error为0,表示上一条sql语句执行没出错,如果@@error不为0,则表示上一条sql语句出错了。
    print@@error

    --查询所有姓赵的同学 (通配符%表示:任意多个任意字符)
    select * from MyStudent where fname like '赵%'

    --》》》通过while计算1-100之间所有奇数的和

    --查询出姓名中只要包含一个‘民’字即可。
    select * from MyStudent where fname like '%民%'

    --声明变量并初始化

    --查询所有姓赵的同学,并且姓名字数是3个
    --通配符 _ :表示任意的单个字符。
    select * from MyStudent where fname like '赵__'
    select * from MyStudent where fname like '赵%' and len(fname)=3

    declare @sum int=0
    declare @i int =1
    while @i<=100
    begin
    if @i%2<>0
    begin
    set @sum=@sum+@i
    end
    end
    print @sum

    --查询出姓名中包含‘民’或‘用’的同学
    --通配符[]:表示中括号中的任意个字符,只选一个匹配
    --通配符 ^a :表示除了a这个字符都行。
    select * from MyStudent where fname like '%[民用]%'

    5.事务

    8.聚合函数

    事务有四个属性:原子性 一致性 隔离性 持久性
    原子性:对于数据修改,要么全都执行,要么全都不执行
    一致性:当数据完成时,数据必须处于一致状态
    隔离性:对数据进行修改的所有并发事务时彼此隔离的。这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
    永久性:事务完成后,他对数据库的修改被永久保持,事务日志能够保持事务的永久性

    --查询数学成绩最高低分
    select max(fMath) as 数学成绩最高分 from MyStudent
    select min(fMath) as 数学成绩最低分 from MyStudent

    --打开事务
    begin transaction

    --平均分(计算平均分的时候对空值不处理)
    select avg(fMath) as 平均分 from MyStudent

    本文由彩世界平台发布于工作委员会,转载请注明出处:SQL Server 数据库基础笔记分享(上)

    关键词:

上一篇:Linux下Sendmail慢卡问题的解决

下一篇:没有了