菜鸟眼中的数据库 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 [email protected]‘%‘
grant insert on testdb.* to [email protected]‘%‘
grant update on testdb.* to [email protected]‘%‘
grant delete on testdb.* to [email protected]‘%‘

--或者用一条语句来完成grant select,insert ,update,delete on testdb.* to [email protected]‘&‘

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

grant create on testdb.* to [email protected]‘192.168.0.%‘;
grant alter  on testdb.* to [email protected]‘192.168.0.%‘;
grant drop   on testdb.* to [email protected]‘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  截图如下:

表2:course  截图如下:

left outer join(左外连):

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

执行结果

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

right outer join (右连接)

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

执行结果:

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

full outer join (完全外连接)

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

执行结果:

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

inner join 内连接SQL语句:SELECT * FROM STUDENT INNER JOIN COURSE ON STUDENT.ID=COURSE.ID执行结果:给个眼神,自己根据结果去领会。

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 截图如下:

表B:  course 截图如下:

表C: 
student_course 截图如下:

一个学生可以选择多门课程,一门课程可以被多个学生选择,因此学生表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语句
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 time2select 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、说明:初始化表table1TRUNCATE 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“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:RandomizeRNumber = Int(Rnd*499) +1

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

Wend
这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?  采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:RandomizeRNumber = 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 nAccess左连接语法(最近开发要用左连接,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 tablenameAccess数据库:SELECT iif(len(field)>2,left(field,2)+‘...‘,field) FROM tablename;
时间: 2024-11-08 23:57:29

菜鸟眼中的数据库 SQLSERVER的相关文章

【初学菜鸟作-MySQL数据库表的基本操作与权限管理】

表基本操作练习 1 复制用户信息表user的所有记录到userdb表里. mysql> create table userdb select * fromuser; 2 查看userdb表的表结构 mysql> desc userdb; 3 删除userdb表的所有记录 mysql> delete from userdb 4 把name字段设置为index字段 mysql> create index name on userdb(name) 5 添加编号字段id  在所有字段上方,

【初学菜鸟作-mySQL数据库的基本使用】

Mysql数据库的基本应用 一.数据库的基本命令 登录数据库 [[email protected] ~]# mysql -h127.0.0.1 -uroot-p123456 mysql> show databases; --查看服务器已有的库 mysql> select database(); --显示当前所在的库 mysql> show tables; --显示当前库存在的表 mysql> select * from user\G --换行显示表里的所有记录(*代表字段,带\G表

Java程序操作数据库SQLserver详解

数据库基本操作:增删改查(CRUD) crud介绍(增.删.改.查操作) CRUD是指在做计算处理时的增加(Create).查询(Retrieve)(重新得到数据).更新(Update)和删除(Delete)几个单记事的首字母简写.主要被用在描述软件系统中数据库或者持久层的基本操作功能. Create new records Rctricvc cxisting rccords Update existing records Delete existing records. 要对数据表进行增.删.

菜鸟眼中的java前世今生

作为一个既不是计算机科班出身也不是培训班出来的菜鸟小测试,感觉前程无光,只能苦读自学,于是决定先从java语言开始.幸得身边有的大牛一枚,强烈推荐(疯狂java讲义),大牛每周末过来给免费答疑.很难吃透,如同天书,第一章是java的前生今世,犹如走马观花.但也想简单梳理下思路,来日回顾愿仍有收获. java语言的发展史: java语言因为纯粹的面向对象,相对于C++具有功能强大与简单易用的功能.有的开发将java作为一个平台,也有的开发将它作为一种信仰. 静态面向对象编程语言:先编译 后运行 动

一个菜鸟眼中的前端

首先,笔者本身不是大牛级别的程序员,一个入行没多久的菜鸟而已,因此观点难免有所偏差,欢迎指正,不喜勿喷.算是自己工作三年以来的经验之谈吧.  什么是前端?前端的过去,现状,未来 简单的说前端就是在B/S模式中,处在browser部分的代码,使用的技术主要为javascript ,css,html,html(当然还有actionscript,vbscript等)主要用于内容的展示,css主要用于页面的美化,javascript主要用于行为的控制.然而,前端却不止于此,首先前端代码不一定只适用于B/

菜鸟崛起--谈谈数据库(基于5.6)

我们在做程序开发说白了就是收集数据.维护数据与提供数据的功能,这里我们始终围绕着一个数据在操作,这种说法很片面但是实际上也的确体现了数据在开发中的重要性,那么我们是通过什么来操控数据呢?数据库管理系统.下面我们就来认真认识一下数据库吧. 1.数据库的概述

测试眼中的数据库

前言: 对于一名测试人员来说,数据库的使用也是一项很基础的技能要求.因为绝大多数的应用都跟数据紧密相关,比如weixin,QQ,都需要存放大量的数据信息:联系人信息.发送的信息.朋友圈信息等等.这些信息绝大多数是存放在关系型数据库中. 因此,软件测试工程师对数据库的了解,是基本的要求. 一.数据库的本质(Mysql) 数据库的关系型数据库. 所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据. 1.1 RDBMS即关系数据库管理系统(Relat

简单粗暴的关键两部实现连接远程云服务器数据库SqlServer 2012

要连上远程服务器的数据库,前面的那些数据库配置就不说了,网上都一样. 下面讲讲关键的两点,也是我尝试普通的方法无效后通过下面的方法成功连上的. 1.点开云服务器的安全组,看看里面的端口是否都放行了.我这里是暴露全部端口. 2.在配置工具里网络协议中将IPAll端口改成1433,并且把ip1的端口也改成1433,并启用 原文地址:https://www.cnblogs.com/clsl/p/10693505.html

小菜鸟之Oracle数据库之事务

Oracle数据库之事务 1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行. 如:网上转帐就是典型的要用事务来处理,用以保证数据的一致性. 2. 事务特性 SQL92标准定义了数据库事务的四个特点: · 原子性(Atomicity):一个事务里面所有包含的SQL语句是一个执行整体,不可分割,要么都做,要么都不做. · 一致性(Consiste