SQL基础语句(结尾附完整代码)

数据定义基本应用

建立一个数据库,名为:学生管理,在学生管理数据库中,建立教师表、学生表,课程表,成绩表(注意:具体属性列按以下要求完成)

要求:(1)根据教材上的具体数据内容或实际情况来自定义各列属性类型的宽度,做好主码和外键约束(2)使用insert命令向五个表中各建立若干实际数据(认真对待,以后实验经常要使用到这几个表)

建表

1 学生表(学号PK,  姓名 , 专业名 , 性别 ,入校成绩 ,手机号,照片 ,家庭地址,备注)

要求:学号为主键; 姓名的长度介于2-5;性别的取值只能限于”男,女”之一,且默认值为:男;入校成绩只能取介于200-700之间.

使用命令:

CREATE TABLE Student (

    ID CHAR(7) PRIMARY KEY,

    SName NVARCHAR(5) CHECK (LEN(SName) BETWEEN 2 AND 5),

    Major NVARCHAR(50),

    Grade NVARCHAR(2) DEFAULT '男' CHECK (Grade IN ('男', '女')),

    Score INT CHECK (Score BETWEEN 200 AND 700),

    Tel VARCHAR(11),

    SSex NVARCHAR(2),

    Photo VARBINARY(MAX),

    Address NVARCHAR(100),

    备注 NVARCHAR(MAX)

);

运行截图:

2 课程表(课程号PK ,  课程名称 , 学分)

使用命令:

CREATE TABLE Course (

    CID CHAR(4) PRIMARY KEY CHECK (LEFT(CID, 1) = 'D' AND ISNUMERIC(SUBSTRING(CID, 2, 3)) = 1 AND CAST(SUBSTRING(CID, 2, 3) AS INT) BETWEEN 0 AND 999),

    CName NVARCHAR(100),

    Credit INT

);

运行截图:

3 成绩表(学号FK,  课程号FK,  成绩),注意,成绩表的学号和课程号分别是学生表和课程表的外键. 课程号为4位字符串,其中第一位为字母”D”,后面2位为0-9的数字; 成绩值只能取0-100之间.

使用命令:

CREATE TABLE Score (

    ID CHAR(7),

    CID CHAR(4),

    Grade TINYINT CHECK (Grade BETWEEN 0 AND 100),

    FOREIGN KEY (ID) REFERENCES Student(ID) ON DELETE CASCADE,

    FOREIGN KEY (CID) REFERENCES Course(CID) ON DELETE CASCADE,

    PRIMARY KEY (ID, CID)

);

运行截图:

4 教师表(教师号,姓名,性别,出生日期,职称,工资,岗位津贴,系别)

使用命令:

CREATE TABLE Teacher (

    TID CHAR(6) PRIMARY KEY,

    TName NVARCHAR(50),

    TSex NVARCHAR(2),

    TBirthdate DATE,

    Title NVARCHAR(50),

    Salary DECIMAL(10,2),

    Allowance DECIMAL(10,2),

    Department NVARCHAR(50)

);

运行截图:

