SQL常用命令实例详解

SQL是Structured Quevy Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功能强大、简单易学、使用方便,已经成为了数据库操作的基础,并且现在几乎所有的数据库均支持SQL。

一.建一个新的数据库

例:creat database mydata  /*mydata是你想要建的库的名字*/

二.在库中建一个新表单

例:CREATE TABLE mydiary (weather VARCHAR(40),comments TEXT,thedate DATETIME)


注意每个字段名后面都跟有一个专门的表达式。例如,字段名comments后面跟有表达式TEXT。这个表达式指定了字段的数据类型。数据类型决定了一个字段可以存储什么样的数据。因为字段comments包含文本信息,其数据类型定义为文本型。

字段有许多不同的数据类型。创建和使用表时,更你应该理解五种常用的字段类型:字符型,文本型,数值型,逻辑性和日期型。

1.字符型数据

请看下面这个例子:

CREATE TABLE mydairy (weather VARCHAR(40),comments TEXT,thedate DATETIME)

CREATE TABLE mydairy (weather CHAR(40),comments TEXT,thedate DATETIME)

用VARCHAR定义的字段可用来存放可变长度的字符串信息.但是VARCHAR类型可以存储的字符串最长为255个字符。要存储更长的字符串数据,可以使用文本型数据。而表达式CHAR指定了这个字段应该是固定长度的字符串。VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要。假如你向一个长度为四十个字符的VARCHAR型字段中输入数据Bill Gates。当你以后从这个字段中取出此数据时,你取出的数据其长度为十个字符--字符串Bill Gates的长度。

现在假如你把字符串输入一个长度为四十个字符的CHAR型字段中,那么当你取出数据时,所取出的数据长度将是四十个字符。字符串的后面会被附加多余的空格。

2.文本型数据

例子:

CREATE TABLE mydairy (weather VARCHAR(40),comments TEXT,thedate DATETIME)

在这个例子中,字段comments被用来存一段信息。注意文本型数据没有长度. 一旦你向文本型字段中输入了任何数据(甚至是空值),就会有2K的空间被自动分配给该数据。除非删除该记录,否则你无法收回这部分存储空间。

3.数值型数据

例子:

CREATE TABLE article (articlename VARCHAR(40),article_charnum INT)

为了节省内存空间,你可以使用SMALLINT型数据。SMALLINT 型数据可以存储从-32768到32768的整数。这种数据类型的使用方法与INT型完全相同。

最后,如果你实在需要节省空间,你可以使用TINYINT型数据。同样,这种类型的使用方法也与INT型相同,不同的是这种类型的字段只能存储从0到255的整数。TINYINT型字段不能用来存储负数。

为了能对字段所存放的数据有更多的控制,你可以使用NUMERIC型数据来同时表示一个数的整数部分和小数部分。NUMERIC型数据使你能表示非常大的数--比INT型数据要大得多。一个NUMERIC型字段可以存储从-1038到1038范围内的数。NUMERIC型数据还使你能表示有小数部分的数。例如,你可以在NUMERIC型字段中存储小数0.01。

当定义一个NUMERIC型字段时,你需要同时指定整数部分的大小和小数部分的大小。这里有一个使用这种数据类型的例子:

CREATE TABLE numeric_data (bignum NUMERIC(28,0),smallnum NUMERIC (6,3) )

4.存储逻辑值

BIT型字段不能取空值,只能取两个值:0或1。这里有一个如何使用这种字段的例子:

CREATE TABLE right_falese (word VARCHAR(20),last_key BIT)

5.存储日期和时间

如要存储日期和时间,你需要使用DATETIME型数据,如下例所示:

CREATE TABL studylog( coursename VARCHAR (50), begintime DATETIME ,endtime DATETIME)

一个DATETIME型的字段可以存储的日期范围是从1753年1月1日第一毫秒到9999年12月31日最后一毫秒。

如果你不需要覆盖这么大范围的日期和时间,你可以使用SMALLDATETIME型数据。它与DATETIME型数据同样使用,只不过它能表示的日期和时间范围比DATETIME型数据小,而且不如DATETIME型数据精确。一个SMALLDATETIME型的字段能够存储从1900年1月1日到2079年6月6日的日期,它只能精确到秒。

DATETIME型字段在你输入日期和时间之前并不包含实际的数据,认识这一点是重要的。

