• 菜鸟眼中的数据库 SQLSERVER


    用这篇文章来帮助自己学习下数据库的知识。马上要换东家了。或许能够用的上! 2015年9月9日18:40:23

    数据库是一个很高端的东西。装的都是最原始的数据。

    首先说说我印象中的数据库:

    用来存放数据的地方。里面有资料库(Database),数据表(Table)

    我们能对数据操作:增(Insert)删(Delete)查(Select)改(Update)放在一起就是IDSU(爱的是you)

    好像就那么回事!

    然而数据库是这样的。

    操作数据库得了解一下这些!

    SQL分类:

    • DDL:数据定义语言(Create【创建】,Alter【更改】,Drop【移除】,Declare【声明】)
    • DML:数据操作语言(Select【查询】,Delete【删除】,Update【更新】,Insert【插入】)
    • DCL:数据控制语言(Grant【授权】,Revoke【撤销授权】,Commit【提交】,RollBack【回滚】)

    一个一个的来吧!

    Grant控制命令:

    SQL赋予用户权限的命令。

    格式如下:

    grant 权限 on 数据库对象 to 用户

    举例:

    grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。

    grant select on testdb.* to common_user@'%'
    grant insert on testdb.* to common_user@'%'
    grant update on testdb.* to common_user@'%'
    grant delete on testdb.* to common_user@'%'

    --或者用一条语句来完成
    grant select,insert ,update,delete on testdb.* to common_user@'&'

    grant 数据库开发人员,创建表、索引、视图、存储过程、函数。。。等权限。

    grant create on testdb.* to developer@'192.168.0.%';
    grant alter  on testdb.* to developer@'192.168.0.%';
    grant drop   on testdb.* to developer@'192.168.0.%';
    

    等。就是给权的一个关键字。啥权限都给

    Reovke 跟上面的授权刚好想法,撤销的。

    使用方法格式与上相同。

    commit 与rollback 在事物中再说。

    再说说 运算符

    UNION运算符:通过组合其他两个结果表(Table1与Table2)并消去表中任何重复行而派生出的一个结果表。

    当ALL随UNION一起使用时 (即 UNION ALL) 不消除重复行。两种情况下,派生表的每一行不是来自Table1就是来自Table2.

    EXCEPT运算符:通过包括所有在Table1中但不在Table2中的行并消除所有重复行而派生出一个结果表。当ALL随EXCEPT 一起使用时(EXCEPT ALL) 不消除重复行。

    INTERSECT 运算符:通过只包括Table1和Table2中都有的行并消除所有重复行并派生出一个结果表。当ALL 随 INTERSECT 一起使用时( INTERSECT ALL)不消除重复行

    注意:使用运算词的几个查询结果行必须是一致的。

    连接查询

    本文主要列举两张和三张表来讲述多表连接查询。
    新建两张表:
    表1:student  截图如下:
    SQL多表连接查询(详细实例)_新客网
    表2:course  截图如下:
    SQL多表连接查询(详细实例)_新客网

    left outer join(左外连):

    SQL:SELECT * FROM STUDENT A LEFT OUTER JOIN COURSE  B ON A.ID=B.ID 

    执行结果

    SQL多表连接查询(详细实例)_新客网

    左(表)外连接包含左表所有行,如果左表中某行在右表中没有匹配,则结果中对应行右表的部分全部为空(NULL).注意:此时我们不能说结果的行数。当然此处查询结果的行数。因为左右两表此时为一对一关系

    right outer join (右连接)

    SQL语句:SELECT * FROM STUDENT RIGHT OUTER JOIN COURSE ON STUDENT.ID=COURSE.ID

    执行结果:

    SQL多表连接查询(详细实例)_新客网

    右表链接包含right join 右表所有行,如果左表中某行在右表中没有匹配,则结果中对应的左表的部分全部为空(NULL).

    full outer join (完全外连接)

    SQL语句:SELECT * FROM STUDENT FULL OUTER JOIN COURSE ON STUDENT.ID=COURSE.ID

    执行结果:

    SQL多表连接查询(详细实例)_新客网


    完全外连接包含两表中所有的行。左表在右表部分没有的则为空。右表在左表部分没有的也为空


    inner join 内连接
    SQL语句:SELECT * FROM STUDENT INNER JOIN COURSE ON STUDENT.ID=COURSE.ID
    执行结果:
    SQL多表连接查询(详细实例)_新客网
    给个眼神,自己根据结果去领会。

    cross join(交叉连接)
    SQL语句:SELECT * FROM STUDENT CROSS JOIN COURSE
    执行结果:

    如果我们此时在SQL语句加上where 子句。
    SELECT * FROM STUDENT CROSS JOIN COURSE WHERE STUDENT.ID=COURSE.ID
    此时返回的结果集与 INNER JOIN 所执行的结果一样


    两表关系为一对多,多对一或多对多时的连接语句
    当然上面两表为一对一关系,那么如果表A和表B为一对多、多对一或多对多的时候,我们又该如何写连接SQL语句呢?
    其实两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的结果不一样,当然两表也要略有改动。
    比如表1的列可以改为:
    Sno Name Cno
    表2的列可以改为:
    Cno CName
    这样两表就可以写一对多和多对一的SQL语句了,写法和上面的一对一SQL语句一样。
    下面介绍一下当两表为多对多的时候我们该如何建表以及些SQL语句。
    新建三表:
    表A:  student 截图如下:

    SQL多表连接查询(详细实例)_新客网


    表B:  course 截图如下:

    SQL多表连接查询(详细实例)_新客网


    表C:  student_course 截图如下:

    SQL多表连接查询(详细实例)_新客网


    一个学生可以选择多门课程,一门课程可以被多个学生选择,因此学生表student和课程表course之间是多对多的关系。
    当两表为多对多关系的时候,我们需要建立一个中间表student_course,中间表至少要有两表的主键,当然还可以有别的内容。
    SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno
    执行结果:

    SQL多表连接查询(详细实例)_新客网

    此条SQL执行的结果是学生选课的情况。

    然后贴出实际会用到的一些SQL语句
    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select * into b from a where 1 <>1
    法二:select top 0 * into b from a

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
    insert into b(a, b, c) select d,e,f from b;

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    例子:..from b in '"&Server.MapPath(".")&"data.mdb" &"' where..

    4、说明:子查询(表名1:a 表名2:b)
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    7、说明:在线视图查询(表名1:a )
    select * from (SELECT a,b,c FROM a) T where t.a > 1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

    11、说明:四表联查问题:
    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

    12、说明:日程安排提前五分钟提醒
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

    14、说明:前10条记录
    select top 10 * form table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)

    17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()

    18、说明:随机选择记录
    select newid()

    19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

    20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U'

    21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3

    23、说明:初始化表table1
    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
    对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:
    Randomize
    RNumber = Int(Rnd*499) +1

    While Not objRec.EOF
    If objRec("ID") = RNumber THEN
    ... 这里是执行脚本 ...
    end if
    objRec.MoveNext


    Wend
    这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?
    采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:
    Randomize
    RNumber = Int(Rnd*499) + 1

    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber

    set objRec = ObjConn.Execute(SQL)
    Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")

    不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
    再谈随机数
    现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。
    为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3

    假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):
    SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"

    注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。

    随机读取若干条记录,测试过
    Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)
    Sql server:select top n * from 表名 order by newid()
    mysqlelect * From 表名 Order By rand() Limit n
    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)
    语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
    使用SQL语句 用...代替过长的字符串显示
    语法:
    SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
    Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;

    作者:不再奢望
    出处:http://www.cnblogs.com/mgxiaobo/
    本文版权归作者和博客园共同拥有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位置给出原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    学习第23天
    学习第22天
    学习第21天
    Servlet交互与JSP
    Cookie与Session
    servlet入门
    网络编程
    DOM4j
    xml文档对象模型doc
    反射
  • 原文地址:https://www.cnblogs.com/mgxiaobo/p/4797099.html
Copyright © 2020-2023  润新知