SQL Server基础——SQL语句
一、创建和删除数据库;
1.创建数据库(默认化初始值)
格式:
CREATE DATABASE 数据库名称
例如:
CREATE DATABASE SCC
2.创建数据库(自定义初始值)
格式:
CREATE DATABASE 数据库名ON PRIMARY(NAME='逻辑名称',FILENAME='文件存储路径')LOG ON(NAME='逻辑名称',FILENAME='文件存储路径')
例如:
CREATE DATABASE SCCON PRIMARY(NAME='SCC_Data',FILENAME='D:\SQL\SCC\SCC_Data.mdf',SIZE=4MB)LOG ON(NAME='SCC_Log',FILENAME='D:\SQL\SCC\SCC_Log.ldf',SIZE=2MB)
3.删除数据库
格式:
DROP DATABASE 数据库名
例如:
DROP DATABASE SCC
二、创建数据表;
格式:
USE 数据库名GOCREATE TABLE 表名(列名数据类型(长度)列级约束)
例如:
USE SCCGOCREATE TABLE 学生表(SnoCHAR(5)NOT NULLUNIQUE,SnameCHAR(8)NOT NULL,SageSMALLINTDEFAULT 20,--默认值为20SexCHAR(2)CHECK(Sex='男' or Sex='女'))
三、创建视图;
格式:
USE SCCGOCREATE VIEW 视图名AS select 列名 from 表名GO
例如:
USE SCCGOCREATE VIEW View_Cardas select *from CardGO
四、约束语句;
1.主键约束(PRIMARY KEY)
格式一:
列名数据类型(长度)PRIMARY KEY
例如:
USE SCCGOCREATE TABLE 课程表(CnoCHAR(5)PRIMARY KEY)
格式二:
CONSTRAINT 约束名 PRIMARY KEY(列名)--CONSTRAINTS语句
例如:
USE SCCGOCREATE TABLE 课程表(SnoCHAR(5),SnameCHAR(8),CONSTRAINT C1 PRIMARY KEY(Sno)--CONSTRAINT C1 PRIMARY KEY(Sno,Sname)————双主键)
2.外键约束(FOREIGN KEY)
格式:
CONSTRAINT 约束名 FOREIGN KEY(列名) REFERENCES 被引用表的名称(列名)
例如:
USE SCCGOCREATE TABLE 课程表(CnoCHAR(5),CONSTRAINT C1 PRIMARY KEY(Cno))GOCREATE TABLE 选课表(CnoCHAR(5),SnoCHAR(5),CONSTRAINT C2 PRIMARY KEY(Sno),CONSTRAINT C3 FOREIGN KEY(Cno) REFERENCES 课程表(Cno))
3.非空约束(NOT NULL)
格式:
列名数据类型(长度)NOT NULL
例如:
USE SCCGOCREATE TABLE 课程表(CnoCHAR(5)NOT NULL)
4.唯一约束(UNIQUE)
格式:
列名数据类型(长度)UNIQUE
例如:
USE SCCGOCREATE TABLE 课程表(CnoCHAR(5)UNIQUE)
五、修改语句;
1. 添加数据
格式:
INSERT INTO 表名 (列名1, 列名2) VALUES(数据1, 数据2);
例如:
INSERT INTO 学生表 (Sid, Sname) VALUES(3, '陈宇辉');
2. 更改数据
格式:
UPDATE 表名 SET 列名1=新值1, 列名2=新值2 WHERE 过滤条件
例如:
UPDATE 学生表 SET Score='99', Sage='25' WHERE Sname='陈宇辉'
3.删除数据(一行)
格式:
DELETE FROM 表名 WHERE 列名='值'
例如:
DELETE FROM 学生表 WHERE Sno = '8001'AND SAGE not in ('20', '21')
4.删除约束
格式:
ALTER TABLE 表名 DROP CONSTRAINT 约束名
例如:
ALTER TABLE 选课表 DROP CONSTRAINT C2
六、终局之战;
1. 断开数据库连接
格式:
ALTER DATABASE 数据库名SET OFFLINE WITH ROLLBACK IMMEDIATE
例如:
ALTER DATABASE SCCSET OFFLINE WITH ROLLBACK IMMEDIATE
2. 分离数据库
格式:
EXEC sp_detach_db @dbname=N'数据库名'
例如:
EXEC sp_detach_db @dbname=N'SCC'
3.附加数据库
格式:
EXEC sp_attach_db @dbname=N'数据库名',@filename1=N'.mdf文件的存储路径', @filename2=N'.ldf文件的存储路径'
例如:
EXEC sp_attach_db @dbname=N'SCC',@filename1=N'D:\SQL\SCC\SCC_Data.mdf', @filename2=N'D:\SQL\SCC\SCC_Log.ldf'
七、查询语句;
1.查询某列
格式:
SELECT 列名FROM 表名WHERE 查询条件
例如:
USE SCCGOSELECT SNO, SNAMEFROM STUDENTWHERE SDEP='数学系'
2.自定义查询结果
格式:
SELECT 列名 as 重命名FROM 表名WHERE 查询条件
SELECT 列名*0.8--将查询数据乘以0.8后输出FROM 表名WHERE 查询条件
例如:
USE SCCGOSELECT SN, SGRADE, SGRADE*0.8 as 成绩FROM SCWHERE CN='C1'
3.正倒序排列
格式:
ORDER BY 列名 DESC--降序排列
ORDER BY 列名 ASC--升序排列
ORDER BY 列名1 DESC, 列名2 ASC--先按“列名1”降序排列,若“列名1”相同,则按“列名2”升序排列
ORDER BY 2 DESCA--按第二列降序排列
例如:
USE SCCGOSELECT SN, SGRADEFROM SCWHERE CN='C1'ORDER BY SGRADE DESC, SN ASC
4.去除重复项
格式:
SELECT DISTINCT 列名FROM 表名WHERE 查询条件
例如:
USE SCCGOSELECT DISTINCT SNO, SNAMEFROM STUDENTWHERE SDEP='数学系'
5.把一个表的数据插入到另一个表
格式一:(当要插入的表不存在时)
SELECT 列名INTO 新表名FROM 表名WHERE 查询条件
例如:
USE SCCGOSELECT *INTO TU_STUDENTFROM STUDENTWHERE SDEP='计算机系'
格式二:(当要插入的表本身便存在时)
INSERT into 表名1(列名1, 列名2)select 列名1, 列名2from 表名2where 查询条件
例如:
INSERT into Student_back(S_StuNo,S_Name,S_Sex,S_Height)select S_StuNo,S_Name,S_Sex,S_Heightfrom Studentwhere S_Sex='女'
八、分类汇总;
1.求总人数
格式:
SELECT count(*)FROM 表名
例如:
USE SCCGOSELECT count(*)FROM STUDENT
2.求最高值和最小值
格式:
SELECT max(列名), min(列名)FROM 表名WHERE 查询条件
例如:
USE SCCGOSELECT COURSE.CNAME, MAX(SC.SGRADE), MIN(SC.SGRADE)FROM SC, COURSEWHERE SC.CN=COURSE.CNOGROUP BY COURSE.CNAME--以COURSE.CNAME为依据分组
3.求平均值
格式:
SELECT AVG(列名)FROM 表名WHERE 查询条件
例如:
USE SCCGOSELECT STUDENT.SNAME, AVG(SC.SGRADE)FROM STUDENT, SCWHERE STUDENT.SNO=SC.SNGROUP BY STUDENT.SNAME
九、连接查询;
1.第一种连接方式
格式:
SELECT 列名FROM 表名1, 表名2WHERE 表名1.列名=表名2.列名
例如:
USE SCCGOSELECT *FROM STUDENT, SCWHERE STUDENT.SNO=SC.SN
2.第二种连接方式
格式:
SELECT 列名FROM 表名1 JOIN 表名2 ON 表名1.列名=表名2.列名
例如:
USE SCCGOSELECT *FROM STUDENT JOIN SC ON STUDENT.SNO=SC.SN
十、特殊查询;
1.姓张的同学
代码:
USE SCCGOSELECT *FROM STUDENTWHERE SNAME LIKE '张%'
2.数学系或计算机系的同学
代码:
USE SCCGOSELECT *FROM STUDENTWHERE (SDEP='数学系' or SDEP='计算机系')
3.缺少了成绩的同学
代码:
USE SCCGOSELECT *FROM SCWHERE SGRADE is NULL
4.选修课超过三门的学生学号
代码:
USE SCCGOSELECTFROM SCGROUP BY SN having count(*)>3
5.求各系的男女生人数
代码:
USE SCCGOSELECT SDEP, SSEX, COUNT(*)FROM STUDENTGROUP BY SDEP, SSEXORDER BY SDEP
6.查询每一门课的间接先行课
代码:
USE SCCGOSELECT X.CNO, Y.PRECNOFROM COURSE X, COURSE YWHERE X.PRECNO=Y.CNO
7.求 C1 课程的成绩高于张三的学生
代码:
USE SCCGOSELECT *FROM SC, STUDENTWHERE SC.CN='C1'AND STUDENT.SNO=SC.SNAND SC.SGRADE>(SELECT SC.SGRADEFROM SC, STUDENTWHERE SC.CN='C1'AND STUDENT.SNAME='张三'AND STUDENT.SNO=SC.SN)
8.查询选修了全部课程的学生
代码:
【25】查询选修了全部课程的学生USE SCCGOSELECT SNAMEFROM STUDENTWHERE NOT EXISTS(SELECT *FROM COURSEWHERE NOT EXISTS(SELECT *FROM SCWHERE SC.SN=STUDENT.SNOAND SC.CN=COURSE.CNO))
9.求至少选修了学号为“S2”的学生所选修的全部课程的学生学号和姓名
代码:
USE SCCGOSELECT SNAME, SNOFROM STUDENTWHERE SNO NOT IN('S2')AND SNO IN(SELECT SNFROM SC XWHERE NOT EXISTS(SELECT *FROM SC YWHERE Y.SN='S2'AND NOT EXISTS(SELECT *FROM SC ZWHERE Y.CN=Z.CNAND X. SN=Z.SN)))
10.类别中最高的图书定价不低于全部按类别分组的图书平均定价的 2 倍
代码:
USE BookGOSELECT BTypeFROM BookInfoGROUP BY BTypehaving max(BPrice)>=ALL(SELECT AVG(BPrice)*2FROM BookInfoGROUP BY BType)
11.选修C1课程,并且也选修C2课程的学生学号
例一:in
语句
USE SCCGOSELECT SC.SNFROM SC, COURSEWHERE SC.CN=COURSE.CNOAND SC.CN='C1'AND SC.SN IN(SELECT SC.SNFROM SC, COURSEWHERE SC.CN=COURSE.CNOAND SC.CN='C2')
例二:exists
语句
USE SCCGOSELECT A.SNFROM SC A, COURSEWHERE A.CN=COURSE.CNOAND A.CN='C1'AND EXISTS(SELECT *FROM SC B, COURSEWHERE B.CN=COURSE.CNOAND B.CN='C2'AND B.SN=A.SN)
例三:intersect
语句
USE SCCGOSELECT SC.SNFROM SC, COURSEWHERE SC.CN='C1'AND SC.CN=COURSE.CNOINTERSECTSELECT SC.SNFROM SC, COURSEWHERE SC.CN='C2'AND SC.CN=COURSE.CNO