6.字段属性(空值,缺省值和标识值)。

(1).允许和禁止空值

大多数字段可以接受空值(NULL)。当一个字段接受了空值后,如果你不改变它,它将一直保持空值。空值(NULL)和零是不同的,严格的说,空值表示没有任何值。

为了允许一个字段接受空值,你要在字段定义的后面使用表达式NULL。例如,下面的表中两个字段都允许接受空值:

CREATE TABLE course (coursename CHAR (50) NULL,hours INT NULL)

(2).缺省值

为了在创建一个表时指定缺省值,你可以使用表达式DEFAULT。请看下面这个在创建表时使用缺省值的例子:

CREATE TABLE message (name VARCHAR(10) NOT NULL,

address VARCHAR(40) NOT NULL,

tel int NULL,

relation VARCHAR(20) DEFAULT ’classmate’)

在这个例子中,字段relation的缺省值被指定为classmate。注意单引号的使用,引号指明这是字符型数据。为了给非字符型的字段指定缺省值,不要把该值扩在引号中。

(3)标识字段

每个表可以有一个也只能有一个标识字段。一个标识字段是唯一标识表中每条记录的特殊字段。例如,数据库courses中的表course包含了一个唯一标识每个工作标识字段:

courseid coursename

…………………………………………………………….

1 english

2 chinese

3 math

4 physics

5 chemistry

字段courseid为每个工作提供了唯一的一个数字。如果你决定增加一个新工作,新增记录的course字段会被自动赋给一个新的唯一值。

为了建立一个标识字段,你只需在字段定义后面加上表达式IDENTITY即可。你只能把NUMERIC型或INT型字段设为标识字段,这里有一个例子:

CREATE TABLE studentID (theID NUBERIC(15) IDENTITY,name VARCHAR(20))

建立一个标示字段时,注意使用足够大的数据类型。例如你使用TINYINT型数据,那么你只能向表中添加255个记录。如果你预计一个表可能会变得很大,你应该使用NUMERIC型数据。

三.在表中查询

1.输入以下的SELECT语句:

SELECT studentname FROM students

这个查询执行后,会取出表students中的所有学生姓名(没有特定的顺序)。如果表students中包含几百名学生,会有几百个记录被取出,如果表中有三万名学生,这三万条记录都会被取出(这也许需要一些时间)。

2.你也可以在一个SELECT语句中一次取出多个字段,比如:

SELECT studentname ,studentid FROM students

在SELECT语句中,你需要列出多少个字段,你就可以列出多少。不要忘了把字段名用逗号隔开。你也可以用星号(*)从一个表中取出所有的字段。这里有一个使用星号的例子:

SELECT * FROM students

这个SELECT语句执行后,表中的所有字段的值都被取出。你也可以用一个SELECT语句同时从多个表中取出数据,只需在SELECT语句的FROM从句中列出要从中取出数据的表名称即可:

SELECT studentname,specialityname FROM students, specialitys

这个SELECT语句执行时,同时从表students和表specialitys中取出数据。从表students中取出所有的学生名字,从表specialitys中取出所有的专业名。但你考虑到没有上例从两个表中选出记录组合有没有意义?答案是否定的.要解决这个问题你需要通过建立两表中字段的关系来关联两个表。要做到这一点的途径之一是创建第三个表,专门用来描述另外两个表的字段之间的关系。

表students有一个名为studentid的字段,包含有每个作者的唯一标识。表specialitys有一个名为specialityid的字段,包含每个专业名的唯一标识。如果你能在字段studentid和字段specialityid之间建立一个关系,你就可以关联这两个表。数据库teaching中有一个名为studentspeciality的表,正是用来完成这个工作。表中的每个记录包括两个字段,用来把表students和表specialitys关联在一起。下面的SELECT语句使用了这三个表以得到正确的结果:

SELECT studentname,speciality FROM students,specialitys,studentspeciality

WHERE students.specialityid=studentspeciality.specialityid

AND specialitys.specialityid=studentspeciality.specialityid

当这个SELECT语句执行时,每个学生都与专业相匹配。表studentspeciality指明了表students和表specialitys的关系,它通过包含分别来自两个表的各一个字段实现这一点。第三个表的唯一目的是在另外两个表的字段之间建立关系。它本身不包含任何附加数据。

