SQL快速入门(基本用法)

时间:2024-10-05 21:35:06

一、SQL增删查改基本语句的练习


关键字
(1)distinct:去除列中重复值   例:SELECT DISTINCT country FROM Websites;
(2)where: 筛选指定条件的记录   例:SELECT * FROM Websites WHERE id=1;
(3)Top: 取行  例:

  1. select top 5 * from table //取前5
  2. select top 5 * from table order by id desc //5

(4)As取别名:SELECT 列名 as 新name form 表名 AS 新name;
(5)运算符:=     <>      <=      between        in      not   and与or:and优先级高于or

(6)like(模糊查询 %:多个 _:一个)
(7)order by: 对结果集按一个或多个列排序(默认升序),desc降序。


例:

UPDATE Websites SET age='22', country='CN' WHERE name='王俊凯';(where指定需要更新的记录,否则全部更新)

DELETE FROM Earth WHERE name='USA' AND country='日本'; (where同上,造成全删除)

5.执行顺序

6.其他关键词

(1)UOION(合并两个或多个 SELECT 语句的结果)
(UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。)

select country from websites union select country from apps; //UNION 选取不同值, UNION ALL 可选取重复的值。可再加where筛选

(2)select into from :查询出来结果--->复制一张同结构的空表--->将数据拷贝进去

  1. SELECT , access_log.count //只复制一些列
  2. INTO WebsitesBackup2016  //插入到新表
  3. FROM Websites
  4. LEFT JOIN access_log     //复制多个表中的数据(先把表连接起来)
  5. ON =access_log.site_id
  6. WHERE country='CN';    //筛选条件
  7. select *(查询出来的结果) into newtable(新的表名)from where (后续条件)

(3)insert into select :指定一张想要插入数据的表格--->对数据进行加工筛选--->填入一张准备好的表格

insert into  (准备好的表) select *(或者取用自己想要的结构)from 表名 where 各种条件

(3)
      Drop:删除索引、表和数据库
     Alter:在已有的表中添加、删除或修改列

(4)视图(基于 SQL 语句的结果集的可视化表,可向视图添加函数、WHERE等再次呈现数据。但每当用户查询视图时,数据库会使用视图的 SQL 语句重新查询最新数据,隐藏了底层的表结构,简化了数据访问操作,提供了一个统一访问数据的接口。)
 

  1. 创建:
  2. creat view  [数据库/表.]  视图名  [视图中的列名]   AS  
  3.            查询结果集(完整的查询语句)
  4. 执行:  select * from 视图名    //直接把视图当成一张表

4.数据类型(需要的时候再查)

二、SQL 多表关联的学习

1.总体图

2.常用连接(总之,灵活运用子查询、嵌套、连接)

  使用 join 时,on 和 where 条件的区别如下:
(1)、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。(但是如果没有连接条件则返回笛卡尔乘积(行*行))
(2)、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

内连接:两个表的交集
左外连接:左边表加两表交集
右外连接:右边表加两表交集

  1. 通过连接把不同的表连接到一起,变成一张大表,使查询操作变得简单
  2. 一、外连接
  3. 1)左连接 left joinleft outer join
  4. select * from student left join score on =score.Stu_id;
  5. 2)右连接 right joinright outer join
  6. select * from student right join score on =score.Stu_id;
  7. 3)完全外连接 full joinfull outer join
  8. select * from student full join score on =score.Stu_id;
  9. 4)交叉连接:cross join-------两个表的乘积(笛卡乘积)
  10. select * from a,b 或select * from student cross join score;
  11. 二、内连接(joininner join
  12. 内连接查询分为两类:
  13. 1)隐式内连接 select * from A,B where 条件
  14. 2)显式内连接 select * from A inner join B on 条件 (inner可以省略)AS(别名)

CROSS APPLY

OUTER APPLY

关于SQL中OUTER APPLY 得用法 - 该吃药了 - 博客园

三、SQL 基本功能函数

1.聚集函数(SQL Aggregate 函数计算从列中取得的值,返回一个单一的值)

(1)Count()

  1. select count(*) from access_log;  -- 查询所有记录的条数
  2. select count(alexa) from websites;-- 查询 alexa列中不为空的记录的条数
  3. select count(distinct country) from websites;-- 查询country列中不重复的记录条数

(2)取第一行、最后一行  

SELECT TOP 1 column_name FROM table_name  ORDER BY column_name DESC;

2.分组聚合
(1)注意使用顺序

  1. SELECT id,Sum(boyfirend)
  2. FROM table
  3. WHERE age < 25
  4. GROUP BY id /根据id来重新分组(相同的为一组,然后再计算组中的SUM)
  5. HAVING Sum(boyfirend) >10 ; //聚合函数不能作为条件放在where(过滤行)之后,但可放having(过滤分组)后

