术语:
DB:数据库。--专门用于存储数据的文件。
DBMS:数据库管理系统。--管理数据文件的系统。
RDBMS:关系型数据库管理系统。--以表格形式存储和管理数据的管理系统。
DDL:数据定义语言。--管理存储结构的命令,如新建表,修改表结构等。
DML:数据操作语言。--管理存储结构中数据的命令,如录入新纪录、各种查询现有数据、删除或修改现有数据。
DCL:数据控制语言。--用户和权限管理,如新建用户、为用户授权等。
Sqlserver一些基本命令
一.数据库操作
1.查询数据库是否存在
if db_id('dbname') is not null;
2.创建数据库
create database+数据库名;
3.修改数据库的名称
exec sp_renamedb @dbname=旧数据库名, @newname=新数据库名;
4.删除数据库的
drop database 数据库名;
5.指定的数据库
use 数据库名称;
修改或删除若遇到 “无法用排他锁锁定该数据库,以执行该操作。” 错误,则查询当前有哪些会话连接到这个数据库,然后杀掉。
查询:select spid from master.dbo.sysprocesses where dbid=db_id('数据库名称');
注意:spid是小写,取得进程id。
杀掉:kill spid;
二.表操作
----表----
1.检查表是否存在
if object_id('textdb','U') is not null ;其中U代表用户表。
2.新建表
CREATE TABLE Product( [Id] INT PRIMARY KEY, --主键-- [Name] NVARCHAR(50) NOT NULL, --非空约束-- [Mark] NVARCHAR(200) NOT NULL UNIQUE, --唯一性约束-- [Time] DATE DEFAULT GETDATE(), --默认值约束-- [Price] INT NOT NULL CHECK([Price]>=10 AND [Price]<=100), --check约束,要求价格大于10,小于100-- [PriceDouble] AS [Price]*2, --as为自动计算字段,不能输入值-- )
3.修改表名
exec sp_rename '原表名', '新表名';
4.删除表结构
truncate from 表名; 删除表结构。
delete和drop是删除表数据的。
----临时表----
1.创建临时表
select * into #TEMP from Product; 从Product向临时表中写入数据。
临时表是在关闭连接之后才会自动消失。
----列----
1.添加字段
alter table 表名 add 列名 字段类型 not null default 0 ;
2.修改字段名
exec sp_rename '[表名].[字段名]','新字段名' ;
3. 修改字段类型
alter table 表名 alter column 字段名 字段类型;
注意:若修改的字段是关键字段,带有主键,并且字段类型为用户自定义类型,具有默认值的情况下,用上述语句会出现错误。
比如有默认值的情况下就会出错一个或者多个对象访问此列(因为要修改的字段本来是数值型,有默认的初始值,然后要修改成char的数据类型就会出错)
原因就是添加Fname1字段时设置了默认值,导致SQL Server给Fname1字段关联了'DF__HACYU_B__id__5562F3F1'约束。只需要删除'DF__HACYU_B__id__5562F3F1'约束,就可以修改Fname1数据类型了。
删除约束语句如下
alter table HACYU_B drop constraint DF__HACYU_B__id__5562F3F1;
4. 删除字段
alter table 表名 drop column 字段名;
三.表数据操作
1.查询语句
select*from +表名称 [+where 条件];
2.插入数据
insert into 表名称 values (值1,值2,······,值n); 表的各个字段按照顺序给值。
insert into 表名称 (字段1,字段2,······) values (值1,值2,······); 指定个别字段给值。
insert into table2 select * from Ttable1; 批量插入(table2是已经存在的表)。
select * into table2 From table1; 批量插入(table2表不存在,是自动创建的)。
3.更新数据
update 表名称 set 字段=值 [+where 条件];
4.删除表
drop table 表名; 清除表中所有数据,表结构在,后边不能加条件进行删除。
truncate from 表名; 删除表结构。
delete from 表名 where 条件; 删除表数据,可以带条件。
delete from 表名;删除表中所有记录,操作将被记录到日志中,可以恢复。
查询命令拓展
1.为列,表起别名
select * from UserInfo as ui
为UserInfo起别名为ui,当然as可以省略。一旦取别名之后,调用表的列时,必须用别名来调用。
2.select查询某些列
select top 10 * from UserInfo
top n 列名
: 表示查询前n行top n percent 列名
: 表示查看前百分之N的数据
3.排序查询
order by 列名 asc|desc
4.条件查询
where 条件
between .. and ...
: 区间之间,,连续区间in(n1,n2)
: 符合n1或者n2条件,非连续- 逻辑运算符 :
and | or | not
注意: between的and
会寻找sql语句中离它最近的。
5.模糊查询
like % _ [] ^
通配符
- % 表示任意零个或多个字符
- _表示任意单个字符
- [a-f]表示a到f中的任意单个字符
- [a,f]表示a或f
- [^a-c]表示不是a到c中的字符
-- 查询班级姓张的同学
select * from ClassInfo
where sName like '张%'
-- 电话号码第二位为0-4
where sPhone like '1[^56789]'
注意:数据库中的CHAR类型数据不足位数时,用空格会自动补足位数,要是不需要空格的时候,可以使用RTrim() 或者LTrim()。
6.连接查询
内连接(INNER JOIN):有两种,显式的和隐式的。
外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。
Student 表
Class表
1). 内连接 (inner join 或者join)
查询的内容严格对应,根据每个表共有的列的值匹配两个表中的行。
隐式内连接
select * from Student s , Class c where s.Class_num = c.Class_no
显示内连接
select * from Student s inner join Class c on s.Class_num = c.Class_no
显示和隐式的结果集是一样的。
2). 左连接(left join 或者left outer oin)
查询的结果集包括SQL语句中左表的所有行,右表中匹配的行。
如果左表的某行在右表中没有匹配行,则用空值表示。
如果左表数据,在右表中有多行匹配,则查询结果左表为多行显示。
select * from Class c left join Student s on Class_num = c.Class_no
select * from Student s left join Class c on s.Class_num = c.Class_no
3). 右连接 (right join 或者 right outer join)
查询的结果集包括SQL语句中右表的所有行,左表中匹配的行。
如果右表的某行在左表中没有匹配的行,则左表数据为空。
如果右表数据,在左表中有多行匹配,则查询结果右表为多行显示。
select * from Class c right join Student s on Class_num = c.Class_no
select * from Student s right join Class c on s.Class_num = c.Class_no
4). 完全外连接 (full join 或者 full outer join)
查询的结果集包括左右两表中所有的行
select * from Student s full join Class c on s.Class_num = c.Class_no
5). 交叉连接
没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积。
第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
select * from Student cross join Class
加上WHERE子句,返回符合条件的结果集,和inner join所示执行结果一样。
select * from Student s cross join Class c where s.Class_num = c.Class_no