注意:在这个例子中字段名是如何书写的。为了区别表students和表specialitys中相同的字段名specialityid,每个字段名前面都加上了表名前缀和一个句号。

3.通常,当你从一个表中取出字段值时,该值与创建该表时所定义的字段名联系在一起。

下例:SELECT studentname "the name of student" FROM students

当这个SELECT语句执行时,来自字段studentname的值会与"the name of student"相联系。查询结果可能是这样:

the name of student

……………………………………………………………………..

小新

小白

小生

......

(30 row(s) affected)

你也可以通过执行运算,来操作从一个表返回的字段值。例如,如果你想把表books中的所有书的价格加倍,你可以使用下面的SELECT语句:

SELECT a _book_price*2 FROM books

你可以使用大多数标准的数学运算符来操作字段值,如加(+),减(-),乘(*)和除(/)。你也可以一次对多个字段进行运算,例如:

SELECT a_book_price*sales_num"total money" FROM books

4.排序查询结果

看一列没有特定顺序的名字是很不方便的。如果把这些名字按字母顺序排列,读起来就会容易得多。通过使用ORDER BY子句,你可以强制一个查询结果按升序排列,就像这样:

SELECT studentname FROM students ORDER BY studentname

当这个SELECT语句执行时,学生名字的显示将按字母顺序排列。ORDER BY子句将学生名字按升序排列。

而下例:SELECT studentname,speciality FROM students ORDER BY studentname ,speciality

这个查询首先把结果按studentname字段进行排序,然后按字段speciality排序。记录将按如下的顺序取出:

studentname speciality

…………………………………………………………………….

小白 幼教

小新 光电

小生 无线电

小军 档案

(23 row(s) affected)

你也可以按数值型字段对一个查询结果进行排序。例如,如果你想按降序取出所有书的价格,你可以使用如下的SQL查询:

SELECT a_book_price FROM books ORDER BY a_book_price DESC

这个SELECT语句从表中取出所有书的价格,显示结果时,价格低的书先显示,价格高的书后显示。

5.取出互不相同的记录

在特定情况下,你可能只有兴趣从一个表中取出互不相同的值。如果一个字段有重复的值,你也许希望每个值只被选取一次,你可以使用关键字DISTINCT来做到这一点:

SELCET DISTINCT studentname FROM students WHERE studentname=’小白’

当这个SELECT语句执行时,只返回一个记录。通过在SELECT语句中包含关键字DISTINCT,你可以删除所有重复的值。

四.向表中添加数据

向表中添加一个新记录,你要使用 INSERT 语句。这里有一个如何使用这种语句的例子:

INSERT students (studentname) VALUES (’one name’)

这个语句把字符串’one name’插入表students的sudentname字段中。将要被插入数据的字段的名字在第一个括号中指定,实际的数据在第二个括号中给出。

INSERT 语句的完整句法如下:

INSERT [INTO] {table_name|view_name} [(column_list)] {DEFAULT VALUES |Values_list | elect_statement}

如果你在INSERT 语句中只指定两个字段和数据会怎么样呢?换句话说,你向一个表中插入一条新记录,但有一个字段没有提供数据。在这种情况下,有下面的四种可能:

1.如果该字段有一个缺省值,该值会被使用。

2.如果该字段可以接受空值,而且没有缺省值,则会被插入空值。

3.如果该字段不能接受空值,而且没有缺省值,就会出现错误。你会收到错误信息:The column in table mytable may not be null.

4. 最后,如果该字段是一个标识字段,那么它会自动产生一个新值。当你向一个有标识字段的表中插入新记录时,只要忽略该字段,标识字段会给自己赋一个新值。

五.删除记录

要从表中删除一个或多个记录,需要使用DELETE语句。你可以给DELETE 语句提供WHERE 子句。WHERE子句用来选择要删除的记录。例如,下面的这个DELETE语句只删除字段studentname的值等于’小生’的记录:

DELETE students WHERE studentname=’小生’

DELETE 语句的完整句法如下:

DELETE [FROM] {table_name|view_name} [WHERE clause]

在SQL SELECT 语句中可以使用的任何条件都可以在DELECT 语句的WHERE子句 中使用。例如,下面的这个DELETE语句只删除那些studentname字段的值为’小白’或speciality字段的值为’幼教’的记录:

