特别说明
参考链接
推导第二步:
DELIMITER //
CREATE FUNCTION addBook(b_name VARCHAR(30))
RETURNS SMALLINT UNSIGNED
INSERT book(book_name) VALUES (b_name);
RETURN LAST_INSERT_ID() //
DELIMITER ;
/*注意:
1、虽然修改了结束分号,不再让SQL结束符和自定义函数中语句结束符冲突,但是方法体需要的是一个整体,
所以必须引入BEGIN .. END来把所有的执行语句标识为一个方法体。
2、显示的结果为自定义的返回值,使用完毕后再修改结束符为 ;
*/
SQL语句大全删除信息
delete from table_name-这是将表中信息删除但是会保留这个表
已知的问题:
数据库概述 / Database Overview
1 关于SQL /
About SQL
构化查询语言(Structured
Query
Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,
可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
1.1 SQL语言 /
SQL Language
结构化查询语言包含6个部分:
1.
数据查询语言(DQL: Data Query Language)
其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER
BY,GROUP
BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。
2.
数据操作语言(DML: Data Manipulation Language)
其语句包括动词INSERT,
UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。
3.
事务处理语言(TPL)
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN
TRANSACTION,COMMIT和ROLLBACK。
4.
数据控制语言(澳门新葡8455最新网站,DCL)
它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。
5.
数据定义语言(DDL)
其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT
TABLE 或 DROP
TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
6.
指针控制语言(CCL)
它的语句,像DECLARE
CURSOR, FETCH INTO和UPDATE WHERE
CURRENT用于对一个或多个表单独行的操作
1.2 SQL数据类型
/ SQL Data
结构化查询语言共有五种数据类型,字符型,文本型,数值型,逻辑型和日期型。
1. 字符型
**VARCHAR VS
CHAR**
VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要。他们都是用来储存字符串长度小于255的字符。
假如你向一个长度为四十个字符的VARCHAR型字段中输入数据Bill
Gates。当你以后从这个字段中取出此数据时,你取出的数据其长度为十个字符——字符串Bill
Gates的长度。假如你把字符串输入一个长度为四十个字符的CHAR型字段中,那么当你取出数据时,所取出的数据长度将是四十个字符。字符串的后面会被附加多余的空格。
当你建立自己的站点时,你会发现使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段时,你不需要为剪掉你数据中多余的空格而操心。
VARCHAR型字段的另一个突出的好处是它可以比CHAR型字段占用更少的内存和硬盘空间。当你的数据库很大时,这种内存和磁盘空间的节省会变得非常重要。
2. 文本型
TEXT
使用文本型数据,你可以存放超过二十亿个字符的字符串。当你需要存储大串的字符时,应该使用文本型数据。
注意文本型数据没有长度,而上一节中所讲的字符型数据是有长度的。一个文本型字段中的数据通常要么为空,要么很大。
当你从HTML
FORM的多行文本编辑框(TEXTAREA)中收集数据时,你应该把收集的信息存储于文本型字段中。但是,无论何时,只要你能避免使用文本型字段,你就应该不使用它。文本型字段既大且慢,滥用文本型字段会使服务器速度变慢。文本型字段还会吃掉大量的磁盘空间。
一旦你向文本型字段中输入了任何数据(甚至是空值),就会有2K的空间被自动分配给该数据。除非删除该记录,否则你无法收回这部分存储空间。
3. 数值型 整数INT
小数NUMERIC 钱数MONEY
INT VS SMALLINT VS
TINYINT
通常,为了节省空间,应该尽可能的使用最小的整型数据。一个TINYINT型数据只占用一个字节;一个INT型数据占用四个字节。这看起来似乎差别不大,但是在比较大的表中,字节数的增长是很快的。另一方面,一旦你已经创建了一个字段,要修改它是很困难的。因此,为安全起见,你应该预测一下,一个字段所需要存储的数值最大有可能是多大,然后选择适当的数据类型。
NUMERIC
为了能对字段所存放的数据有更多的控制,你可以使用NUMERIC型数据来同时表示一个数的整数部分和小数部分。NUMERIC型数据使你能表示非常大的数——比INT型数据要大得多。一个NUMERIC型字段可以存储从-10^38到10^38范围内的数。NUMERIC型数据还使你能表示有小数部分的数。例如,你可以在NUMERIC型字段中存储小数3.14。
MONEY VS
SMALLMONEY
你可以使用
INT型或NUMERIC型数据来存储钱数。但是,专门有另外两种数据类型用于此目的。
如果你希望你的网点能挣很多钱,你可以使用MONEY型数据。如果你的野心不大,你可以使用SMALLMONEY型数据。MONEY型数据可以存储从-922,337,203,685,477.5808到922,337,203,685,477.5807的钱数。如果你需要存储比这还大的金额,你可以使用NUMERIC型数据。
SMALLMONEY型数据只能存储从-214,748.3648到214,748.3647
的钱数。同样,如果可以的话,你应该用SMALLMONEY型来代替MONEY型数据,以节省空间。
4. 逻辑型
BIT
如果你使用复选框(CHECKBOX)从网页中搜集信息,你可以把此信息存储在BIT型字段中。BIT型字段只能取两个值:0或1。
Note:
在你创建好一个表之后,不能向表中添加
BIT型字段。如果你打算在一个表中包含BIT型字段,你必须在创建表时完成。
5. 日期型
DATETIME VS
SMALLDATETIME
一个
DATETIME型的字段可以存储的日期范围是从1753年1月1日第一毫秒到9999年12月31日最后一毫秒。
如果你不需要覆盖这么大范围的日期和时间,你可以使用SMALLDATETIME型数据。它与DATETIME型数据同样使用,只不过它能表示的日期和时间范围比DATETIME型数据小,而且不如DATETIME型数据精确。一个SMALLDATETIME型的字段能够存储从1900年1月1日到2079年6月6日的日期,它只能精确到秒。
DATETIME型字段在你输入日期和时间之前并不包含实际的数据,认识这一点是重要的
1.3 SQL常用命令
/ SQL Frequent Command
可参考常用命令。
1.4 T-SQL简介 /
About Transact-SQL
Transact-SQL(T-SQL)是微软和Sybase使用的一种SQL扩展语言,用于与关系型数据库进行事务交互。T-SQL扩展了SQL的多项标准,包括过程编程,本地变量及多种支持函数,同时也对DELETE和UPDATE语句进行了修改,允许DELETE与UPDATE增加条件FROM。
在流程控制方面,加入了BEGIN和END,BREAK,CONTINUE,GOTO以及IF和ELSE,RETURN,WAITFOR和WHILE等,使其更具编程化。
2 关于数据库
/ About Database
2.1
常用数据库
目前主要的几种流行数据库为MySQL,
SQL server, Oracle, Sysbase,
Access等,详细内容可以参考常用数据库。
2.1.1 MySQL
2.1.1.1
MySQL简介
MySQL是最受欢迎的开源SQL数据库管理系统,它由MySQL
AB开发、发布和支持。MySQL AB是一家基于MySQL开发人员的商业公司
MySQL是一个快速的、多线程、多用户和健壮的SQL数据库服务器。MySQL服务器支持关键任务、重负载生产系统的使用,也可以将它嵌入到一个大配置(mass-
deployed)的软件中去。
与其他数据库管理系统相比,MySQL具有以下优势:
(1)
MySQL是一个关系数据库管理系统。
(2)
MySQL是开源的。
(3)
MySQL服务器是一个快速的、可靠的和易于使用的数据库服务器。
(4)
MySQL服务器工作在客户/服务器或嵌入系统中。
(5)
有大量的MySQL软件可以使用
2.1.1.2
MySQL使用教程
关于MySQL数据库的使用可以参考教程。
2.1.1.3
MySQL数据类型
可以参考MySQL的数据类型。
2.1.1.3.1
整型
MySQL数据类型 |
含义(有符号) |
tinyint(m) |
1个字节 范围(-128~127) |
smallint(m) |
2个字节 范围(-32768~32767) |
mediumint(m) |
3个字节 范围(-8388608~8388607) |
int(m) |
4个字节 范围(-2147483648~2147483647) |
bigint(m) |
8个字节 范围(+-9.22*10的18次方) |
Note:
取值范围如果加了unsigned,则最大值翻倍,如tinyint
unsigned的取值范围为(0~256)。
int(m)里的m是表示SELECT查询结果集中的显示宽度,并不影响实际的取值范围,没有影响到显示的宽度,不知道这个m有什么用。
2.1.1.3.2
浮点型(float和double)
MySQL数据类型 |
含义 |
float(m,d) |
单精度浮点型,8位精度(4字节),m总个数,d小数位 |
double(m,d) |
双精度浮点型,16位精度(8字节),m总个数,d小数位 |
Note:
设一个字段定义为float(5,3),如果插入一个数123.45678,实际数据库里存的是123.457,但总个数还以实际为准,即6位。
2.1.1.3.3
定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
decimal(m,d)
参数m<65 是总个数,d<30且 d<m 是小数位。
2.1.1.3.4
字符串(char, varchar, _text)
MySQL数据类型 |
含义 |
char(n) |
固定长度,最多255个字符 |
varchar(n) |
固定长度,最多65535个字符 |
tinytext |
可变长度,最多255个字符 |
text |
可变长度,最多65535个字符 |
mediumtext |
可变长度,最多2的24次方-1个字符 |
longtext |
可变长度,最多2的32次方-1个字符 |
char和varchar
1.char(n)
若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以char类型存储的字符串末尾不能有空格,varchar不限于此。
2.char(n)
固定长度,char(4)不管是存入几个字符,都将占用4个字节,varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),所以varchar(4),存入3个字符将占用4个字节。
3.char类型的字符串检索速度要比varchar类型的快。
varchar和text
1.varchar可指定n,text不能指定,内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节。
2.text类型不能有默认值。
3.varchar可直接创建索引,text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。
2.1.1.3.5
二进制数据(_Blob)
1._BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。
2._BLOB存储的数据只能整体读出。
3._TEXT可以指定字符集,_BLO不用指定字符集。
2.1.1.3.6
日期时间类型
MySQL数据类型 |
含义 |
date |
日期 ‘2008-12-2’ |
time |
时间 ’12:25:36′ |
datetime |
日期时间 ‘2008-12-2 22:06:44’ |
timestamp |
自动存储记录修改时间 |
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
2.1.1.3.7
数据类型的属性
MySQL关键字 |
含义 |
NULL |
数据列可包含NULL值 |
NOT NULL |
数据列不允许包含NULL值 |
DEFAULT |
默认值 |
PRIMARY KEY |
主键 |
AUTO_INCREMENT |
自动递增,适用于整数类型 |
UNSIGNED |
无符号 |
CHARACTER SET name |
指定一个字符集 |
2.1.1.4
MySQL自带数据库
2.1.1.4.1
information_schema
MySQL中,除了自行安装的数据库外,还有一个information_schema数据库,详细信息来源于参考链接。
information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。
在
MySQL中,把information_schema看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。在information_schema中,有数个只读表。它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件。
2.1.1.4.1.1
数据库内的表说明
SCHEMATA表:
提供了当前mysql实例中所有数据库的信息,show
databases的结果取之此表。
TABLES表:
提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。show
tables from schemaname的结果取之此表。
COLUMNS表:
提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。show
columns from schemaname.tablename的结果取之此表。
STATISTICS表:
提供了关于表索引的信息。show index from
schemaname.tablename的结果取之此表。
USER_PRIVILEGES(用户权限)表:
给出了关于全程权限的信息,该信息源自于mysql.user授权表。是非标准表。
SCHEMA_PRIVILEGES(方案权限)表:
给出了关于方案(数据库)权限的信息。该信息来自mysql.db授权表。是非标准表。
TABLE_PRIVILEGES(表权限)表:
给出了关于表权限的信息。该信息源自mysql.tables_priv授权表。是非标准表。
COLUMN_PRIVILEGES(列权限)表:
给出了关于列权限的信息。该信息源自mysql.columns_priv授权表。是非标准表。
CHARACTER_SETS(字符集)表:
提供了mysql实例可用字符集的信息。show character
set的结果集取之此表。
COLLATIONS表:
提供了关于各字符集的对照信息。
COLLATION_CHARACTER_SET_APPLICABILITY表:
指明了可用于校对的字符集。这些列等效于show
collation的前两个显示字段。
TABLE_CONSTRAINTS表:
描述了存在约束的表。以及表的约束类型。
KEY_COLUMN_USAGE表:
描述了具有约束的键列。
ROUTINES表:
提供了关于存储子程序(存储程序和函数)的信息。此时,ROUTINES表不包含自定义函数(UDF)。名为“mysql.proc
name”的列指明了对应于INFORMATION_SCHEMA.ROUTINES表的mysql.proc表列。
VIEWS表:
给出了关于数据库中的视图的信息。需要有show
views权限,否则无法查看视图信息。
TRIGGERS表:
提供了关于触发程序的信息。必须有super权限才能查看该表。
2.1.1.4.1.2
使用技巧
- 类似MS SQL
SERVER中的SP_HELPTEXT查看存储过程、函数、视图的功能
SHOW CREATE PROCEDURE
存储过程名;
SHOW CREATE FUNCTION
函数名;
SHOW CREATE VIEW
视图名;
还可以使用以下办法(但下面的办法只包含存储过程主体部分,不包含Create以及传入参数申明的部分):
SELECT
ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE
ROUTINE_SCHEMA=’数据库名’ AND ROUTINE_TYPE=’PROCEDURE’ and
ROUTINE_NAME=’存储过程名’;
函数也类似,只需要将查询条件对应改成ROUTINE_TYPE=’FUNCTION’就行
2.
查看当前实例包含的数据库列表
SELECT * FROM
INFORMATION_SCHEMA.SCHEMATA;
3.
查询数据库中所有的表(包含视图)
SELECT * FROM
INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA=’数据库名’ and
TABLE_TYPE=’BASE TABLE’;
SELECT * FROM
INFORMATION_SCHEMA.tables WHERE TABLE_SCHEMA=’数据库名’ and
TABLE_TYPE=’VIEW’;
4.
查询数据库中所有的视图
SELECT * FROM
INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA=’数据库名’;
5.
查询表对应的字段
a. SELECT * FROM
INFORMATION_SCHEMA.COLUMNS WHERE table_schema=’数据库名’ and
table_name=’表名’;
b.
横向列出表对应的字段,方便写Insert语句: select
GROUP_CONCAT(COLUMN_name) as ‘字段’ from INFORMATION_SCHEMA.COLUMNS
WHERE table_schema=’数据库名’ and table_name=’表名’;
6.
查询关键字在哪些存储过程或者函数中存在
SELECT * FROM
INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA=’数据库名’ AND
ROUTINE_TYPE=’PROCEDURE’ AND ROUTINE_DEFINITION like
‘%关键字%’;
SELECT * FROM
INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA=’数据库名’ AND
ROUTINE_TYPE=’FUNCTION’ AND ROUTINE_DEFINITION like ‘%关键字%’;
2.1.2 SQL
Server
2.1.2.1 SQL
Server简介
SQL Server
(MSSQL)是由微软开发的数据库管理系统,是Web上最流行的用于存储数据的数据库,它已广泛用于电子商务、银行、保险、电力等与数据库有关的行业。
目前最新版本是SQL
Server
2005,它只能在Windows上运行,操作系统的系统稳定性对数据库十分重要。并行实施和共存模型并不成熟,很难处理日益增多的用户数和数据卷,伸缩性有限。
SQL Server
提供了众多的Web和电子商务功能,如对XML和Internet标准的丰富支持,通过Web对数据进行轻松安全的访问,具有强大的、灵活的、基于Web的和安全的应用程序管理等。而且,由于其易操作性及其友好的操作界面,深受广大用户的喜爱。
2.1.3
Oracle
提起数据库,第一个想到的公司,一般都会是Oracle(甲骨文)。该公司成立于1977年,最初是一家专门开发数据库的公司。Oracle在数据库领域一直处于领先地位。
1984年,首先将关系数据库转到了桌面计算机上。然后,Oracle5率先推出了分布式数据库、客户/服务器结构等崭新的概念。Oracle
6首创行锁定模式以及对称多处理计算机的支持,最新的Oracle
8主要增加了对象技术,成为关系—对象数据库系统。目前,Oracle产品覆盖了大、中、小型机等几十种机型,Oracle数据库成为世界上使用最广泛的关系数据系统之一。
Oracle数据库产品具有以下优良特性。
(1) 兼容性:
Oracle产品采用标准SQL,并经过美国国家标准技术所(NIST)测试。与IBM
SQL/DS、DB2、INGRES、IDMS/R等兼容。
(2) 可移植性:
Oracle的产品可运行于很宽范围的硬件与操作系统平台上。可以安装在70种以上不同的大、中、小型机上;可在VMS、DOS、UNIX、Windows等多种操作系统下工作。
(3) 可联结性:
Oracle能与多种通讯网络相连,支持各种协议(TCP/IP、DECnet、LU6.2等)。
(4) 高生产率:
Oracle产品提供了多种开发工具,能极大地方便用户进行进一步的开发。
(5) 开放性:
Oracle良好的兼容性、可移植性、可连接性和高生产率使Oracle
RDBMS具有良好的开放性。
2.1.4
Sysbase
1984年,Mark B.
Hiffman和Robert
Epstern创建了Sybase公司,并在1987年推出了Sybase数据库产品。Sybase主要有三种版本:一是UNIX操作系统下运行的版本;二是Novell
Netware环境下运行的版本;三是Windows
NT环境下运行的版本。对UNIX操作系统,目前应用最广泛的是SYBASE 10及SYABSE
11 for SCO UNIX。
Sybase数据库的特点:
(1)
它是基于客户/服务器体系结构的数据库。
(2)
它是真正开放的数据库。
(3)
它是一种高性能的数据库。
2.2
数据库结构
2.2.1 数据库
/ Database
Visual
Basic中使用的数据库是关系型数据库(Relational
Database)。一个数据库由一个或一组数据表组成。每个数据库都以文件的形式存放在磁盘上,即对应于一个物理文件。不同的数据库,与物理文件对应的方式也不一样。对于dBASE,
FoxPro和Paradox格式的数据库来说,一个数据表就是一个单独的数据库文件,而对于Microsoft
Access、Btrieve格式的数据库来说,一个数据库文件可以含有多个数据表。
2.2.2 数据表
/ Table
简称表,由一组数据记录组成,数据库中的数据是以表为单位进行组织的。一个表是一组相关的按行排列的数据;每个表中都含有相同类型的信息。表实际上是一个二维表格,例如,一个班所有学生的考试成绩,可以存放在一个表中,表中的每一行对应一个学生,这一行包括学生的学号,姓名及各门课程成绩。
2.2.3 记录 /
Record
表中的每一行称为一个记录,它由若干个字段组成。
2.2.4 字段 /
Field
也称域。表中的每一列称为一个字段。每个字段都有相应的描述信息,如数据类型、数据宽度等。
2.2.5 索引 /
Index
为了提高访问数据库的效率,可以对数据库使用索引。当数据库较大时,为了查找指定的记录,则使用索引和不使用索引的效率有很大差别。索引实际上是一种特殊类型的表,其中含有关键字段的值(由用户定义)和指向实际记录位置的指针,这些值和指针按照特定的顺序(也由用户定义)存储,从而可以以较快的速度查找到所需要的数据记录。
2.2.6 查询 /
Query
一条SQL(结构化查询语言)命令,用来从一个或多个表中获取一组指定的记录,或者对某个表执行指定的操作。当从数据库中读取数据时,往往希望读出的数据符合某些条件,并且能按某个字段排序。使用SQL,可以使这一操作容易实现而且更加有效。SQL是非过程化语言(有人称为第四代语言),在用它查找指定的记录时,只需指出做什么,不必说明如何做。每个语句可以看作是一个查询(query),根据这个查询,可以得到需要的查询结果。
2.2.7 过滤器
/ Filter
过滤器是数据库的一个组成部分,它把索引和排序结合起来,用来设置条件,然后根据给定的条件输出所需要的数据。
2.2.8 视图 /
View
数据的视图指的是查找到(或者处理)的记录数和显示(或者进行处理)这些记录的顺序。在一般情况下,视图由过滤器和索引控制。视图中并不存储数据,视图是一种虚表。
2.3
数据库类型
2.3.1
关系型数据库
关系型数据库是指采用了关系模型来组织数据的数据库。
关系模型是在1970年由IBM的研究员E.F.Codd博士首先提出的,在之后的几十年中,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型。
简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
关系模型中常用的概念:
关系:
可以理解为一张二维表,每个关系都具有一个关系名,就是通常说的表名
元组:
可以理解为二维表中的一行,在数据库中经常被称为记录
属性:
可以理解为二维表中的一列,在数据库中经常被称为字段
域:
属性的取值范围,也就是数据库中某一列的取值限制
关键字:
一组可以唯一标识元组的属性,数据库中常称为主键,由一个或多个列组成
关系模式:
指对关系的描述。其格式为:关系名(属性1,属性2, … …
,属性N),在数据库中成为表结构
关系型数据库的优点:
容易理解:
二维表结构是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解
使用方便:
通用的SQL语言使得操作关系型数据库非常方便
易于维护:
丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率。
2.3.2
非关系型数据库
非关系型数据库提出另一种理念,例如,以键值对存储,且结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,用户可以根据需要去添加自己需要的字段,这样,为了获取用户的不同信息,不需要像关系型数据库中,要对多表进行关联查询。仅需要根据id取出相应的value就可以完成查询。但非关系型数据库由于很少的约束,他也不能够提供像SQL所提供的where这种对于字段属性值情况的查询。并且难以体现设计的完整性。他只适合存储一些较为简单的数据,对于需要进行较复杂查询的数据,SQL数据库显的更为合适。
由于非关系型数据库本身天然的多样性,以及出现的时间较短,因此,不想关系型数据库,有几种数据库能够一统江山,非关系型数据库非常多,并且大部分都是开源的。
这些数据库中,其实实现大部分都比较简单,除了一些共性外,很大一部分都是针对某些特定的应用需求出现的,因此,对于该类应用,具有极高的性能。依据结构化方法以及应用场合的不同,主要分为以下几类,
面向高性能并发读写的key-value数据库:
key-value数据库的主要特点即使具有极高的并发读写性能,Redis,Tokyo
Cabinet,Flare就是这类的代表。
面向海量数据访问的面向文档数据库:
这类数据库的特点是,可以在海量的数据中快速的查询数据,典型代表为MongoDB以及CouchDB。
面向可扩展性的分布式数据库:
这类数据库想解决的问题就是传统数据库存在可扩展性上的缺陷,这类数据库可以适应数据量的增加以及数据结构的变化。
2.3.3 NoSQL
NoSQL(NoSQL = Not Only
SQL
),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
2.4
数据库相关知识
2.4.1
Schema(模式)与dbo
关于Schema的理解来自于这个链接
SQL中有一个Schema的概念,实际上Schema就是数据库对象的集合,这个集合包含了表、视图、存储过程、索引等,为了区分不同的集合,就需要给不同的集合起不同的名字,默认情况下一个用户对应一个集合,用户的schema名等于用户名,并作为该用户缺省schema。所以schema集合看上去像用户名。
如果把database看作是一个仓库,仓库很多房间(schema),一个schema代表一个房间,table可以看作是每个房间中的储物柜,user是每个schema的主人,有操作数据库中每个房间的权利,就是说每个数据库映射的user有每个schema(房间)的钥匙。
我们访问一个表时,没有指明该表属于哪一个schema中的,系统就会自动给我们在表上加上缺省的shema名。在数据库中一个对象的完整名称为schema.object,而不属user.object。
在MySQL中创建一个Schema和创建一个Database的效果好像是一样的,但是在sqlserver和orcal数据库中效果又是不同的。
在SQL Server
2000中,user和schema总有一层隐含的关系,让我们很少意识到其实user和schema是两种完全不同的概念,假如我们在某一数据库中创建了用户Bosco,那么此时后台也为我们默认的创建了schema【Bosco】,schema的名字和user的名字相同。
在SQL Server
2005中,为了向后兼容,当用sp_adduser存储过程创建一个用户的时候,sqlserver2005同时也创建了一个和用户名相同的schema,然而这个存储过程是为了向后兼容才保留的,当我们用create
user创建数据库用户时,我们可以为该用户指定一个已经存在的schema作为默认的schema,如果我们不指定,则该用户所默认的schema即为dbo
schema,dbo房间(schema)好比一个大的公共房间,在当前登录用户没有默认schema的前提下,如果你在大仓库中进行一些操作,比如create
table,如果没有制定特定的房间(schema),那么你的物品就只好放进公共的dbo房间(schema)了。但是如果当前登录用户有默认的schema,那么所做的一切操作都是在默认的schema上进行。
在Oracle数据库中不能新建一个schema,要想创建一个schema,只能通过创建一个用户的方法解决,在创建一个用户的同时为这个用户创建一个与用户名同名的schem并作为该用户的缺省shcema。即schema的个数同user的个数相同,而且schema名字同user名字一一对应并且相同。
1.2、创建带有参数的自定义函数:
CREATE FUNCTION f3(num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED)
RETURNS FLOAT(10,2) UNSIGNED
RETURN (num1+num2)/2;
SELECT f2(1,5);
on primary– 默认就属于primary文件组,可省略
参数说明
什么是SQL数据库:
SQL是Structured Query
Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持SQL。
if exists (select * from sysdatabases where name=’databaseName’)
3,同步的对象类型以及对象
ROW_COUNT() 受影响行数
insert test values(null,66666),(null,0000);
SELECT row_count();
+————-+
| row_count() |
+————-+
| 2 |
+————-+
DELIMITER //
CREATE PROCEDURE removeUserByAgeAndReturnInfos(In p_age SMALLINT
UNSIGNED,OUT deleteUsers SMALLINT UNSIGNED,OUT userCounts SMALLINT
UNSIGNED)
BEGIN
DELETE FROM users WHERE age = p_age;
SELECT ROW_COUNT() INTO deleteUsers;
SELECT COUNT(id) FROM users INTO userCounts;
ENG //
DELIMITER ;
CALL removeUserByAgeAndReturnInfos(12,@a,@b);
SELECT @a,@b;
4、调用存储过程: CALL 存储过程名(值);
5、删除存储过程: DROP PROCEDURE 存储过程名;
6、查看存储过程:
mysql库->proc 表
查看所有的自定义函数和存储过程:
SELECT db,name FROM mysql.proc;
查看指定数据库下的存储过程
SELECT db,name FROM mysql.proc WHERE db = ‘所属的数据库’;
实例:查看数据库hello下的存储过程
SELECT db,name FROM mysql.proc WHERE db = ‘hello’;
/*
三、总结:
1、自定义函数和存储过程:
1、存储过程实现的功能要复杂一些;自定义函数的针对性更强一些。
2、存储过程可以返回多个值;自定义函数只能有一个值
3、存储过程一般独立执行;自定义函数主要作为其他SQL语句的组成部分来出现(和内置函数用法相同)。
*/
/*
四、基础语法总结:
1、定义变量
第一种:
declare 变量名 数据类型;
declare 变量名 类据类型 [default 值] ;
注意:
1、定义变量的代码必须出现开始位置
2、这种变量为局部变量,只在begin..end之间起作用,end以后则变量销毁。
第二种:
SET @i = 7
注意:
1、这种变量只对当前用户使用的客户端有效。
2、用户变量
查看该变量:SELECT @i */
(
因此,这个测试的[dbo].[sp_test01]就依赖于其他对象,如果其依赖的对象不存在,同步的时候,仅仅同步这个存储过程本身,是没有意义的
实例4:
DELIMITER //
CREATE PROCEDURE pro_2()
BEGIN
DECLARE age INT DEFAULT 18;
IF age >= 18 THEN
SELECT ‘已成年’;
ELSE
SELECT ‘未成年’;
END IF;
END //
DELIMITER ;
/*4.2、判断语句: CASE
CASE 变量
WHEN 条件一 THEN 执行体1;
WHEN 条件二 THEN 执行体2;
…
END CASE; */
)
同步某一个对象的依赖对象,使用如下SQL查出来对象依赖信息,因此这里就层层深入,同步依赖对象。这里就类似于同步A的时候,A依赖于B和C,然后停止同步A,先同步B和C,同步B或者C的时候,可能又依赖于其他对象,然后继续先同步其依赖对象。
调用自定义函数的时候用SELECT关键字来调用,
/*–日志文件的具体描述,各参数含义同上–*/
create function [dbo].[fn_test01]()RETURNS intASBEGIN declare @count int = 0 select @count = count(1) from dbo.table02 return @countEND
注意:如果在调用的时候没有参数,那么会系统报错
+———+
| f2(1,5) |
+———+
| 3.00 |
+———+
SQL语句大全添加主键
Alter table tabname add primary key(col)
说明:删除主键:Alter table tabname drop primary key(col)
说明:测试要同步的存储过程之一为[dbo].[sp_test01],它依赖于其他两个对象:dbo.table01和dbo.fn_test01()
实例8:
DELIMITER //
CREATE PROCEDURE hello10()
begin
declare i int default 0;
haha:loop
SELECT i;
SET i = i + 1;
if i > 5 then
leave haha;
end if;
end loop;
end //
DELIMITER ;
创建之前判断该数据库是否存在
使用如下参数,同步源数据库的两个存储过程到目标数据库,因为这里是在本机命名实例下测试,因此实例名和端口号输入
实例7:
DELIMITER //
CREATE PROCEDURE pro_7()
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
REPEAT
SET i = i + 1;
SET total = total + i;
UNTIL i >= 100 END REPEAT;
SELECT total;
END //
DELIMITER ;
CALL pro_7();
/*
标记:loop
sql
if 条件 then
leave 标记;
end if;
end loop; */
创建数据库
5,转义处理,在拼凑SQL的时候,需要进行转义处理,否则会导致SQL语句错误,目前处理了字符串中的’字符,二进制字段,时间字段的转义处理
实例5:
DELIMITER //
CREATE PROCEDURE pro_6()
BEGIN
DECLARE pos INT DEFAULT 0;
SET pos = FLOOR(5*RAND());
CASE pos
WHEN 1 THEN SELECT ‘still flying’;
WHEN 2 THEN SELECT ‘fall in sea’;
WHEN 3 THEN SELECT ‘in the island’;
ELSE SELECT ‘I dont know’;
END CASE;
END //
DELIMITER ;
CALL pro_6();
/*5、循环语句
WHILE 条件 DO
sql语句..
END WHILE; */
SQL语句大全创建序列
create sequence SIMON_SEQUENCE
minvalue 1 — 最小值
maxvalue 999999999999999999999999999 — 最大值
start with 1 — 开始值
increment by 1 — 每次加几
cache 20;
1,表的存在依赖于schema,需要考虑到表的schema是否存在,如果不存在先在target库上创建表对应的schema
最后成功创建
DELIMITER //
CREATE FUNCTION addBook(b_name VARCHAR(30))
RETURNS INT UNSIGNED
BEGIN
INSERT book(book_name) VALUES(b_name);
RETURN LAST_INSERT_ID();
END //
DELIMITER ;
Create DATABASE databasename
支持其他数据库对象的同步,比如function,table
type等,因为可以在同步其他存储过程对象的时候附带的同步function,table
type,这个与表或者存储过程类似,不做过多说明。
注意:此存储过程中出现了两次SELECT关键字,说明该存储过程在执行的时候有两个返回值
3.3、创建带有IN类型参数的存储过程:
根据ID删除记录(因为有参数,所以调用的时候括号不能省略)
DELIMITER //
CREATE PROCEDURE removeBookById(IN id INT UNSIGNED)
BEGIN
DELETE FROM book WHERE book_id = id;
END //
DELIMITER ;
CALL removeBookById(10);
3.4 创建带有OUT类型参数的存储过程:
删除book表中指定ID的记录,然后返回剩余记录的条数
DELIMITER //
CREATE PROCEDURE removeBookAndReturnBookNums(IN id INT UNSIGNED,OUT
bookNums INT UNSIGNED)
BEGIN
DELETE FROM book WHERE book_id = id;
SELECT count(1) INTO bookNums FROM book ;
END //
DELIMITER ;
CALL removeBookAndReturnBookNums(8,@nums);
SELECT @nums;
+——-+
| @nums |
+——-+
| 8 |
+——-+
3.5、创建带有INOUT类型参数的存储过程:
DELIMITER //
CREATE PROCEDURE pr_3(INOUT age INT UNSIGNED)
BEGIN
SET age = age + 2;
END //
DELIMITER ;
SET @age = 20;
CALL pr_3(@age);
SELECT @age;
+——+
| @age |
+——+
| 22 |
+——+
3.6、创建带有多个OUT类型参数的存储过程:
size=数值mb, –日志文件的初始大小
执行同步的效果
实例1:
DELIMITER //
CREATE PROCEDURE pro_1()
BEGIN
declare username varchar(20);
declare age smallint;
declare height int default 175;
SET username = ‘张三’;
SET age = ‘180’;
SELECT concat(‘姓名’,username,’年龄是’,age,’身高是’,height);
END //
DELIMITER ;
set @name =’hanlibao’;
DELIMITER //
CREATE PROCEDURE pro_2(username varchar(30))
BEGIN
declare age smallint;
declare height int default 175;
SET age = ‘180’;
SELECT concat(‘姓名’,username,’年龄是’,age,’身高是’,height);
END //
DELIMITER ;
call pro_2(@name);
/*2、变量赋值:
declare 变量名 数据类型 default 值;
SET 变量名= 值;
SELECT 字段 into 变量 from 表名 where 条件;
SELECT 字段 into 变量,字段 into 变量 from 表名
SELECT 聚合函数(字段) into 变量 from 表名 */
size=数值mb, –主数据文件的初始大小
需要改进的地方
实例6:
DELIMITER //
CREATE PROCEDURE pro_4()
BEGIN
DECLARE total INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
WHILE i <= 100 DO
SET total = total + i;
SET i = i + 1;
END WHILE;
SELECT total;
END //
DELIMITER ;
CALL pro_4();
/*
REPEAT
sql….;
UNTIL 条件 END REPEAT; */
filegrowth=数值%–日志文件的增长值
然后很可能,这个workflow使用也就这么一次,就寿终正寝了,却一样要浪费时间去做这个ETL。
实例3:
DELIMITER //
CREATE PROCEDURE hello5()
begin
declare a int default 20;
declare b int default 30;
declare sum int;
SET sum = a + b;
SELECT sum;
end //
DELIMITER ;
/*4.1、判断语句: IF … ELSE..
IF 条件 THEN
sql语句…;
END IF;
IF 条件 THEN
sql语句…;
ELSE
sql语句…;
END IF;
IF 条件 THEN
sql语句…;
ELSEIF 条件 THEN
sql语句…;
ELSEIF 条件 THEN
sql语句…;
ELSE
sql语句
END IF; */
SQL语句大全创建视图
create view viewname as select statement
删除视图:drop view viewname
1,当表的索引为filter
index的时候,无法生成包含where条件的索引创建语句,那个看起来蛋疼的表结构导出语句,暂时没时间改它。2,暂时不支持其他少用的类型字段,比如地理空间字段什么的。
一、基础
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
— 创建 备份数据的 device
USE master
EXEC sp_addumpdevice ‘disk’, ‘testBack’,
‘c:mssql7backupMyNwind_1.dat’
— 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2
[not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition
only
5、说明:删除新表
drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’
—like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和
TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION
一起使用时(即 UNION
ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自
TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2
中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时
(EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2
中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT
一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left (outer) join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a =
b.c
B:right (outer) join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full/cross (outer) join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
12、分组:Group by:
一张表,一旦分组 完成后,查询后只能得到组相关的信息。
组相关的信息:(统计信息) count,sum,max,min,avg 分组的标准)
在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
在selecte统计函数中的字段,不能和普通的字段放在一起;
13、对数据库进行操作:
分离数据库: sp_detach_db; 附加数据库:sp_attach_db
后接表明,附加需要完整的路径名
14.如何修改数据库的名称:
sp_renamedb ‘old_name’, ‘new_name’
二、提升
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1(仅用于SQlServer)
法二: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.排序字段
具体实现:
关于数据库分页:
declare @start int,@end int
@sql nvarchar(600)
set @sql=’select top’+str(@end-@start+1)+’+from T where rid not
in(select top’+str(@str-1)+’Rid from T where Rid>-1)’
exec sp_executesql @sql
注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免
top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)
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、说明:删除重复记录
1),delete from tablename where id not in (select max(id) from tablename
group by col1,col2,…)
2),select distinct * into temp from tablename
delete from tablename
insert into tablename select * from temp
评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段
alter table tablename
–添加一个自增列
add column_b int identity(1,1)
delete from tablename where column_b not in(
select max(column_b) from tablename group by column1,column2,…)
alter table tablename drop column column_b
20、说明:列出数据库里所有的表名
select name from sysobjects where type=’U’ // 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
三、技巧
1、1=1,1=2的使用,在SQL语句组合时用的较多
“where 1=1” 是表示选择全部 “where 1=2”全部不选,
如:
if @strWhere !=”
begin
set @strSQL = ‘select count() as Total from [‘ + @tblName + ‘] where
‘ + @strWhere
end
else
begin
set @strSQL = ‘select count() as Total from [‘ + @tblName + ‘]’
end
我们可以直接写成
错误!未找到目录项。
set @strSQL = ‘select count(*) as Total from [‘ + @tblName + ‘] where
1=1 安定 ‘+ @strWhere 2、收缩数据库
–重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
–收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE
3、压缩数据库
dbcc shrinkdatabase(dbname)
4、转移数据库给新用户以已存在用户权限
exec sp_change_users_login ‘update_one’,’newname’,’oldname’
go
5、检查备份集
RESTORE VERIFYONLY from disk=’E:dvbbs.bak’
6、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB(‘dvbbs’,repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO
7、日志清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE tablename — 要操作的数据库名
SELECT @LogicalFileName = ‘tablename_log’, — 日志文件名
@MaxMinutes = 10, — Limit on time allowed to wrap log.
@NewSize = 1 — 你想设定的日志文件的大小(M)
Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT ‘Original Size of ‘ + db_name() + ‘ LOG is ‘ +
CONVERT(VARCHAR(30),@OriginalSize) + ‘ 8K pages or ‘ +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + ‘MB’
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = ‘BACKUP LOG ‘ + db_name() + ‘ WITH TRUNCATE_ONLY’
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
— Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) — time has
not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name =
@LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN — Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN — update
INSERT DummyTrans VALUES (‘Fill Log’) DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
SELECT ‘Final Size of ‘ + db_name() + ‘ LOG is ‘ +
CONVERT(VARCHAR(30),size) + ‘ 8K pages or ‘ +
CONVERT(VARCHAR(30),(size*8/1024)) + ‘MB’
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
8、说明:更改某个表
exec sp_changeobjectowner ‘tablename’,’dbo’
9、存储更改全部表
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS
DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)
DECLARE curObject CURSOR FOR
select ‘Name’ = name,
‘Owner’ = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + ‘.’ + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
end
— select @name,@NewOwner,@OldOwner
FETCH NEXT FROM curObject INTO @Name, @Owner
END
close curObject
deallocate curObject
GO
10、SQL SERVER中直接循环写入数据
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
案例:
有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:
Name score
Zhangshan 80
Lishi 59
Wangwu 5
Songquan 69
while((select min(score) from tb_table)<60)
begin
update tb_table set score =score*1.01
where score<60
if (select min(score) from tb_table)>60
break
else
continue
end
数据开发-经典
1.按姓氏笔画排序:
Select * From TableName Order By CustomerName Collate
Chinese_PRC_Stroke_ci_as //从少到多
2.数据库加密:
select encrypt(‘原始密码’)
select pwdencrypt(‘原始密码’)
select pwdcompare(‘原始密码’,’加密后密码’) = 1–相同;否则不相同
encrypt(‘原始密码’)
select pwdencrypt(‘原始密码’)
select pwdcompare(‘原始密码’,’加密后密码’) = 1–相同;否则不相同
3.取回表中字段:
declare @list varchar(1000),
@sql nvarchar(1000)
select
@list=@list+’,’+b.name from
sysobjects a,syscolumns b where
a.id=b.id and
a.name=’表A’
set @sql=’select ‘+right(@list,len(@list)-1)+’ from 表A’
exec (@sql)
4.查看硬盘分区:
EXEC master..xp_fixeddrives
5.比较A,B表是否相等:
SQL语句大全外连接
A、left outer join:
左外连接(左连接):结果集既包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a =
b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
判断对象
判断数据库是否存在
if exists (select*fromsysdatabaseswherename= ‘数据库名’)
dropdatabase[数据库名]
判断表是否存在
if not exists (select * from sysobjects where [name] = ‘表名’ and
xtype=’U’)
begin
–这里创建表
end
判断存储过程是否存在
if exists (select*fromsysobjectswhereid =
object_id(N'[存储过程名]’) and OBJECTPROPERTY(id, N’IsProcedure’) =
1)
dropprocedure[存储过程名]
判断临时表是否存在
if object_id(‘tempdb..#临时表名’)isnot null
droptable#临时表名
判断视图是否存在
–SQL Server 2000
IF EXISTS (SELECT*FROMsysviewsWHEREobject_id =
‘[dbo].[视图名]’
–SQL Server 2005
IF EXISTS (SELECT*FROMsys.viewsWHEREobject_id =
‘[dbo].[视图名]’
判断函数是否存在
if exists (select*fromdbo.sysobjectswhereid =
object_id(N'[dbo].[函数名]’) and xtype in (N’FN’, N’IF’, N’TF’))
dropfunction[dbo].[函数名]
获取创建信息
SELECT[name],[id],crdateFROMsysobjectswherextype=’U’
/*
xtype 的表示参数类型,通常包括如下这些 C =CHECK约束 D =
默认值或DEFAULT约束 F =FOREIGNKEY约束 L =日志FN
=标量函数IF
= 内嵌表函数 P
=存储过程PK
=PRIMARYKEY约束(类型是K) RF = 复制筛选存储过程 S = 系统表 TF =
表函数 TR
=触发器U =
用户表 UQ =UNIQUE约束(类型是K) V = 视图 X = 扩展存储过程 */
判断列是否存在
if exists(select*fromsyscolumnswhereid=object_id(‘表名’)
andname=’列名’)
altertable表名dropcolumn列名
判断列是否自增列
if columnproperty(object_id(‘table’),’col’,’IsIdentity’)=1
print ‘自增列’
else
print ‘不是自增列’
SELECT*FROMsys.columnsWHEREobject_id=OBJECT_ID(‘表名’)
AND is_identity=1
判断表中是否存在索引
if exists(select*fromsysindexeswhereid=object_id(‘表名’)
andname=’索引名’)
print ‘存在’
else
print ‘不存在
查看数据库中对象
SELECT*FROMsysobjectsWHEREname=’对象名’
select * from table(所要查询的表名) where coloum(条件)
提升
复制表
(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a
拷贝表
(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(x, y, z) select d,e,f from a;
跨数据库之间表的拷贝
(具体数据使用绝对路径)
(Access可用)
insert into b(x, y, z) select d,e,f from a in ‘具体数据库’ where 条件
例子:。.from b in ‘”&Server.MapPath(“.”&”data.mdb” &”‘ where..
子查询
(表名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)
显示文章最后时间
select a.title,a.username,b.adddate from table a,(select max(adddate)
adddate from table where table.title=a.title) b
外连接查询
(表名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
在线视图查询
(表名1:a
select * from (Select a,b,c FROM a) T where t.a > 1;
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
in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
删除主表没有的信息
两张关联表delete from table1 where not exists ( select * from table2
where table1.field1=table2.field1
四表联查问题
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 …..
日程安排提前五分钟
SQL: select * from 日程安排 where
datediff(‘minute’,f开始时间,getdate())>5
一条sql 搞定数据库页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order
by 排序字段 desc) a,表名 b where b.主键字段= a.主键字段 order by
a.排序字段
前10条记录
select top 10 * from table1 where 范围
选择排名
选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等。)
select a,b,c from tablename ta where a=(select max(a) from tablename tb
where tb.b=ta.b)
派生结果表
包括所有在TableA 中但不在TableB和TableC
中的行并消除所有重复行而派生出一个结果表
(select a from tableA except (select a from tableB) except (select a
from tableC)
随机取出10条数据
select top 10 * from tablename order by newid()
随机选择记录
select newid()
删除重复记录
Delete from tablename where id not in (select max(id) from tablename
group by col1,col2,…)
列出数据库里的表名
select name from sysobjects where type=’U’
列出表里的所有的
select name from syscolumns where id=object_id(‘TableName’)
列示排列
列示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
初始化表table1
TRUNCATE TABLE table1
选择从10到15的记录
select top 5 * from (select top10 * from (select top 15 * from table
order by id asc) table_别名 order by id desc) table_2 order by id
数据类型转换
declare @numid int
declare @id varchar(50)
set @numid=2005
set @id=convert(varchar,@numid)
通过上述语句完成数据类型Int转换成varchar,其他转换类似,可参看convert函数
技巧
1=1,1=2的使用
在SQL语句组合时用的较多
“where 1=1”是表示选择全部 “where 1=2”全部不选,
如:
if @strWhere !=’
begin
set @strSQL = ‘select count(*) as Total from [‘ + @tblName + ‘] where
‘ + @strWhere
end
else
begin
set @strSQL = ‘select count(*) as Total from [‘ + @tblName + ‘]’
end
我们可以直接写成
set @strSQL=’select count(*) as Total from tablename where 1+1′
if(@strWhere!=”)
{set @strSQL=@strSQL+’and’+strWhere}
收缩数据库
–重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
–收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE
压缩数据库
dbcc shrinkdatabase(dbname)
转移数据库给新用户以已存在用户权限
exec sp_change_users_login ‘update_one’,’newname’,’oldname’
go
检查备份集
RESTORE VERIFYONLY from disk=’E:dvbbs.bak’
修复数据库
Alter DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB(‘dvbbs’,repair_allow_data_loss) WITH TABLOCK
GO
Alter DATABASE [dvbbs] SET MULTI_USER
GO
日志清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE tablename — 要操作的数据库名
Select @LogicalFileName = ‘tablename_log’,
–日志文件名
@MaxMinutes = 10, — Limit on time allowed to wrap log.
@NewSize = 1 — 你想设定的日志文件的大小(M)
— Setup / initialize
DECLARE @OriginalSize int
Select @OriginalSize = size
FROM sysfiles
Where name = @LogicalFileName
Select ‘Original Size of ‘ + db_name() + ‘ LOG is ‘ +
CONVERT(VARCHAR(30),@OriginalSize) + ‘ 8K pages or ‘ +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + ‘MB’
FROM sysfiles
Where name = @LogicalFileName
Create TABLE DummyTrans
(DummyColumn char (8000) not null)
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
Select @StartTime = GETDATE(),
@TruncLog = ‘BACKUP LOG ‘ + db_name() + ‘ WITH TRUNCATE_ONLY’
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
— Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) — time has
not expired
AND @OriginalSize = (Select size FROM sysfiles Where name =
@LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN — Outer loop.
Select @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN — update
Insert DummyTrans VALUES (‘Fill Log’)
Delete DummyTrans
Select @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
Select ‘Final Size of ‘ + db_name() + ‘ LOG is ‘ +
CONVERT(VARCHAR(30),size) + ‘ 8K pages or ‘ +
CONVERT(VARCHAR(30),(size*8/1024)) + ‘MB’
FROM sysfiles
Where name = @LogicalFileName
Drop TABLE DummyTrans
SET NOCOUNT OFF
更改某个表
exec sp_changeobjectowner ‘tablename’,’dbo’
存储更改全部表
Create PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS
DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)
DECLARE curObject CURSOR FOR
select ‘Name’ = name,
‘Owner’ = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + ‘.’ + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
end
— select @name,@NewOwner,@OldOwner
FETCH NEXT FROM curObject INTO @Name, @Owner
END
close curObject
deallocate curObject
GO
循环写入数据
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end
存储过程同步的原理是,在源数据库上生成创建存储过程的语句,然后写入目标库,这里大概步骤如下:1,存储过程依赖于schema,所以同步存储过程之前先同步schema2,同步的过程会检查依赖对象,如果依赖其他对象,暂停当前对象同步,先同步依赖对象3,重复第二步骤,直至完成4,对于存储过程的同步,如果是强制覆盖的话,强制覆盖仅仅对存储过程自己生效,对依赖对象并不生效,如果依赖对象不存在,就创建,否则不做任何事情
自定义函数 AND 存储过程 procedure
一、自定义函数:
用户自定义函数(user-defined
function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同。
自定义函数的两个必要条件:参数、返回值。函数可以返回任意类型的参数,同样可以接受这些类型的参数。
注意:函数是基于数据库的,所有在写函数的时候,必须先选择数据库。
1、创建自定义函数:
USE db_name; #选择数据库
CREATE FUNCTION function_name
RETURNS {STRING|INTEGER|REAL|DECIMAL} 返回值类型
routine_body(函数体)
注意:关于函数体
1.函数体由合法的SQL语句构成;
2.函数体可以使用简单的SELECT或INSERT语句
3.函数体如果为复合结构则使用BEGIN...END语句
4.复合结构可以包含声明、循环、控制结构
*/
USE hello;
SQL即结构化查询语言(Structured Query
Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。SQL语句无论是种类还是数量都是繁多的,很多语句也是经常要用到的,SQL查询语句就是一个典型的例子,无论是高级查询还是低级查询,SQL查询语句的需求是最频繁的。
相关文章
- 所以要本身来促成了,代码如下复制代码
- 回去日期date中,Server日期和岁月的格式
- 澳门新葡8455最新网站– 供给回到的列 @fldName,NUMBE奥迪Q5(卡塔尔(قطر和不行使ROW
- 数码的并发性特别高,mongodb是文书档案式的存放
- · ‘.’相配任何单个的字符,注目的在于你接受SQL格局时
- 澳门新葡8455最新网站mssql+php数据库操作类
- 合斯拉维尼亚语档提示,②限量标志符
- UNION 用于归拢四个或多少个 SELECT 语句的结果集,UNION查询的语法是
- 澳门新葡8455最新网站此刻在此外二个Session试行重新建立Procedure的操作,假如是合营到作者鲜明的20170901的表就记录下来
- 澳门新葡8455最新网站能够一向清空全体数据