SQL Server基础——SQL语句

        

        

        

一、创建和删除数据库;


1.创建数据库(默认化初始值)

格式:

CREATE DATABASE 数据库名称

例如:

CREATE DATABASE SCC

2.创建数据库(自定义初始值)

格式:

CREATE DATABASE 数据库名
ON PRIMARY
(
	NAME='逻辑名称',
	FILENAME='文件存储路径'
)
LOG ON
(
	NAME='逻辑名称',
	FILENAME='文件存储路径'
)

例如:

CREATE DATABASE SCC
ON 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 数据库名
GO
CREATE TABLE 表名
(
	列名  数据类型(长度)  列级约束
)

例如:

USE SCC
GO
CREATE TABLE 学生表
(
	Sno  CHAR(5)  NOT NULL  UNIQUE,
	Sname  CHAR(8)  NOT NULL,
	Sage  SMALLINT  DEFAULT 20,						--默认值为20
	Sex  CHAR(2)  CHECK(Sex='男' or Sex='女')
)

三、创建视图;


格式:

USE SCC
GO

CREATE VIEW 视图名
AS
   select 列名
   from 表名
GO

例如:

USE SCC
GO

CREATE VIEW View_Card
as
   select * 
   from Card
GO

四、约束语句;


1.主键约束(PRIMARY KEY)

格式一:

列名  数据类型(长度)  PRIMARY KEY

例如:

USE SCC
GO
CREATE TABLE 课程表
(
	Cno  CHAR(5)  PRIMARY KEY
)

        

格式二:

CONSTRAINT 约束名 PRIMARY KEY(列名)				--CONSTRAINTS语句

例如:

USE SCC
GO
CREATE TABLE 课程表
(
	Sno  CHAR(5),
	Sname  CHAR(8),
    CONSTRAINT C1 PRIMARY KEY(Sno)			--CONSTRAINT C1 PRIMARY KEY(Sno,Sname)————双主键
)

2.外键约束(FOREIGN KEY)

格式:

CONSTRAINT 约束名 FOREIGN KEY(列名) REFERENCES 被引用表的名称(列名)

例如:

USE SCC
GO
CREATE TABLE 课程表
(
	Cno  CHAR(5),
    CONSTRAINT C1 PRIMARY KEY(Cno)
)
GO
CREATE TABLE 选课表
(
	Cno  CHAR(5),
    Sno  CHAR(5),
	CONSTRAINT C2 PRIMARY KEY(Sno),
	CONSTRAINT C3 FOREIGN KEY(Cno) REFERENCES 课程表(Cno)  
)

3.非空约束(NOT NULL)

格式:

列名  数据类型(长度)  NOT NULL

例如:

USE SCC
GO
CREATE TABLE 课程表
(
	Cno  CHAR(5)  NOT NULL
)

4.唯一约束(UNIQUE)

格式:

列名  数据类型(长度)  UNIQUE

例如:

