0:创建表(同时创建表结构)
create table employee (
编号 int identity(1,1) not null,
姓名 nvarchar(6) not null,身份证号 nchar(18) primary key,职务 nchar(10) not null,
基本工资 money not null check(基本工资>0 and 基本工资<20000) ,出生日期 date not null,
)
1:向employee表中插入一行数据
insert into employee (姓名, 身份证号, 职务, 出生日期, 基本工资)
VALUES ('李六', '111222333444555610', '运维工程师', '1995/10/1', 8500),
('李五', '111222333444555668', '开发工程师', '1995/9/10', 9000)
2:更改employee表中黄蓉的基本工资为11000
update employee SET 基本工资='11000'
WHERE 姓名='黄蓉'
3:删除employee表中杨过的记录
DELETE FROM employee WHERE 姓名='杨过'
4: SELECT 语法结构
SELECT select_list(列名)
[INTO new_table_name]
FROM table_name
[ WHERE search_conditions ]
[GROUP BY group_by_expression]
[HAVING search_conditions]
[ORDER BY order_expression [ASC|DESC] ]
5:查询基本工资为8000~10000的员工所有信息
SELECT * FROM employee
WHERE 基本工资 BETWEEN 8000 AND 10000
6:查询基本工资<10000或>20000的员工所有信息
SELECT * FROM employee
WHERE 基本工资<10000 OR 基本工资>20000
7:查询基本工资为8000、9000和10000的员工所有信息
SELECT * FROM employee WHERE 基本工资 IN (8000,9000,10000)
8:查询身份证号以66开头的员工所有信息
SELECT * FROM employee WHERE 身份证号 LIKE '66%'
9:查询姓杨的运维工程师的信息
SELECT * FROM employee
WHERE 姓名 LIKE '杨%' AND 职务='运维工程师'
10:查询备注不为空的员工所有信息
SELECT * FROM employee WHERE 备注 is not NULL
11:查询employee表中前5行的数据
SELECT top 5 * FROM employee
12:查询employee表中姓名和身份证号两列数据并取上别名
SELECT 姓名 AS name, 身份证号 as idcard FROM employee
13:查询employee表中所有员工信息,按照基本工资从高到低显示查询结果
SELECT * FROM employee ORDER BY 基本工资 DESC
14:查询employee表中员工的所有职务(查询去重)
SELECT DISTINCT 职务 FROM employee
15:查询出生日期最早的前10名员工的姓名
SELECT top 10 姓名 FROM employee ORDER BY 出生日期 asc
16:在employee表中,查询所有员工的姓名、身份证号、职务和基本工资
列出满足身份证号的左起第三位是0、除CTO以外的
姓名字段显示为name
查询结果按照基本工资的由高到低排列:
SELECT 姓名 AS name, 身份证号, 职务, 基本工资
FROM employee
WHERE 身份证号 LIKE '__0%' AND 职务!='CTO'
ORDER BY 基本工资 DESC
17:将employee表中所有员工的姓名、身份证号和职务生成一个新表new01
SELECT 姓名,身份证号,职务 INTO new01 FROM employee
18:将employee表中所有基本工资大于等于15000的员工的姓名、职务和出生日期保存到新表new02(前提:这张新表要提前创建)
INSERT INTO new02 (姓名,职务,出生日期)
SELECT 姓名, 职务, 出生日期
FROM employee
WHERE 基本工资 >= 15000
19:将employee表中所有员工的姓名、职务和出生日期,以及新输入2名员工相关信息,一起保存到新表new02
INSERT INTO new03 (姓名,职务,出生日期)
SELECT '欧阳锋','人事经理','1988-08-08' UNION
SELECT '一灯','财务经理','1977-07-07' UNION
SELECT 姓名,职务,出生日期 FROM employee
20:显示employee表中开发工程师的姓名和基本工资 (cast数据类型转换)
SELECT '开发工程师'+姓名+' 的基本工资是:' + cast(基本工资 as varchar(10)) + '元'
FROM employee WHERE 职务 = '开发工程师'
21:显示距离当前10天之后的日期和时间
Select DateAdd(dd,10,GetDate())
22:显示employee表中所有人的姓名和年龄
SELECT 姓名,DATEDIFF(YY,出生日期,GetDate()) AS 年龄
FROM employee
23:显示employee表中所有90后员工的姓名和出生年份
SELECT 姓名,DATENAME(YEAR,出生日期) AS 出生年份
FROM employee
WHERE 出生日期 BETWEEN '1990-01-01' AND '1999-12-31'
24:查询employee表中每个职务的平均工资
SELECT 职务,AVG(基本工资) AS 职务平均工资
FROM employee
GROUP BY 职务
25:同在一个SELECT语句中,执行顺序:WHERE -> GROUP BY -> HAVING
查询employee表中平均工资小于10000的职务,员工“段誉”不计算在内
SELECT 职务,AVG(基本工资) AS 职务总工资
FROM employee WHERE 姓名 != '段誉'
GROUP BY 职务 HAVING AVG(基本工资) < 10000
26:查询employee表中所有人的平均工资,用CEILING()函数取整(CEILING()函数取大于或等于指定数值表达式的最小整数
)。
SELECT CEILING(AVG(基本工资)) AS 平均工资
FROM employee
27:查询未满30岁的员工的生日和年龄,并计算出距离30岁的天数,用字符串拼接显示结果(分两大步)
一:先执行正确语句
select 姓名,出生日期,DATEDIFF(yy,出生日期,GETDATE()) as 年龄
,DATEDIFF(dd,GETDATE(),dateadd(yy,30,出生日期)) as 距离30岁 from employee
where DATEDIFF(yy,出生日期,GETDATE())<=30
二:对上述语句结果进行字符串的拼接(convert(转换后,源数据,类型)函数和cast(源数据as转换后)函数进行类型转换)
select '员工'+姓名+'的生日是'
+CONVERT(nvarchar(10),出生日期,111)
+',现在年龄是'
+cast(DATEDIFF(yy,出生日期,GETDATE()) as varchar(10))
+'岁,距离三十岁生日还有'
+cast(DATEDIFF(dd,GETDATE(),dateadd(yy,30,出生日期)) as varchar(10))
+'天'
from employee
where DATEDIFF(yy,出生日期,GETDATE())<=30
28:使用T-SQL实现多表查询 。如果一个查询需要对多个表进行操作,就称为联接查询。
1。先建立两张表A和B
create table A ( 姓名 nvarchar(6) not null,学校 nvarchar(10) not null)
create table B ( 姓名 nvarchar(6) not null,职业 nvarchar(10) not null)
2。向表中插入数据
insert into A(姓名,学校)
VALUES ('李寒','北京大学'),('张玉','清华大学'),('刘敏','中国人民大学'),('孙明明','浙江大学')
insert into B(姓名,职业)
VALUES ('王博','工程师'),('张玉','咨询师'),('刘敏','作家'),('张明翰','建筑师')
内联接
在表A和表B中使用内联接查询学生姓名、学校和职业
方式一:在Where子句中指定联接条件(别名设置as可省略)
SELECT A.姓名 姓名A, A.学校 学校A, B.姓名 姓名B, B.职业 职业B
FROM A, B WHERE A.姓名= B.姓名
方式二:在FROM子句中使用INNER JOIN…ON子句
SELECT A.姓名 姓名A, A.学校 学校A, B.姓名 姓名B, B.职业 职业B
FROM A INNER JOIN B ON A.姓名=B.姓名
外连接(左外和右外)
1.左外联接查询
SELECT A.姓名 姓名A, A.学校 学校A, B.姓名 姓名B, B.职业 职业B
FROM A LEFT JOIN B on A.姓名 = B.姓名
2.右外联接查询
SELECT A.姓名 姓名A, A.学校 学校A, B.姓名 姓名B, B.职业 职业B
FROM A RIGHT JOIN B on A.姓名=B.姓名
备注:(左外和右外都是相对LEFT(RIGHT) JOIN的左右位置来说的,记住一个即可)例子:
FROM A LEFT JOIN B on A.姓名 = B.姓名 == FROM B RIGHT JOIN A on A.姓名 = B.姓名
3.完整外联接查询(全连接)
SELECT A.姓名 姓名A, A.学校 学校A, B.姓名 姓名B, B.职业 职业B
FROM A FULL JOIN B on A.姓名=B.姓名
备注:把FULL去掉后,默认使用内连接
29:修改表结构
一:添加列
ALTER TABLE 表名
ADD 列名 数据类型(大小)
二:修改列的数据类型
ALTER TABLE 表名
ALTER COLUMN 列名 数据类型(大小)
三:删除列
ALTER TABLE 表名
DROP COLUMN 列名
30:创建聚集唯一索引,索引名为IX_employee
CREATE UNIQUE CLUSTERED INDEX IX_employee
ON employee(编号)
31:按照指定的索引进行查询
SELECT * FROM employee
WITH (INDEX = IX_employee)
WHERE 编号=3
32:删除索引
DROP INDEX IX_employee ON employee
33:索引分类创建
一:创建普通索引(可以重复)
CREATE INDEX index_name
ON table_name (column_name)
如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC
CREATE INDEX index_name
ON table_name (column_name DESC)
假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开
CREATE INDEX index_name
ON table_name (column_name,column_name)
34:视图
一:创建视图
CREATE VIEW 视图名 AS
SELECT 列名
FROM 表名
WHERE 条件
二:查询视图
select * from 视图名
三:删除视图
DROP VIEW 视图名
35:存储过程:是一组预编译的T-SQL语句
一:执行常用的系统存储过程
EXEC sp_databases --列出当前系统中的数据库
EXEC sp_renamedb 'MyBank','Bank' --改变数据库名称(mybank改名为bank)
USE MySchool --使用myschool数据
GO
EXEC sp_tables --当前数据库中可查询对象的列表
EXEC sp_columns employee --查看表employee中列的信息
EXEC sp_help employee --查看表employee的所有信息
EXEC sp_helpconstraint Student --查看表Student的约束
EXEC sp_helptext view_Student_Result --查看视图的语句文本
EXEC sp_stored_procedures --返回当前数据库的存储过程列表
二:创建存储过程
create proc abc (创建存储过程名)
as
declare @subjectNo int (声明变量)
select @subjectNo=employee.编号 from employee (给变量赋值)
where 姓名='郭靖'
declare @avg decimal(10,2) (声明变量)
select @avg=avg(基本工资) from employee
print '郭靖的ID是:'+convert(varchar(3),@subjectNo) (使用字符串打印输出)
print '基本工资是:'+convert(varchar(12),@avg)
三:调用存储过程abc
exec abc
36:触发器概念
是在对表进行增删改操作时自动执行的存储过程,是一种高级约束
两张表:inserted表和deleted表 是虚拟表,由系统管理,存储在内存而不是数据库中,因此,不允许用户直接对其修改
inserted表(保存新数据) deleted表(保存原始数据)
执行的时间:新数据已经保存了,然后触发器对其进行验证,若发现有错误就回滚数据。
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION] (加密,防止其作为sql server复制的一部分进行发布)
FOR {[DELETE, INSERT, UPDATE]}
AS SQL语句
一:创建名为tri的触发器,禁止对emp表进行删除的操作,同时打印出'禁止修改'字段。
create trigger tri
on employee
for delete
as
rollback transaction
print '禁止修改'
二:进行验证
delete FROM employee where 姓名='李三'
三:删除名为tri的触发器
drop trigger tri
37:事务
一:开始事务
BEGIN TRANSACTION
二:提交事务
COMMIT TRANSACTION
三:回滚(撤销)事务
ROLLBACK TRANSACTION