DELETE students WHERE studentname=’小白’ OR speciality=’幼教’

六.更新记录

要修改表中已经存在的一条或多条记录,应使用SQL UPDATE语句。同DELETE语句一样,UPDATE语句可以使用WHERE子句来选择更新特定的记录。请看这个例子:

UPDATE students SET speciality=’教育’ WHERE speciality=’幼教’

这个UPDATE 语句更新所有speciality字段的值为’幼教’的记录。对所有被选中的记录,字段speciality的值被置为’教育’。

下面是UPDATE语句的完整句法:

UPDATE {table_name|view_name} SET [{table_name|view_name}]

{column_list|variable_list|variable_and_column_list}

[,{column_list2|variable_list2|variable_and_column_list2}…

[,{column_listN|variable_listN|variable_and_column_listN}]]

[WHERE clause]

注意:如果你不提供WHERE子句,表中的所有记录都将被更新。

七.建立索引

索引有两种类型:聚簇索引和非聚簇索引。在聚簇索引中,索引树的叶级页包含实际的数据:记录的索引顺序与物理顺序相同。在非聚簇索引中,叶级页指向表中的记录:记录的物理顺序与逻辑顺序没有必然的联系。

如:CREATE INDEX studentname_index ON students (studentname)

这个语句建立了一个名为studentname_index的索引。你可以给一个索引起任何名字,但你应该在索引名中包含所索引的字段名,这对你将来弄清楚建立该索引的意图是有帮助的。

索引studentname_index对表students的studentname字段进行。这是个非聚簇索引,也是个非唯一索引。(这是一个索引的缺省属性)

如果你需要改变一个索引的类型,你必须删除原来的索引并重建 一个。建立了一个索引后,你可以用下面的SQL语句删除它:

DROP INDEX students.studentname_index

要建立一个聚簇索引,可以使用关键字CLUSTERED。记住一个表只能有一个聚簇索引。这里有一个如何对一个表建立聚簇索引的例子:

CREATE CLUSTERED INDEX studentname_clust_index ON students(studentname)

如果表中有重复的记录,当你试图用这个语句建立索引时,会出现错误。但是有重复记录的表也可以建立索引;你只要使用关键字ALLOW_DUP_ROW把这一点告诉SQL Sever即可:

CREATE CLUSTERED INDEX studentname_clust_index ON students(studentname)

WITH ALLOW_DUP_ROW

这个语句建立了一个允许重复记录的聚簇索引。你应该尽量避免在一个表中出现重复记录,但是,如果已经出现了,你可以使用这种方法。

要对一个表建立唯一索引,可以使用关键字UNIQUE。对聚簇索引和非聚簇索引都可以使用这个关键字。这里有一个例子:

CREATE UNIQUE COUSTERED INDEX studentname_clust_index ON students(studentname)

唯一索引是指该字段不能有重复的值,而不是只能建立这一个索引。

最后,要建立一个对多个字段的索引──复合索引──在索引建立语句中同时包含多个字段名。下面的例子对studentname和speciality两个字段建立索引:

CREATE INDEX student_speciality_index ON students(studentname,speciality)

这个例子对两个字段建立了单个索引。在一个复合索引中,你最多可以对16个字段进行索引。


