--关系数据库 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 ('北京市')