SQL基础和高级(语法格式)总结一
前几天同学问了我一个sql问题,发现她有些语法都忘光了。在此整理一下学过的知识和笔记,总结出了sql语句的基本格式。希望给大家有所帮助。
一.创建
1.创建数据库,一般来说我们都是通过界面来创建数据库的。但是用sql语句创建数据库也是必须掌握的。
语法格式如下:
示例代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 create database blackhourse 2 on primary 3 ( 4 name='黑马' 5 ,filename='E:\新建文件夹\黑马.mdf' 6 ,size=10MB 7 ,maxsize=100MB 8 ,filegrowth=10% 9 )log on 10 ( 11 name='黑马_log' 12 ,filename='E:\新建文件夹\黑马_log.ldf' 13 ,size=5MB 14 ,maxsize=50MB 15 ,filegrowth=10% 16 );
2.手动删除数据库,示例代码如下
3.分离和附加数据库,一般来说都是通过界面方式来附加和分离数据库的,包括我也是。因为比较快捷。但是sql语句方式我们也是需要知道的。
示例代码如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /*调用存储过程,分离数据库*/ 2 3 exec sp_detach_db 'blackhourse'; 4 exec sp_detach_db 'archive'; 5 exec sp_detach_db 'zdp'; 6 exec sp_detach_db 'zdpdsy'; 7 exec sp_detach_db 'archive1'; 8 9 /*附加数据库*/ 10 create database archive 11 on( 12 filename='E:\新建文件夹\黑马.mdf' 13 )log on( 14 filename='E:\新建文件夹\黑马_log.ldf' 15 ) 16 for attach;
4.创建表,这个是最基本的语法,必须要掌握。格式:create table 表名(列名,数据类型,约束(自动编号,主键))
示例代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 create table Mydounaifen.TlStudent 2 ( 3 /*列名,数据类型,约束(自动编号,主键)*/ 4 stuName char(10), 5 stuAge int, 6 stuSex char(2) 7 );
二.约束
什么叫约束呢。约束有什么作用呢?答:保护数据完整性的机制:让存储的数据有意义的条件。
分为1.主键约束 2.唯一约束 3.检车约束 4.默认约束 5.非空约束 6.主外键约束 6种。
基本语法格式:alter table 架构.表名 add constraint 约束名 约束类
1.添加约束。在此添加一个检查约束,其他约束类似。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 alter table Mydounaifen.TlStudent 2 add constraint CK_TlStudent_stuSex 3 check(stuSex='男'or stuSex='女');
2.添加多个约束,添加非空约束,为年龄与性别添加检查约束,为邮箱添加唯一约束。一般来说sql考试会经常考到
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 alter table Student 2 add constraint ck_Student_stuAge 3 check(stuAge>0 and stuAge<30), 4 constraint ck_Student_stuSex 5 check( stuSex='男'or stuSex='女'), 6 constraint uq_Student_stuEmail 7 unique(stuEmail);
3.列操作。包括添加一列,修改列的数据类型,删除列。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 --增加一列 2 alter table Mydounaifen.TlStudent 3 add email varchar(20) null; 4 5 --删除一列 6 alter table Mydounaifen.TlStudent 7 drop column email; 8 9 --修改某个列数据类型 10 alter table Mydounaifen.TlStudent 11 alter column email nvarchar(20) null;
4.主外键约束。sql语句容易忘,不过在此还是给大家罗列出来。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 create table tblCourseT_SQL2 2 ( 3 cId int identity(1,1) not null 4 , cName nvarchar(10) not null 5 , cDesc nvarchar(100) null -- description 6 ); 7 alter table tblCourseT_SQL2 8 add constraint PK_tblCourseT_SQL2_cId primary key(cId); 9 10 -- 学生 11 create table tblStudentT_SQL2 12 ( 13 stuId int identity(1,1) not null 14 , stuName nvarchar(10) not null 15 , cId int null -- 外键stuTocId 16 ); 17 18 --创建外键约束主键表中必须有个主键 19 alter table tblStudentT_SQL2 20 add constraint [FK_tblStudentT_SQL2_tblCourseT_SQL2_cId] 21 foreign key(cId) references tblCourseT_SQL2(cId); 22 23 /* 24 补充说明 25 主外键表中,关联主键表的字段必须是主键和唯一键 26 27 */
三.增删改查
增删改查,想必大家都很熟悉了吧。在做网站开发的时候,通常和ado.net结合起来使用。拼接各种sql语句,来操作数据。
1.插入insert
插入语句语法格式非常简单,也比较好记。格式:insert 架构名.表名(列,列,.....) values(值,值,....)。
也有其他的用法。在此一一罗列出来
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 --基本插入 2 insert into Mydounaifen.TlStudent(stuName,stuAge,stuSex) 3 values('豆奶粉',22,'女'); 4 insert into Mydounaifen.TlStudent(stuName,stuAge,stuSex) 5 values('大鹏',22,'男'); 6 这种写法每次只能插入一条数据 7 8 --为自动编号插入数据(tid为自动编号) 9 set IDENTIY_INSERT TblTeacher on 10 insert into TblTeacher(tid,tname,tsalary) 11 values(100,'bob',50000) 12 13 --当向表中的除自动编号外的所有其他列插入数据的时候,这是可以省略列名。 14 insert into T_Seats values(LoginId,RealName,Pwd); 15 16 --向一个已经存在的表中插入数据,数据的来源是另外一张表 17 insert into NewTblTeacher (tname,tage) 18 select tname,tage from TblTeacher 19 20 --返回刚插入数据的自动增长编号 21 insert into Exe2.LoginTbl output inserted.id values('zdpdsy123','123'); 22 23 --表值函数 24 /* 25 格式:insert into 表名(列1,列2,…) values(值1,值2,…), (值1,值2,…), 26 (值1,值2,…); 27 可以插入多个数据 28 */ 29 insert into StudentTest(stuName,stuSex,StuAge) 30 values('牛亮亮','m',30),('王成伟', 'm', 28), 31 ('赵晓虎', 'm', 29),('李艳茹', 'f', 19), 32 ('牛亮亮','f',22),('苏坤','m',30),('苏坤','f',27);
2.修改update
没什么复杂的用法。就一条基本的语法:update 架构名.表名set 字段=值,字段=值.... where 条件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 update Mydounaifen.TlStudent set stuAge=20 where stuName='豆奶粉';
3.删除delete
有三种方式。delete,drop,truncate.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 语法 2 -- delete from 表名where 条件; 3 -- drop database|table|schema 名字; 4 -- truncate table 表名 5 6 drop table Student; 7 8 delete from Mydounaifen.TlStudent where stuName='大鹏'; 9 10 truncate table TblTeacher 11 12 13 =========================== 14 两者区别 15 1.delete删除的时候,自动编号没有恢复到默认值,而truncate 可以. 16 2.truncate 删除数据的时候,只能一次性都清除,不能根据条件来删除 则delete可以. 17 3.truncate删除数据的速度比delete快的多 18 4.truncate语句不会触发delete触发器
4.查询select
也有两种方式。一种是普通的select用法。还有一种是select into 用法
1.普通的select用法
格式如下:
select distinct |top 数字[percent]
字段as常量
,包含字段表达式
,函数 Sum,max
,常量
from
表或结果集
where
条件: 逻辑|空值|多条件|模糊|范围
group by
字段
having
筛选条件
order by
字段 desc | asc
执行顺序
from -> where -> group by -> having -> select -> order by
示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
select * from MyStudent --1>先从MyStudent表中拿到数据 where fage>30 --2>从MyStudent的数据中筛选出所有年龄大于30的人的信息 group by fgender --3>按照性别分组,分完组以后又得到一个新结果集 having count(*)>500 --4>基于分组以后的结果集,然后再筛选,筛选出人数>500的记录 /* from 子句 寻找数据源,后面可以跟表,视图,表值函数,结果集等 where子句 对from所得到的临时表做一次筛选,是直接在结果中将筛选到的结果组成一个临时表 null值处理 判断一个字段是否为null使用 字段 is [not] null null表示的是不知道,凡是与null参与的运算得到的结果都是null和不知道 */ --查看整个表 select * from TblScore; --考试期中及格 select * from TblScore where ScoreNum>=60; --期末及格考试 select * from TblScore where ScoreLast>=60; --按照姓名分组 select stuName from StudentTest group by stuName; --取成绩前五名 select top 5 * from MyStudent order by fag desc /*模糊查询 */ 通配符; 1. % //匹配多个字符 select * from Mystudent where fname like '%敏%' 2. -//匹配一个字符 --查询姓赵的同学,且长度为三个 select * from MyStudent where fanme like '赵__' select * from MyStudent where fanme like '赵%' and len(fname)=3 3. [] --查询出姓名包含'雷'或'伟'的人的姓名 select * from MyStudent where fname like '%[雷伟]%' 用[]括起来,表示转义字符 如[%]
补充:给列取名。
-- select列 as 别名 (推荐)
-- select列 别名 (不推荐)
-- 别名=select列 (推荐)
2.select into 通常用来把旧表数据插入到新表中
格式如下:
select
字段等
into 表名
from
数据源
其他子句
示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 select * into 2 FormSelect 3 from StuSetInto; 4 5 select * from FormSelect; 6 /* 7 select * into 新表名from 数据源where 1>2; 8 只会把表的结构复制过来, 9 但是键和约束索引等不会复制过来。 10 除了自动增长的 11 */ 12 select * into NewTable from FormSelect where 1>2;
以上是个人的SQL学习总结,有错的地方还望众大神海涵啊。
SQL基础和高级总结.zip