--关系数据库 T-SQL
--SQL:struct结构 query查询 language语言 结构化查询语言
--Oracle MySQL SQLServer
--SQL博大精深 DBA数据库工程师
--知识点:
--1语法
--2函数
--3SQL语法
--sql语法规范:所有关键字大写的 用户自定义的根据用户实际情况来 但是数据库不区分大小写
--四大基本语句
--查询
select * from 表名
--添加
insert into 表名(列名1,列名2,列名3) values('数据1','数据2','数据3 ')
--添加的特殊写法:约束性较强1)字段顺序必须和表的一样 2)所有字段都需要赋值,缺一不可(标识列不算)
insert into 表名 values('数据1','数据2','数据3 ')
---------千万小心:在写更新语句和删除语句的时候一定要检查条件。(只为了避免删库跑路发生)
--删除
delete from 表名 where 条件
--更新
update 表名 set 想要更新的列='数据' where 条件
--条件查询 where
select * from 表名 where 条件
--多个条件 and or
SELECT * FROM 表名 WHERE ID=2 AND Name='王明'
SELECT * FROM 表名WHERE ID=2 OR Name='王明111'
--top 查询
SELECT TOP 5 * FROM 表名
SELECT * FROM 表名LIMIT 5 --mysql
--ORDER BY 排序
--ASC 升序 从小到大
--DESC 降序 从大到小
SELECT * FROM 表名ORDER BY Name DESC
SELECT * FROM 表名ORDER BY Name ASC
--语句分为5个阶段
结果集部分 表部分 条件部分 排序部分 分组部分
--like 模糊匹配
SELECT * FROM 表名 WHERE Name LIKE '王%'
SELECT * FROM 表名 WHERE Name LIKE '%二'
SELECT * FROM 表名 WHERE Name LIKE '%王%'
-- between and 范围检索 包含1和5
SELECT * FROM 表名 WHERE DistrictID Between 1 AND 5
SELECT * FROM 表名 WHERE DistrictID>=1 AND DistrictID<=5
-- in 和not in 存在包含
SELECT * FROM 表名 WHERE DistrictID NOT IN(1,2,3)
--CASE WHEN THEN END 多种值的一个判断
SELECT *, (CASE Gendar WHEN 1 THEN '女' WHEN 0 THEN '男' END) AS GendarText FROM 表名
--聚合函数
--聚合函数只能查询单一字段,不能得到该条数据的完整数据
sum avg max min
SELECT sum(Id) FROM 表名
SELECT avg(Id) FROM 表名
SELECT MAX(Id) FROM 表名
SELECT min(Id) FROM 表名
SELECT COUNT(1) FROM 表名
--group by 分组语句 将数据分组然后进行统计
--根据什么字段group by 那么你的select后面就只能有这个字段,聚合函数可以出现在group by 的select后面
SELECT Gendar,MAX(ID) from Student GROUP BY Gendar
--联合查询语句
--1确定你主表Student 查学生 附带要地区名字
--2确定关系两表之间的关系 Student(DistrictID) S_Distrcit(Distrcit_ID)
--3确定你要的字段 Id Name Phone DistrictName
SELECT s.*, d.DistrictName
FROM Student s INNER JOIN S_District d
ON s.DistrictID=d.DistrictID
--INNER JOIN:要求数据必须能够关联起来,如果不能关联则数据不会被显示出来
SELECT s.*,c.class_name FROM Student as s inner join Classes c on c.id=s.ClassID
--LEFT JOIN:以左侧表为主表,主表中有多少条数据就显示多少条数据,能关联则显示关联信息,不能关联则显示为NULL
SELECT s.*,c.class_name FROM Student as s left join Classes c on c.id=s.ClassID
--RIGHT JOIN
SELECT s.*,c.class_name FROM Classes c right join Student as s on c.id=s.ClassID
--UNION 合并 注意:合并的时候两个类数据类型必须相同
SELECT Name,ID FROM Student
UNION
SELECT class_name,id FROM Classes
--UNION ALL
SELECT Name FROM Student
UNION ALL
SELECT class_name FROM Classes
--select into 查询插入表 注意:是一张新表
SELECT TOP 10 ProvinceName INTO Student_Test FROM S_Province
--insert into select ... 将一段查询结果插入到另一张表中
----查询省份表的前10个省份名 然后把它插入到学生表中的Name字段中
INSERT INTO Student(Name) SELECT TOP 10 ProvinceName FROM S_Province
--需求1:将1月和2月的订单数据 导入到一张order表中
--需求2:将1月的数据插入到2月的表中
--面向集合编程
SELECT t.* INTO [Order] from (SELECT number,price,create_time FROM order_01
UNION ALL
SELECT number,price,create_time FROM Order_02) t
INSERT INTO Order_02(number,price,create_time) SELECT number,price,create_time FROM order_01
--distinct 去重
--注意:需要整个结果集行中的所有字段都相同
SELECT DISTINCT number,price FROM [Order]
SELECT number FROM [Order]
--子查询:结果集 将一个查询结果当成一个表
--请查出省份表的所有数据,并且得到每个省份的城市数量
SELECT top 10 s.ProvinceName,s.ProvinceID,
(SELECT COUNT(1) FROM S_City c WHERE c.ProvinceID=s.ProvinceID) CityCount
FROM S_Province s
--请查出城市表中 ID 不为1,2,3,4,5的前5条数据
SELECT TOP 5 * FROM S_City WHERE CityID NOT IN (SELECT TOP 5 CityID FROM S_City )
--having:条件查询 作用于聚合函数中的条件查询
--请查出所有学生的总成绩 且总成绩大于60分的学生
SELECT s_id,SUM(s_score) as all_score FROM Score GROUP BY s_id having SUM(s_score)>=60
--语句分为5个阶段
结果集部分 表部分 条件部分 排序部分 分组部分
--exists:验证结果集是否存在的 存在则结果为true 不存在则为false
select ProvinceName from S_Province where exists (select top 1 ProvinceName from S_Province where ProvinceName='北京市' )
--查询省份数据 要求他的名字不为北京市
SELECT PROVINCENAME FROM S_Province WHERE ProvinceName not in ('北京市')