USE SCC
GO
CREATE TABLE 课程表
(
	Cno  CHAR(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 SCC
SET 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 SCC
GO
SELECT SNO, SNAME
	FROM STUDENT
	WHERE SDEP='数学系'

2.自定义查询结果

格式:

SELECT 列名 as 重命名
	FROM 表名
	WHERE 查询条件
SELECT 列名*0.8								--将查询数据乘以0.8后输出
	FROM 表名
	WHERE 查询条件

例如:

USE SCC
GO
SELECT SN, SGRADE, SGRADE*0.8 as 成绩
	FROM SC
	WHERE CN='C1'

3.正倒序排列

格式:

ORDER BY 列名 DESC							--降序排列
ORDER BY 列名 ASC								--升序排列
ORDER BY 列名1 DESC, 列名2 ASC 				   --先按“列名1”降序排列,若“列名1”相同,则按“列名2”升序排列
ORDER BY 2 DESCA							  --按第二列降序排列

例如:

USE SCC
GO
SELECT SN, SGRADE
	FROM SC
	WHERE CN='C1'
	ORDER BY SGRADE DESC, SN ASC

4.去除重复项

格式:

SELECT DISTINCT 列名
	FROM 表名
	WHERE 查询条件

例如:

USE SCC
GO
SELECT DISTINCT SNO, SNAME
	FROM STUDENT
	WHERE SDEP='数学系'

5.把一个表的数据插入到另一个表

格式一:(当要插入的表不存在时)

SELECT 列名
	INTO 新表名
	FROM 表名
	WHERE 查询条件

例如:

USE SCC
GO
SELECT *
	INTO TU_STUDENT
	FROM STUDENT
	WHERE SDEP='计算机系'

        

格式二:(当要插入的表本身便存在时)

INSERT into 表名1(列名1, 列名2)
select 列名1, 列名2  
	from 表名2
	where 查询条件

例如:

INSERT into Student_back(S_StuNo,S_Name,S_Sex,S_Height)
select S_StuNo,S_Name,S_Sex,S_Height  
	from Student
	where S_Sex='女'

八、分类汇总;


1.求总人数

格式:

SELECT count(*)
	FROM 表名

例如:

USE SCC
GO
SELECT count(*)
	FROM STUDENT

2.求最高值和最小值

格式:

SELECT max(列名), min(列名)
	FROM 表名
	WHERE 查询条件

例如:

USE SCC
GO
SELECT COURSE.CNAME, MAX(SC.SGRADE), MIN(SC.SGRADE)
	FROM SC, COURSE
	WHERE SC.CN=COURSE.CNO
	GROUP BY COURSE.CNAME									--以COURSE.CNAME为依据分组

3.求平均值

格式:

SELECT AVG(列名)
	FROM 表名
	WHERE 查询条件

例如:

USE SCC
GO
SELECT STUDENT.SNAME, AVG(SC.SGRADE)
	FROM STUDENT, SC
	WHERE STUDENT.SNO=SC.SN
	GROUP BY STUDENT.SNAME

九、连接查询;


1.第一种连接方式

格式:

SELECT 列名
	FROM 表名1, 表名2
	WHERE 表名1.列名=表名2.列名

例如:

USE SCC
GO
SELECT *
	FROM STUDENT, SC
	WHERE STUDENT.SNO=SC.SN

2.第二种连接方式

格式:

SELECT 列名
	FROM 表名1 JOIN 表名2 ON 表名1.列名=表名2.列名

例如:

USE SCC
GO
SELECT *
	FROM STUDENT JOIN SC ON STUDENT.SNO=SC.SN

十、特殊查询;

1.姓张的同学

代码:

USE SCC
GO
SELECT *
	FROM STUDENT
	WHERE SNAME LIKE '张%'

2.数学系或计算机系的同学

代码:

USE SCC
GO
SELECT *
	FROM STUDENT
	WHERE (SDEP='数学系' or SDEP='计算机系')

3.缺少了成绩的同学

代码:

USE SCC
GO
SELECT *
	FROM SC
	WHERE SGRADE is NULL

4.选修课超过三门的学生学号

代码:

USE SCC
GO
SELECT
	FROM SC
	GROUP BY SN having count(*)>3

5.求各系的男女生人数

代码:

USE SCC
GO
SELECT SDEP, SSEX, COUNT(*)
	FROM STUDENT
	GROUP BY SDEP, SSEX
	ORDER BY SDEP

6.查询每一门课的间接先行课

代码:

USE SCC
GO
SELECT X.CNO, Y.PRECNO
	FROM COURSE X, COURSE Y
	WHERE X.PRECNO=Y.CNO

7.求 C1 课程的成绩高于张三的学生

代码:

USE SCC
GO
SELECT *
	FROM SC, STUDENT
	WHERE SC.CN='C1'
	AND STUDENT.SNO=SC.SN
	AND SC.SGRADE>
	(
		SELECT SC.SGRADE
		FROM SC, STUDENT
		WHERE SC.CN='C1'
		AND STUDENT.SNAME='张三'
		AND STUDENT.SNO=SC.SN
	)

8.查询选修了全部课程的学生

代码:

【25】查询选修了全部课程的学生
USE SCC
GO
SELECT SNAME
FROM STUDENT
WHERE NOT EXISTS
(
	SELECT *
	FROM COURSE
	WHERE NOT EXISTS
	(
		SELECT *
		FROM SC
		WHERE SC.SN=STUDENT.SNO
		AND SC.CN=COURSE.CNO
	)
)

9.求至少选修了学号为“S2”的学生所选修的全部课程的学生学号和姓名

代码:

USE SCC
GO
SELECT SNAME, SNO
FROM STUDENT
WHERE SNO NOT IN('S2')
AND SNO IN
(
	SELECT SN
	FROM SC X
	WHERE NOT EXISTS
	(
		SELECT *
		FROM SC Y
		WHERE Y.SN='S2'
		AND NOT EXISTS
		(
			SELECT *
			FROM SC Z
			WHERE Y.CN=Z.CN
			AND X. SN=Z.SN
		)
	)
)

10.类别中最高的图书定价不低于全部按类别分组的图书平均定价的 2 倍

代码:

USE Book
GO
SELECT BType
FROM BookInfo
GROUP BY BType
having max(BPrice)>=ALL
(
	SELECT AVG(BPrice)*2
	FROM BookInfo
	GROUP BY BType
)

11.选修C1课程,并且也选修C2课程的学生学号

例一:in 语句

USE SCC
GO
SELECT SC.SN
FROM SC, COURSE
WHERE SC.CN=COURSE.CNO
AND SC.CN='C1'
AND SC.SN IN
(
SELECT SC.SN
FROM SC, COURSE
WHERE SC.CN=COURSE.CNO
AND SC.CN='C2'
)

        

例二:exists 语句

USE SCC
GO
SELECT A.SN
FROM SC A, COURSE
WHERE A.CN=COURSE.CNO
AND A.CN='C1'
AND EXISTS
(
SELECT *
FROM SC B, COURSE
WHERE B.CN=COURSE.CNO
AND B.CN='C2'
AND B.SN=A.SN
)

        

例三:intersect 语句

USE SCC
GO
SELECT SC.SN
FROM SC, COURSE
WHERE SC.CN='C1'
AND SC.CN=COURSE.CNO
INTERSECT
SELECT SC.SN
FROM SC, COURSE
WHERE SC.CN='C2'
AND SC.CN=COURSE.CNO