5 授课表(教师号FK,课程号FK

使用命令:

CREATE TABLE Teaching (

    TID CHAR(6),

    CID CHAR(4),

    FOREIGN KEY (TID) REFERENCES Teacher(TID),

    FOREIGN KEY (CID) REFERENCES Course(CID),

    PRIMARY KEY (TID, CID)

);

运行截图:

说明:在表间参照完整性中,如果想实现级联删除,即如:删除学生表中的某个同学时,则成绩表中该外键对应的成绩记录会自动删除。可以这样实现:

Create table 成绩表(学号 char(7) ,课程号 char(3), 成绩 tinyint,

Foreign key(学号) references 学生表(学号) on  delete cascade   )

数据定义修改应用

增加数据

1向学生表中增加身高(指定数值型,3位2位小数),出生日期,是否党员,是否团员四列;

使用命令:

ALTER TABLE Student

ADD Height NUMERIC(5,2);

ADD Birthdate DATE;

ADD IsDY BIT;

ADD IsTY BIT;

运行截图:

删除数据

2删除是否团员一列

使用命令:

ALTER TABLE Student

DROP COLUMN IsDY;

运行截图:

修改数据

3把身高列的宽度增加一位

使用命令:

ALTER TABLE Student

ALTER COLUMN Height NUMERIC(6,2);

运行截图:

更新数据

使用命令: 

UPDATE Student
SET
	Address='四川省成都市郫县' WHERE ID=1;
UPDATE Student
SET
	Address='四川省成都市金牛区' WHERE ID=2;
UPDATE Student
SET
	Address='四川省成都市青羊区' WHERE ID=3;
UPDATE Student
SET
	Address='四川省成都市武侯区' WHERE ID=4;
UPDATE Student
SET
	Address='四川省成都市新都区' WHERE ID=5;
UPDATE Student
SET
	Address='四川省成都市高新区' WHERE ID=6;
UPDATE Student
SET
	Address='四川省成都市双流区' WHERE ID=7;
UPDATE Student
SET
	Address='四川省成都市郫县' WHERE ID=8;
UPDATE Student
SET
	Address='四川省成都市郫县' WHERE ID=9;
增加约束

4为手机号列增加约束:必须为11位,且每位为数字;为性别列增加一个约束,插入新记录时默认值为’男’

使用命令:

ALTER TABLE Student

ADD CONSTRAINT Tel CHECK (LEN(Tel) = 11 AND Tel NOT LIKE '%[^0-9]%');



ALTER TABLE Student

ADD CONSTRAINT SSex DEFAULT '男' FOR SSex;  
增加列

5向课程表中增加”任课教师”列

使用命令:

ALTER TABLE Course

ADD TName VARCHAR(100);

运行截图:

对已有表,增加约束

6对已有表,增加约束,限制身高在1.00-2.0米之间

使用命令:

ALTER TABLE Student

ADD CONSTRAINT HeightRange CHECK (Height >= 1.00 AND Height <= 2.00);
唯一限制

7对课程表中的课程名称进行唯一限制

使用命令:

ALTER TABLE Course

ADD CONSTRAINT CName UNIQUE (CName);

数据内容插入,并验证违反约束情况

 使用insert into 命令在以上三表中各录入有效数据至少5行。 特别注意这些数据按关键字相互存在联系的

插入数据

使用命令:

INSERT INTO Student (ID, SName, tel, SSex, Height, Birthdate, IsDY)

VALUES

    (1, '张三', '12345678901', '男', 1.75, '2000-01-01', 1),

    (2, '李四', '98765432109', '女', 1.60, '1999-05-15', 0),

    (3, '王五', '13579246801', '男', 1.80, '2001-03-20', 0),

    (4, '赵六', '15935724680', '男', 1.65, '2000-12-10', 1),

    (5, '李大方', '13246579801', '男', 1.70, '2002-07-05', 1);

运行截图:

-- 向课程表插入数据

INSERT INTO Course (CID, CName, TName)

VALUES

    ('C101', '高等数学', '张老师'),

    ('C102', '大学英语', '李老师'),

    ('C103', '大学物理', '王老师'),

    ('C104', '化学', '赵老师'),

    ('C105', '历史', '孙老师');

运行截图:

-- 向成绩表插入数据

INSERT INTO Score (ID, CID, Grade)

VALUES

    (1, 'C101', 85),

    (1, 'C102', 78),

    (2, 'C101', 90),

    (2, 'C102', 82),

    (3, 'C101', 88);

运行截图:

违反约束情况:

简单数据查询应用

(注:要保证原数据库表中要有大量有效数据).

1 查出大学英语男生的成绩情况:学号, 课程号,成绩

-- 方法1:使用JOIN连接查询

SELECT Score.ID AS 学号, Score.CID AS 课程号, Score.Grade AS 成绩

FROM Score

INNER JOIN Student ON Score.ID = Student.ID

INNER JOIN Course ON Score.CID = Course.CID

WHERE Course.CName = '大学英语' AND Student.Grade = '男';

-- 方法2:使用子查询

SELECT ID AS 学号, CID AS 课程号, Grade AS 成绩

FROM Score

WHERE CID IN (SELECT CID FROM Course WHERE CName = '大学英语')

AND ID IN (SELECT ID FROM Student WHERE Grade = '男');

运行截图:

2查出高等数学和大学英语课程的成绩情况(学号,课程号,成绩)

答:

SELECT ID AS 学号, CID AS 课程号, Grade AS 成绩

FROM Score

WHERE CID IN (SELECT CID FROM Course WHERE CName IN ('高等数学', '大学英语'));

运行截图:

3 查出与李大方的大学英语成绩相同的其它学生的情况:学号,姓名,课程号,名称,成绩

答:

SELECT S.ID AS 学号, S.SName AS 姓名, SC.CID AS 课程号, C.CName AS 名称, SC.Grade AS 成绩

FROM Score SC

INNER JOIN Student S ON SC.ID = S.ID

INNER JOIN Course C ON SC.CID = C.CID

WHERE SC.CID IN (SELECT CID FROM Course WHERE CName = '大学英语')

AND SC.Grade = (SELECT Grade FROM Score WHERE ID = (SELECT ID FROM Student WHERE SName = '李大方') AND CID = (SELECT CID FROM Course WHERE CName = '大学英语'));

运行截图:

 

4 查出哪些学生没有选修大学英语:学号,姓名

答:

SELECT ID AS 学号, SName AS 姓名

FROM Student

WHERE ID NOT IN (SELECT ID FROM Score WHERE CID = (SELECT CID FROM Course WHERE CName = '大学英语'));

运行截图:

5 查出选修了大学英语学生成绩情况,并按成绩值降序显示:学号,课程号,成绩

答:

SELECT ID AS 学号, CID AS 课程号, Grade AS 成绩

FROM Score

WHERE CID = (SELECT CID FROM Course WHERE CName = '大学英语')

ORDER BY Grade DESC;

运行截图:

6 排序:先按性别排,性别相同则按是否团员排,再相同就按生日降序排.

答:

SELECT *

FROM Student

ORDER BY Grade, IsDY DESC, Birthdate DESC;

运行截图:

7 根据生日计算,把学生表中年龄最小的两个男生同学查询出来

答:

SELECT TOP 2 ID, SName, DATEDIFF(YEAR, Birthdate, GETDATE()) AS Age

FROM Student

WHERE Grade = '男'

ORDER BY Birthdate;

运行截图:

8 把年龄较大的一半学生显示出来 

答:

WITH AgeRank AS (

    SELECT ID, SName, DATEDIFF(YEAR, Birthdate, GETDATE()) AS Age,

           ROW_NUMBER() OVER (ORDER BY DATEDIFF(YEAR, Birthdate, GETDATE()) DESC) AS AgeRank,

           COUNT(*) OVER () AS TotalCount

    FROM Student

)

SELECT ID, SName, Age

FROM AgeRank

WHERE AgeRank > TotalCount / 2;

运行截图:

9  求出李大方比李四方大多少岁

 方法1:直接使用一条SQL命令实现

答:

 SELECT DATEDIFF(YEAR, (SELECT Birthdate FROM Student WHERE SName = '李四方'), (SELECT Birthdate FROM Student WHERE SName = '李大方')) AS AgeDifference;

运行截图:

 方法2:使用变量法实现。定义变量,把李方大和李四方两个同学的年龄通过生日计算出来保存两个变量中,最后求出二人相差多少岁

答:

DECLARE @AgeLiDaFang INT;

DECLARE @AgeLiSiFang INT;

SELECT @AgeLiDaFang = DATEDIFF(YEAR, Birthdate, GETDATE()) FROM Student WHERE SName = '李大方';

SELECT @AgeLiSiFang = DATEDIFF(YEAR, Birthdate, GETDATE()) FROM Student WHERE SName = '李四方';

SELECT @AgeLiDaFang - @AgeLiSiFang AS AgeDifference;

运行截图:

 

10 向课程表中添加一个列:课程编码 nchar(4) , 要求课程编码的第一个字母必须是C,第2-4个字符必须是数字1-9中一个

答:

ALTER TABLE Course

ADD CourseCode NCHAR(4) CHECK (LEFT(CourseCode, 1) = 'C' AND SUBSTRING(CourseCode, 2, 3) BETWEEN '1' AND '9');

11 从学生表中查询出:学号,姓名,年龄

答:

SELECT ID AS 学号, SName AS 姓名, DATEDIFF(YEAR, Birthdate, GETDATE()) AS 年龄

FROM Student;

运行截图:

12 查询出生日为今天的学生信息

答:

SELECT ID AS 学号, SName AS 姓名, Birthdate AS 出生日期

FROM Student

WHERE MONTH(Birthdate) = MONTH(GETDATE()) AND DAY(Birthdate) = DAY(GETDATE());

运行截图:

13 从成绩表中查出有哪些课程被选

答:

SELECT DISTINCT CID AS 课程号

FROM Score;

运行截图:

14 从成绩表中查询已选课程有几门

答:

SELECT COUNT(DISTINCT CID) AS 已选课程数

FROM Score;

运行截图:

15 从学生表中,查出1985—1991年之间出生的学生

答:

SELECT ID AS 学号, SName AS 姓名, Birthdate AS 出生日期

FROM Student

WHERE YEAR(Birthdate) BETWEEN 1985 AND 1991;

运行截图:

16 使用between and方法,查出成绩表中成绩在80-95之间的情况

答:

SELECT *

FROM Score

WHERE Grade BETWEEN 80 AND 95;

运行截图:

17 从成绩表中查出课程D001,D003课程的情况

答:

SELECT *

FROM Score

WHERE CID IN ('D101', 'D103');

运行截图:

18 查出家庭住址中含有“郫县”二字的学生情况

答:

SELECT *

FROM Student

WHERE Address LIKE '%郫县%';

运行截图:

19 查出所有姓李和杨的学生情况,请使用至少两种方法实现

答:

--方法1:使用LIKE子句

SELECT *

FROM Student

WHERE SName LIKE '李%' OR SName LIKE '杨%';

--方法2:使用IN子句

SELECT *

FROM Student

WHERE LEFT(SName, 1) IN ('李', '杨');

运行截图:

20 把学生表拆分成男,女生两个独立的表. 再把两个表合并到一个新表”学生总”

答:

SELECT *

INTO MaleStudents

FROM Student

WHERE Grade = '男';



-- 创建女生表

SELECT *

INTO FemaleStudents

FROM Student

WHERE Grade = '女';



-- 合并两个表

SELECT * FROM MaleStudents

UNION ALL

SELECT * FROM FemaleStudents;

运行截图:

四 完整代码

-- 一、数据库基本运用
--1 学生表(学号PK,  姓名 , 专业名 , 性别 ,入校成绩 ,手机号,照片 ,家庭地址,备注)
--要求:学号为主键; 姓名的长度介于2-5;性别的取值只能限于”男,女”之一,且默认值为:男;入校成绩只能取介于200-700之间.
CREATE TABLE Student (
    ID CHAR(7) PRIMARY KEY,
    SName NVARCHAR(5) CHECK (LEN(SName) BETWEEN 2 AND 5),
    Major NVARCHAR(50),
    Grade NVARCHAR(2) DEFAULT '男' CHECK (Grade IN ('男', '女')),
    Score INT CHECK (Score BETWEEN 200 AND 700),
    Tel VARCHAR(11),
    Photo VARBINARY(MAX),
    Address NVARCHAR(100),
    备注 NVARCHAR(MAX)
);
Select ID,SName,Major,Grade,Score,Tel,Photo,Address,备注 from Student

--2 课程表(课程号PK ,  课程名称 , 学分)
CREATE TABLE Course (
    CID CHAR(4) PRIMARY KEY CHECK (LEFT(CID, 1) = 'D' AND ISNUMERIC(SUBSTRING(CID, 2, 3)) = 1 AND CAST(SUBSTRING(CID, 2, 3) AS INT) BETWEEN 0 AND 999),
    CName NVARCHAR(100),
    Credit INT
);
Select CID,CName,Credit from Course


--3 成绩表(学号FK,  课程号FK,  成绩),注意,成绩表的学号和课程号分别是学生表和课程表的外键. 课程号为4位字符串,其中第一位为字母”D”,后面2位为0-9的数字; 成绩值只能取0-100之间.
CREATE TABLE Score (
    ID CHAR(7),
    CID CHAR(4),
    Grade TINYINT CHECK (Grade BETWEEN 0 AND 100),
    FOREIGN KEY (ID) REFERENCES Student(ID) ON DELETE CASCADE,
    FOREIGN KEY (CID) REFERENCES Course(CID) ON DELETE CASCADE,
    PRIMARY KEY (ID, CID)
);
Select ID,CID,Grade from Score

--4 教师表(教师号,姓名,性别,出生日期,职称,工资,岗位津贴,系别)
CREATE TABLE Teacher (
    TID CHAR(6) PRIMARY KEY,
    TName NVARCHAR(50),
    TSex NVARCHAR(2),
    TBirthdate DATE,
    Title NVARCHAR(50),
    Salary DECIMAL(10,2),
    Allowance DECIMAL(10,2),
    Department NVARCHAR(50)
);
Select TID,TName,TSex,TBirthDate,Title,Salary,Allowance,Department from Teacher

--5 授课表(教师号FK,课程号FK)
CREATE TABLE Teaching (
    TID CHAR(6),
    CID CHAR(4),
    FOREIGN KEY (TID) REFERENCES Teacher(TID),
    FOREIGN KEY (CID) REFERENCES Course(CID),
    PRIMARY KEY (TID, CID)
);
Select TID,CID from Teaching


-- 二、数据定义修改应用
-- 1.添加身高列(数值型,3位2位小数)
ALTER TABLE Student
ADD Height NUMERIC(5,2);

-- 添加出生日期列
ALTER TABLE Student
ADD Birthdate DATE;

-- 添加是否党员列
ALTER TABLE Student
ADD IsDY BIT;

-- 添加是否团员列
ALTER TABLE Student
ADD IsTY BIT;

--2删除是否团员一列
ALTER TABLE Student
DROP COLUMN IsTY;
SELECT * FROM Student;

--3把身高列的宽度增加一位
ALTER TABLE Student
ALTER COLUMN Height NUMERIC(6,2);

--4为手机号列增加约束:必须为11位,且每位为数字;为性别列增加一个约束,插入新记录时默认值为’男’
ALTER TABLE Student
ADD CONSTRAINT Tel CHECK (LEN(Tel) = 11 AND Tel NOT LIKE '%[^0-9]%');

ALTER TABLE Student
ADD CONSTRAINT Grade DEFAULT '男' FOR Grade;

--5向课程表中增加”任课教师”列
ALTER TABLE Course
ADD TName VARCHAR(100);
SELECT * FROM Course;

--6对已有表,增加约束,限制身高在1.00-2.0米之间
ALTER TABLE Student
ADD CONSTRAINT HeightRange CHECK (Height >= 1.00 AND Height <= 2.00);

--7对课程表中的课程名称进行唯一限制
ALTER TABLE Course
ADD CONSTRAINT CName UNIQUE (CName);

-- 三 数据内容插入,并验证违反约束情况
 --使用insert into 命令在以上三表中各录入有效数据至少5行。 特别注意这些数据按关键字相互存在联系的
-- 向学生表插入数据
INSERT INTO Student (ID, SName, tel, Grade, Height, Birthdate, IsDY)
VALUES

    (1, '张三', '12345678901', '男', 1.75, '2000-01-01', 1),
    (2, '李四', '98765432109', '女', 1.60, '1999-05-15', 0),
    (3, '王五', '13579246801', '男', 1.80, '2001-03-20', 0),
    (4, '赵六', '15935724680', '男', 1.65, '2000-12-10', 1),
    (5, '李大方', '13246579801', '男', 1.70, '2002-07-05', 1),
	(6, '李四方', '13848872663', '男', 1.80, '2021-02-05', 1),
	(7, '杨孺', '18493758361', '女' , 1.51, '2004-03-24', 1),
	(8, '花花', '18793874972', '男', 2.00, '2011-07-02', 1).
	(9, '张良', '18747493893', '男', 1.90, '1989-04-04', 1);
SELECT * FROM Student;


UPDATE Student
SET
	Address='四川省成都市郫县' WHERE ID=1;
UPDATE Student
SET
	Address='四川省成都市金牛区' WHERE ID=2;
UPDATE Student
SET
	Address='四川省成都市青羊区' WHERE ID=3;
UPDATE Student
SET
	Address='四川省成都市武侯区' WHERE ID=4;
UPDATE Student
SET
	Address='四川省成都市新都区' WHERE ID=5;
UPDATE Student
SET
	Address='四川省成都市高新区' WHERE ID=6;
UPDATE Student
SET
	Address='四川省成都市双流区' WHERE ID=7;
UPDATE Student
SET
	Address='四川省成都市郫县' WHERE ID=8;
UPDATE Student
SET
	Address='四川省成都市郫县' WHERE ID=9;


-- 向课程表插入数据
INSERT INTO Course (CID, CName, TName)
VALUES
    ('D101', '高等数学', '张老师'),
    ('D102', '大学英语', '李老师'),
    ('D103', '大学物理', '王老师'),
    ('D104', '化学', '赵老师'),
    ('D105', '历史', '孙老师');
SELECT * FROM Course;

-- 向成绩表插入数据
INSERT INTO Score (ID, CID, Grade)
VALUES
    (1, 'D101', 85),
    (1, 'D102', 78),
    (2, 'D101', 90),
    (2, 'D102', 82),
    (3, 'D101', 88);
SELECT * FROM Score;

INSERT INTO Score (ID, CID, Grade)
VALUES

    (5, 'D102', 82),
    (5, 'D101', 88);
SELECT * FROM Score;
--违反约束情况:


--第二部分:简单数据查询应用


--1 查出大学英语男生的成绩情况:学号, 课程号,成绩 (尽量使用两种办法分别实现)
-- 方法1:使用JOIN连接查询
SELECT Score.ID AS 学号, Score.CID AS 课程号, Score.Grade AS 成绩
FROM Score
INNER JOIN Student ON Score.ID = Student.ID
INNER JOIN Course ON Score.CID = Course.CID
WHERE Course.CName = '大学英语' AND Student.Grade = '男';

-- 方法2:使用子查询
SELECT ID AS 学号, CID AS 课程号, Grade AS 成绩
FROM Score
WHERE CID IN (SELECT CID FROM Course WHERE CName = '大学英语')
AND ID IN (SELECT ID FROM Student WHERE Grade = '男');

--2查出高等数学和大学英语课程的成绩情况(学号,课程号,成绩)
SELECT ID AS 学号, CID AS 课程号, Grade AS 成绩
FROM Score
WHERE CID IN (SELECT CID FROM Course WHERE CName IN ('高等数学', '大学英语'));

--3 查出与李大方的大学英语成绩相同的其它学生的情况:学号,姓名,课程号,名称,成绩 
SELECT S.ID AS 学号, S.SName AS 姓名, SC.CID AS 课程号, C.CName AS 名称, SC.Grade AS 成绩
FROM Score SC
INNER JOIN Student S ON SC.ID = S.ID
INNER JOIN Course C ON SC.CID = C.CID
WHERE SC.CID IN (SELECT CID FROM Course WHERE CName = '大学英语')
AND SC.Grade = (SELECT Grade FROM Score WHERE ID = (SELECT ID FROM Student WHERE SName = '李大方') AND CID = (SELECT CID FROM Course WHERE CName = '大学英语'));
  
--4 查出哪些学生没有选修大学英语:学号,姓名
SELECT ID AS 学号, SName AS 姓名
FROM Student
WHERE ID NOT IN (SELECT ID FROM Score WHERE CID = (SELECT CID FROM Course WHERE CName = '大学英语'));


--5 查出选修了大学英语学生成绩情况,并按成绩值降序显示:学号,课程号,成绩
SELECT ID AS 学号, CID AS 课程号, Grade AS 成绩
FROM Score
WHERE CID = (SELECT CID FROM Course WHERE CName = '大学英语')
ORDER BY Grade DESC;


--6 排序:先按性别排,性别相同则按是否团员排,再相同就按生日降序排.
SELECT *
FROM Student
ORDER BY Grade, IsDY DESC, Birthdate DESC;


--7 根据生日计算,把学生表中年龄最小的两个男生同学查询出来
SELECT TOP 2 ID, SName, DATEDIFF(YEAR, Birthdate, GETDATE()) AS Age
FROM Student
WHERE Grade = '男'
ORDER BY Birthdate;


--8 把年龄较大的一半学生显示出来  
WITH AgeRank AS (
    SELECT ID, SName, DATEDIFF(YEAR, Birthdate, GETDATE()) AS Age,
           ROW_NUMBER() OVER (ORDER BY DATEDIFF(YEAR, Birthdate, GETDATE()) DESC) AS AgeRank,
           COUNT(*) OVER () AS TotalCount
    FROM Student
)
SELECT ID, SName, Age
FROM AgeRank
WHERE AgeRank > TotalCount / 2;


--9  求出李大方比李四方大多少岁。
 --方法1:直接使用一条SQL命令实现
 SELECT DATEDIFF(YEAR, (SELECT Birthdate FROM Student WHERE SName = '李四方'), (SELECT Birthdate FROM Student WHERE SName = '李大方')) AS AgeDifference;

-- 方法2:使用变量法实现。定义变量,把李方大和李四方两个同学的年龄通过生日计算出来保存两个变量中,最后求出二人相差多少岁
DECLARE @AgeLiDaFang INT;
DECLARE @AgeLiSiFang INT;
SELECT @AgeLiDaFang = DATEDIFF(YEAR, Birthdate, GETDATE()) FROM Student WHERE SName = '李大方';
SELECT @AgeLiSiFang = DATEDIFF(YEAR, Birthdate, GETDATE()) FROM Student WHERE SName = '李四方';
SELECT @AgeLiDaFang - @AgeLiSiFang AS AgeDifference;

 
--10 向课程表中添加一个列:课程编码 nchar(4) , 要求课程编码的第一个字母必须是C,第2-4个字符必须是数字1-9中一个
ALTER TABLE Course
ADD CourseCode NCHAR(4) CHECK (LEFT(CourseCode, 1) = 'C' AND SUBSTRING(CourseCode, 2, 3) BETWEEN '1' AND '9');

--11 从学生表中查询出:学号,姓名,年龄
SELECT ID AS 学号, SName AS 姓名, DATEDIFF(YEAR, Birthdate, GETDATE()) AS 年龄
FROM Student;

--12 查询出生日为今天的学生信息
SELECT ID AS 学号, SName AS 姓名, Birthdate AS 出生日期
FROM Student
WHERE MONTH(Birthdate) = MONTH(GETDATE()) AND DAY(Birthdate) = DAY(GETDATE());

--13 从成绩表中查出有哪些课程被选
SELECT DISTINCT CID AS 课程号
FROM Score;

--14 从成绩表中查询已选课程有几门
SELECT COUNT(DISTINCT CID) AS 已选课程数
FROM Score;

--15 从学生表中,查出1985—1991年之间出生的学生
SELECT ID AS 学号, SName AS 姓名, Birthdate AS 出生日期
FROM Student
WHERE YEAR(Birthdate) BETWEEN 1985 AND 1991;

--16 使用between and方法,查出成绩表中成绩在80-95之间的情况
SELECT *
FROM Score
WHERE Grade BETWEEN 80 AND 95;

--17 从成绩表中查出课程D001,D003课程的情况
SELECT *
FROM Score
WHERE CID IN ('D101', 'D103');

--18 查出家庭住址中含有“郫县”二字的学生情况
SELECT *
FROM Student
WHERE Address LIKE '%郫县%';

--19 查出所有姓李和杨的学生情况,请使用至少两种方法实现
--方法1:使用LIKE子句

SELECT *
FROM Student
WHERE SName LIKE '李%' OR SName LIKE '杨%';

--方法2:使用IN子句
SELECT *
FROM Student
WHERE LEFT(SName, 1) IN ('李', '杨');

--20 把学生表拆分成男,女生两个独立的表. 再把两个表合并到一个新表”学生总”
-- 创建男生表
SELECT *
INTO MaleStudents
FROM Student
WHERE Grade = '男';

-- 创建女生表
SELECT *
INTO FemaleStudents
FROM Student
WHERE Grade = '女';

-- 合并两个表
SELECT * FROM MaleStudents
UNION ALL
SELECT * FROM FemaleStudents;

-- 创建女生表
SELECT *
INTO FemaleStudents
FROM Student
WHERE Grade = '女';

-- 合并两个表
SELECT * FROM MaleStudents
UNION ALL
SELECT * FROM FemaleStudents;

  • 36
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值