http://ecourse.gdqy.edu.cn/jp_shengji/2007/database/jp/show_text.asp?id=87
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sql最全的常用命令语句 询某个数据库的连接数 select count(*) from Master.dbo.SysProcesses where dbid=db_id() --前10名其他等待类型 SELECT TOP 10 * from sys.dm_os_wait_stats ORDER BY wait_time_ms DESC SELECT *FROM sys.dm_os_wait_stats WHERE wait_type like 'PAGELATCH%' OR wait_type like 'LAZYWRITER_SLEEP%' --CPU的压力 SELECT scheduler_id, current_tasks_count, runnable_tasks_count FROM sys.dm_os_schedulers WHERE scheduler_id < 255 --表现最差的前10名使用查询 SELECT TOP 10 ProcedureName = t.text, ExecutionCount = s.execution_count, AvgExecutionTime = isnull ( s.total_elapsed_time / s.execution_count, 0 ), AvgWorkerTime = s.total_worker_time / s.execution_count, TotalWorkerTime = s.total_worker_time, MaxLogicalReads = s.max_logical_reads, MaxPhysicalReads = s.max_physical_reads, MaxLogicalWrites = s.max_logical_writes, CreationDateTime = s.creation_time, CallsPerSecond = isnull ( s.execution_count / datediff ( second , s.creation_time, getdate ()), 0 ) FROM sys.dm_exec_query_stats s CROSS APPLY sys.dm_exec_sql_text( s.sql_handle ) t ORDER BY s.max_physical_reads DESC SELECT SUM(signal_wait_time_ms) AS total_signal_wait_time_ms总信号等待时间 , SUM(wait_time_ms - signal_wait_time_ms) AS resource_wait_time_ms资源的等待时间, SUM(signal_wait_time_ms) * 1.0 / SUM (wait_time_ms) * 100 AS [signal_wait_percent信号等待%], SUM(wait_time_ms - signal_wait_time_ms) * 1.0 / SUM (wait_time_ms) * 100 AS [resource_wait_percent资源等待%] FROM sys.dm_os_wait_stats --一个信号等待时间过多对资源的等待时间那么你的CPU是目前的一个瓶颈。 --查看进程所执行的SQL语句 if (select COUNT(*) from master.dbo.sysprocesses) > 500 begin select text,CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) from master.sys.sysprocesses a end select text,a.* from master.sys.sysprocesses a CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) where a.spid = '51' dbcc inputbuffer(53) with tb as ( select blocking_session_id, session_id,db_name(database_id) as dbname,text from master.sys.dm_exec_requests a CROSS APPLY master.sys.dm_exec_sql_text(a.sql_handle) ), tb1 as ( select a.*,login_time,program_name,client_interface_name,login_name,cpu_time,memory_usage*8 as 'memory_usage(KB)', total_scheduled_time,reads,writes,logical_reads from tb a inner join master.sys.dm_exec_sessions b on a.session_id=b.session_id ) select a.*,connect_time,client_tcp_port,client_net_address from tb1 a inner join master.sys.dm_exec_connections b on a.session_id=b.session_id --当前进程数 select * from master.dbo.sysprocesses order by cpu desc --查看当前活动的进程数 sp_who active --查询是否由于连接没有释放引起CPU过高 select * from master.dbo.sysprocesses where spid> 50 and waittype = 0x0000 and waittime = 0 and status = 'sleeping ' and last_batch < dateadd(minute, -10, getdate()) and login_time < dateadd(minute, -10, getdate()) --强行释放空连接 select 'kill ' + rtrim(spid) from master.dbo.sysprocesses where spid> 50 and waittype = 0x0000 and waittime = 0 and status = 'sleeping ' and last_batch < dateadd(minute, -60, getdate()) and login_time < dateadd(minute, -60, getdate()) --查看当前占用 cpu 资源最高的会话和其中执行的语句(及时CPU) select spid,cmd,cpu,physical_io,memusage, (select top 1 [text] from ::fn_get_sql(sql_handle)) sql_text from master..sysprocesses order by cpu desc,physical_io desc --查看缓存中重用次数少,占用内存大的查询语句(当前缓存中未释放的)--全局 SELECT TOP 100 usecounts, objtype, p.size_in_bytes,[sql].[text] FROM sys.dm_exec_cached_plans p OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql ORDER BY usecounts,p.size_in_bytes desc SELECT top 25 qt.text,qs.plan_generation_num,qs.execution_count,dbid,objectid FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(sql_handle) as qt WHERE plan_generation_num >1 ORDER BY qs.plan_generation_num SELECT top 50 qt.text AS SQL_text ,SUM(qs.total_worker_time) AS total_cpu_time, SUM(qs.execution_count) AS total_execution_count, SUM(qs.total_worker_time)/SUM(qs.execution_count) AS avg_cpu_time, COUNT(*) AS number_of_statements FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt GROUP BY qt.text ORDER BY total_cpu_time DESC --统计总的CPU时间 --ORDER BY avg_cpu_time DESC --统计平均单次查询CPU时间 -- 计算可运行状态下的工作进程数量 SELECT COUNT(*) as workers_waiting_for_cpu,s.scheduler_id FROM sys.dm_os_workers AS o INNER JOIN sys.dm_os_schedulers AS s ON o.scheduler_address=s.scheduler_address AND s.scheduler_id<255 WHERE o.state='RUNNABLE' GROUP BY s.scheduler_id

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值