3.Scalar函数(基于输入值,返回一个单一的值)

  1. (1) SELECT UPPER(列名) AS site_title FROM Websites; //把选择的列,将其中的值转换为大写,小写LOWER()
  2. (2) SELECT MID(列名id,起始位置(下标从1开始),结束位置) AS 新列名 FROM table; //把选择的列,提取出需要的值
  3. (3) SELECT LEN(列名) FROM table; //把选择的列,返回文本字段中值的长度
  4. (4SELECT ROUND(列,要保留的小数位数) FROM TABLE; //把指定列的值,四舍五入为指定的小数位数
  5. (5) SELECT DATE_FORMAT(Now(),'%Y-%m-%d') AS date FROM Table//NoW返回当前系统的日期和时间,DATE_FORMAT对数据格式化。
 4.其他·函数
(1)EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False

5.内置函数

        (1)排名函数

        DENSE_RANK()。如果使用 DENSE_RANK() 进行排名会得到:1,1,2,3,4。

        RANK()。如果使用 RANK() 进行排名会得到:1,1,3,4,5。

        ROW_NUMBER()。如果使用 ROW_NUMBER() 进行排名会得到:1,2,3,4,5。

举例:

        (2)limit()用于限制查询结果返回的数量,常用于分页查询
        limit 0,1 offset m    -->offset偏移量(可不写)

      (3)count 附:count(*) 和 count(1)和count(列名)区别  

        执行效果上:  
        count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL  
        count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL  
        count(列名)只包括列名那一列,会忽略列值为NULL

四、SQL 存储过程详解

1.存储过程意义

(1)增强了代码的复用率和共享性
(2)存储过程存储在服务器上,并在服务器上运行,减少了网络中数据的流量
(3)只在创建时进行编译,以后每次执行存储过程都不需再重新编,加快了过程的运行速度
(4)加强了系统的安全性,提高了处理复杂任务的能力。

2.常用系统存储过程

(1)sp_helpdb:用于查看数据库名称及大小
(2)sp_helptext:用于显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。
(3)sp_helplogins:查看所有数据库用户登录信息。
(4)sp_helpsrvrolemember:用于查看所有数据库用户所属的角色信息。
附:临时存储过程,以“#”局部临时或“##”局部临时为前缀

3.用户自定义存储过程

(1)存在一些错误,具体深入学习需要到实际代码中

触发器的学习

(1).概念:是响应数据操作语言(DML)事件或数据定义语言(DDL)事件而执行的特殊类型的存储过程,是在用户对某一表中的数据进行UPDATE、INSERT和DELETE操作时被触发执行的一段程序。

(2).类别:

(1)DML触发器:是在执行INSERT、UPDATE或DELETE语句时被激活的触发器
(2)DDL触发器:是在执行CREATE、ALTER和DROP语句时被激活的触发器,是由数据定义语言引起的

(3).作用:保证数据库复杂的参照完整性和数据的一致性(数据库内存中两个特殊表:插入表inserted、删除表deleted(触发器执行过程中所有记录都会写入到两个对应的表中,并且用户只有只读权限,触发器完成工作后,这两个表将从内存中删除))

(4).注意事项:

<1>CREATE TRIGGER语句必须是批处理中的第一个语句,且只能用于一个表或视图。
<2>创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。
<3>触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建触发器。
<4>不能在临时表或系统表上创建触发器,但是触发器可以引用临时表。不应引用系统表,而应使用信息架构视图。
<5>在含有用DELETE或UPDATE操作定义的外键表中,不能定义INSTEAD OF和INSTEAD OF UPDATE触发器。

(5).创建
(1)DML模板

  1. REATE TRIGGER (触发器名字)  ON (表/视图)  FOR/AFTER/INSTEAD OF (insert/update/deleteAS
  2. BEGIN
  3. declare @t int
  4. insert......
  5. if(....)
  6. END

(2)DDL模板

  1. USE  (数据库)
  2. CREATE TRIGGER (触发器名字)  ON (数据库...)  FOR/AFTER/INSTEAD OF (CREATE/ALTER/DROP)    AS
  3. BEGIN
  4. print '不允许修改、删除操作'
  5. rollback transaction
  6. END

视图的学习

1.视图(基于 SQL 语句的结果集的可视化表,可向视图添加函数、WHERE等再次呈现数据。但每当用户查询视图时,数据库会使用视图的 SQL 语句重新查询最新数据,隐藏了底层的表结构,简化了数据访问操作,提供了一个统一访问数据的接口。)

  1. 1)创建:
  2. creat view  [数据库/表.]  视图名  [视图中的列名]   AS  
  3. 查询结果集(完整的查询语句)
  4. 2)执行:  select * from 视图名    //直接把视图当成一张表