zoukankan      html  css  js  c++  java
  • SQLServer数据库(一)

    数据库(DataBase,简DB)

    数据在应用程序中以“类.对象”的形式来组织。而在数据库中以“表”的形式来组织。

    一行记录(一条数据)———— 一个对象(实体)。

    一个表—————— 一个类。

    表的列—————— 类的字段(属性)。

    数据库管理系统————DBMS

    数据库系统————DBS

    数据库管理员————DBA   Administrator

    系统数据库:master,model,msdb,tempdb

    数据库文件分为:数据库文件.mdf 、事务日志文件.ldf

    数据完整性

    1.实体完整性约束。

    2.域完整性约束。

    3.引用完整性约束。

    4.自定义完整性约束。

    主键和外键

    主键,primary key ,用于强制表的实体完整性。主键中禁止相同的数据。如果两列或多列组合起来唯一的标识表中的每 一行,则该主键叫“复合主键”。主银拥有:唯一性、最少性、稳定性。

    外键:foreign key ,立字段引用其他表的主键。

    SQLServer数据类型:

    类型

    数据类型

    描述

    用途

    整型

    int

    占用4个字节的整数

    存储到数据库的几乎所有数值型的数据都可以使用这种数据类型

    smallint

    占用2个字节的整数

    对存储一些常限定在特定范围内的数值型数据非常有用

    tinyint

    占用1个字节的整数

    在只打算存储有限数目的数值时很有用

    浮点型

    real

    近似数值类型

    一种近似数值类型,供浮点数使用

    float

    近似数值类型

    一种近似数值类型,供浮点数使用

    decimal

    固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。范围是小数点左右所用存储的数字的总位数,精度是小数点右边存储的数字的位数

    通常存储精度要求较高的数据,如货币金额

    numeric

    同上

    同上

    字符型

    char

    固定长度非Unicode字符数据,最大8000个字节

    常用于存储固定长度的少量文本,如身份证号

    varchar

    可变长度非Unicode字节数据,有两种形式:varchar(n)或varchar(max)

    常用于存储可变长度的少量文本,如学校的英文名称

    text

    非Unicode字节数据

    常用于存储文章等大文本,如个人的英文简历

    Unicode型

    nchar

    固定长度Unicode字符数据,最大4000字符

    常用于存储固定长度的少量文本。

    nvarchar

    可变长度Unicode字符数据

    常用于存储可变长度的少量文本,如学校的中文名称

    ntext

    Unicode字符数据

    常用于存储文章等大文本,如个人的中文简历

    /否型

    bit

    只能是01或空值

    表示 是/否 值

    二进制型

    binary

    定长的二进制数据

    当输入表的内容接近相同的长度时,应该使用这种数据类型

    varbinary

    变长的二进制数据

    当输入表的内容大小可变时,应该使用这种数据类型

    image

    变长的二进制数据

    如图片、声音等

    货币型

    money

    固定精度和范围的数值型数据

    常用于存储金额

    smallmoney

    同money,但小于money的取值范围 

    同上

    日期时间型

    datetime

    表示日期和时间,可以精确到3.33毫秒

    如’2010-1-1 01:01:01’

    smalldatetime

    同datetime,精确到分种

    特殊类型

    timestamp

    创建一个数据库范围内的唯一时间戳

    一个表中只能有一个timestamp列。在一个数据库中,timestamp值是唯一 的

    uniqueidentifier

    一个全局的唯一标识符

    精确数字:bit,tinyint,smallint,int,bigint,numeric,decimal

    近似数字:float,real

    字符串:char,varchar,text

    Unicode字符串:nchar,nvarchar,ntext

    二进制字符串:binary, varbinary,image

    日期和时间:date,time,datetime,smalldatetime

    SQL:结构化查询语言,是针对数据库而言的一门语言。可以创建数据库、数据表。可以针对数据库的数据进行增、删、改、查 等操作,可以创建视图、存储过程,可以赋予用户权限。

    SQLServer中的运算符与编程语言的区别:

    1.比较运算符:等于——“=” , 不等于——“<>”。

          逻辑运算符:and、ornot

    use database_name; 用于选定当前SQL操作语句对哪一个数据库生效,默认的是系统数据库master

    插入数据

    1.单行插入:insert [into] table_name [列名列表,如果是全字段可省]  values (值列表)

    into 可以省略,列名不写则插入所有列,多个列名和多个值列表用逗号隔开,分号“;”是终止符,可以省略。

    每次只能插入一行,不能为标识列赋值。字符型和日期必须加单引号“ ’ ”。

    2.通过select、union关键字插入多行

    insert into table_name (列名列表) 

    select 值列表 union --第一条数据

    select 值列表 union --第二条数据

    ..... --最后一条数据的末尾不加union

    3.复制表数据

    select、from 关键字:insert into 目标数据表名 (列名列表) select 源表列名列表 from 源数据表名

    目标数据表必须预先建好,并且具有相应数据类型的列。查询得到的数据个数、顺序、数据类型,必须与插入的项

    保持一致

    select、intofrom关键字:select 源数据表的列名列表 into 目标数据表名 from 源数据表名

    目标数据表会自动创建,并且结构和源数据表一模一样。

    如果要在目标数据表中加一列(标识列),则可以这样:

    select identity(数据类型一般是int,标识种子.标识增量) as 标识列名,源数据表列名列表 

    into 目标数据库表名 from 源数据库表名

    这样的目标表也会自动创建,只是多一了列标识列

    修改数据

    update table_name set 列名1=更新值,列名2=更新值..... where 条件

    如果where语句不写,则作用于所有记录

    删除数据:

    delete from table_name where 条件(如:id=100)

    如果不写where会清空所有记录,但标识列没有归初始值。

    truncate table table_name;

    直接清空所有数据表中的数据,标识确也会初始化,但有外键的表无法使用该语句。

    查询数据

    select 列名列表 from table_name where 查询条件表达式 order by 排序的列名 [asc或desc]

    如果不限制where语句,则查询数据表中所有数据,

    order by 是用来进行排序的,asc表示从小到大,desc相反,

    order by newid() --可以把查询的结果集打乱顺序,即出现随机查询结果

    默认是desc。orderby后面可以跟多个列,但是用逗号“,”隔开,这样排序是依column先后顺序来排序。

    如:select * from news order by nid,ntid;--这样就是先按nid排序,然后按ntid排序

    查询所有行和列:select * from table_name;--“*”表示所有的列

    列的别名:select 原列名 as 新列名,列名 新列名,新列名=列名,列名 新列名,新列名=列名1+列名2(都是字 符列,这样可以合并多列一起显示) from table_name

    查询空值:select * from table_name where column is null --查询该列是null的记录

    查询时使用常量:select (‘北新新兴桥’+字符值列表) as 新列名 from table_name --该列每一条记录前都加上了

    ‘北新新兴桥’这几个字。

    查询返回限制行数的记录:select top row_num 列名列表 from table_name --查询前row_num条数据

    select top percent num 列名列表 from table_name --查询前百分之num条数据 

    函数,常用四类:字符串函数、日期函数、数学函数、系统函数。不同类别的函数者可以和select,update,insert,delete

    语句使用,where子句中也可以使用。视需求决定。以下的示例都是以select语句作例子。

    字符串函数

    函数名

    描述

    举例

    charindex

    用来寻找一个指定的字符串在另一个字符串中的起始位置

    select charindex(‘name’,’My name is Tom’,1)

    返回:4

    len

    返回传递给它的字符串长度

    select len(‘SQL Server课程’) 返回:12

    upper

    把传递给它的字符串转换为大写

    select upper(‘sql’)  返回:SQL

    lower

    把传递给它的字符串转换为小写

    select lower(‘SQL’) 返回:sql

    ltrim

    清除字符左边的空格

    select ltrim(‘   宇‘) 返回:宇(后面的空格保留)

    rtrim

    清除字符右边的空格

    select rtrim(‘  宇  ’) 返回:  宇(后面没有空格)

    right

    从字符串右边返回指定数目的字符

    select right(‘买卖提’,1) 返回:提

    left

    从字符串左边返回指定数目的字符

    select left(‘买卖提’,1)  返回:买

    replace

    替换一个字符串中的字符

    select replace(‘爱不爱’,’爱’,’约’)

    返回:约不约

    stuff

    在一个字符串中,删除指定长度的字符,并在该位置插入一个新的字符串 

    select stuff(‘abcdefg’,2,3,’爱不爱我’)

    返回:a爱不爱我efg

    日期函数:

    函数名

    描述

    举例

    getdate

    获取系统当前日期时间

    select getdate()  返回:当前的日期

    dateadd

    将指定的数值添加到指定的日期部分后的日期

    select dateadd(mm,4,’2009-1-1’),这里的mm是月份,返回:2009-05-01 00:00:00.000

    datediff

    两个日期之间的指定日期部分的间隔

    select dateadd(mm,’2009-1-1’,’2009-5-1’)

    返回:(后面一个减前一个)

    datename

    日期中指定日期部分的字符串形式

    select datename(dw,’2009-1-1’)

    返回:星期四(这里的dw和weekday一样)

    datepart

    日期中指定日期部分的整数形式

    select datepart(dw,’2009-1-1’)

    返回:5(这里表示星期四,从星期日开始1-7)

    数学函数:

    函数名

    描述

    举例

    rand

    返回从01之间的随机float值

    select rand()  返回:0.123412341379645

    abs

    取数值表达式的绝对值

    select abs(-43) 返回:43

    ceiling

    向上取整,取大于或等于指定数值、表达式的最小整数

    select ceiling(43.1) 返回:44

    floor

    向下取整,取小于或等于指定表达式的最大整数

    select floor(43.9) 返回:43

    power

    取数值表达式的幂值

    select power(5,3)  返回:125

    round

    将数值表达式四舍五入为指定精度

    select round(4.3234,1) 返回:4.3000

    sign

    对于正数返回1,对于负数返回-1,对于0则返回0

    select sign(-43)  返回:-1

    sqrt

    取浮点表达式的平方根

    select sqrt(9)  返回:3

    系统函数:

    函数名

    描述

    举例

    convert

    用来转变数据类型

    select convert(varchar(5),12345)

    返回:字符串形式的’12345’

    current_user

    返回当前数据库用户的名字

    select current_user

    返回:你的登录名(一般是dbo)

    datalength

    返回用于指定表达式的字节数

    select datalength(‘中国A联盟’)

    返回 :5

    host_name

    返回当前用户所登录的计算机名字

    select host_name

    返回:你所登录的数据库服务器名

    system_user

    返回当前所登录的用户名称

    select system_user

    返回:你当前登录的用户名

    user_name

    从给定的用户ID返回用户名

    select user_name()

    返回 :从任意数据库中返回’dbo’

    模糊查询:

    1.通配符

    使用like运算符,只用于字符串。

    符号

    解释

    示例

    _

    一个字符

    a lick ‘c_’,则符合条件的a如cs、cd

    %

    任意长度的字符串 

    a lick ‘c%’,则符合条件的acba、ccc

    []

    括号中所指定范围内的一个字符

    a lick ‘9w0[1-2]’,则符合条件的a9w01、9w02

    [^]

    不在括号中所指定范围内的任意一个字符

    a like ‘9w0[^1-2]’,则符合条件的a9w03、9w09

    例:使用like进行模糊查询

    select * from students where studentname like ‘张%’

    2.使用between在某个范围内查询

    要实现这种查找,必须知道查找的初值和终值,并且初值必须小于等于终值

    select * from table_name where column_name between 初值 and 终值

    例:select * from students where score between 60 and 80

    如果初值大于终值,不会报错,但没有结果返回

    3.使用in在列举值内进行查询:

    将列举值方在括号里,用逗号“,”隔开,列举值类型必须与匹配的列具有相同的数据类型。

    例:select * from student where saddress in (‘北京’,’广州’,’上海’)

    也可以把in关键字和not关键字联合起来用,如:select * from student where saddress not in (‘北京’)

    表示的是地址不在’北京’的学生表信息

    聚合函数:能基于列进行计算,将多个直合并为一个值。对一组值进行计算,并返回计算后的值。

    使用聚合函数进行统计值时,将忽略NULL值,但不忽略重复项。

    1.sun(),返回表达式中所有数值的总和,只能用于数字列,只能返回一个数值,不能够直接与可能返回多行的列一起 使用来进行查询。

    例:select sun(score) from result where studentid=33 --查询学号为33的学生的成绩总和

    2.avg(),返回表达式中所有数值的平均值,只能用于数值列。

    例:select avg(score) from result where score>=60 --查询及格的平均值。

    3.max()和min():max()返回表达式中的最大值,min()返回表达式中的最小值,它们都可以用于数字型,字符型以及 日期/时间类型的列。

    例:select avg(score),max(score),min(score) from result where score>=60

    --查询及格线上的平均分、最高分、最低分

    4.count(),返回提供的组成或记录龄中的计数。可以用于数字和字符类型的列,也可以使用星号’*’作为count()的 表达式。

    例:select count(*) from score where score>=60 --查询及格人数的语句 

    也可以使用整数类型的值当作表达式,如:

    select count(1000) from score where score>=60  --结果将和上面的一样

    小提示:count(distinct 表达式),遇到重复数据,只记录一次

    使用group by 进行分组查询:

    使用group by关键字时,在select列表中可以指定的列是有限制的,

    只允许“被分组的列”和“为每个分组返回一个值的表达式”

    单列分组,例:

    --按照课程编号来分组,并显示每个课程的平均分

    select couseId,avg(score) as 课程平均成绩 from score 

    group by couseId

    --查询男女学生人数是多少。

    select count(1) as 人数,ssex from student 

    group by ssex

    --查询每个年级的总人数。

    select count(1) as 年级人数,gradeId from student 

    group by gradeId

    --查询每个科目的平均分,并且按影由低到高的顺序排列显示。

    select coursedId,avg(score) from Score 

    group by courseId 

    order by avg(score) desc

    多列分组查询,例:

    --按年级进行分组,并分组成男女组,并且以年级进行排序。

    select count(1) as 人数,gradeId,sex from student 

    group by gradeId,sex 

    order by gradeId

    使用having子句进行分组筛选,用来对分组后的数据进行筛选,将’组’看做’列’来限定条件。

    1--查询总人数超过15的年级。

    select count(1),gradeId from students 

    group by gradeId

    having count(1)>15

    2--查询平均分及格的课程信息。

    select courseId,avg(score) from score

    group by courseId

    Having avg(score)>=60

    3--查询每门音响及格人数和及格的平均分。

    select count(1),avg(score),courseId from Score where score>=60

    group by courseId

    4--查询每门课程及格总人数和及格平均分在80分以上的记录。

    select count(1),avg(score),courseId from Score where score>=60

    group by courseId

    having avg(score)>=80

    5--在按影部门分类的员工表中,查询有多少个员工的工资不低于2000的部门编号。

    select 部门编号,count(1) from 员工信息表 where 工资>=2000

    group by 部门编号

    having count(1)>1

    小提示:在select语句中,wheregroup byhaving子句和聚合函数的执行次序如下:

    where子句从数据中地掉不符合其搜索条件的数据;group by子句搜集数据到各组,统计函数为各组统计;having 句去掉不符合其组搜索条件的各组数据行。

    多表联接查询

    1.内联接,是最典型、最常用的联接查询,它根据表中共同的列来进行匹配。特别是某个表存在主外键关系时通常会使用

    到内联接查询。

    1)在where子句中指定联接条件,例:

    select Students.sname,Score.courseId,Score.score from Students,Score

    where Students.scode=Score.studentId

    2)在from子句中使用inner join ... on

    select S.sname,C.courseId,C.score from Students as S

    inner join Score as C on (S.scode=C.studentId)

    inner join 用来联接两个表。inner 可以省略。on用来设置条件。as 指定表的“别名”。

    3)用inner join三表内联接:

    select S.sname,CS.courseName,C.score from Students as S

    inner join Score as C on (S.scode=C.StudentId)

    inner join Course as CS on (CS.courseId=C.courseId)

    2.外联接,在外联接中参与联接的表有主从之分,以主表的每行数据匹配从表的数据列,将符合联接条件的数据直接返回

    到结果中,对那些不符合条件的列,将被填上NULL值后再返回到结果集中。

    1)左外联接查询,使用left join ... on 或 left outer join ... on关键字来进行表之间的关联。

    2)右外联接查询,使用right join ... on 或 right outer join ... on关键字来进行表之间的关联。

    左右都是相对的,是指把关键字指向的那张表当作主表,主表的所有符合查询的数据行都会显示出来,从表的数据行

    只有符合主表匹配的才会显示出来,没显示出来的用NULL值代替。

    例,下面两个例子效果是一样的:

    select S.sname,C.courseId,C.score from Students as S

    left outer join Score as C on S.scode=C.studentId

    select S.sname,C.courseId,C.score from Score as C

    right outer join Students as S on C.studentId=S.scode

    联结两个查询语句:

      查询union [all] 查询2 --’all’关键字时,重复数据不乎略。

  • 相关阅读:
    view 与layer
    xcode中create groups 和 create folder reference 的区别
    iOS 9 学习系列:UIStack View (转载)
    使用JQuery插件,排序Gridview的某个字段
    Fixed GridView Header
    在TextBox里面仅仅允许数字,按Enter键进入下一个TextBox
    实现AJAX局部刷新以及PageMethod方法的使用
    用户控件
    JSON的使用
    ASP.NET页面生命周期
  • 原文地址:https://www.cnblogs.com/qneverever/p/4501883.html
Copyright © 2011-2022 走看看