欢迎光临新华电脑职业培训-现代电脑-新东方学校网站!
您现在所处的位置:福建百科 > 网络技术 >

泉州浮桥网页培训班SQL必知必会学习笔记-福建百科教育网-网络技术

作者:泉州新华培训  时间:2020-02-28   点击数:   收藏  分享到:
0

泉州浮桥网页培训班SQL必知必会学习笔记-福建百科教育网


之前已经在知乎和sqlzoo上进行了SQL的学习,这里再通过阅读一遍SQL必知必会,笔记补充一下之前遗漏或者忘记的知识。

数据来源

Sams Teach Yourself SQL in 10 Minutes (Fourth Edition)forta.com图标

1.数据库

1.1数据库基础

数据库:一个以某种有组织的方式存储数据的集合——保存有组织的数据的容器。

:某种某种特定类型数据的结构化清单——由组成。表中数据按存储。

模式:关于数据库和表的布局及特性的信息。

:表中的一个字段。所有表都是由一个或多个组成的——每个都有相应的数据类型

数据类型:所允许的数据的类型。每个表列都有相应的数据类型,它显示或允许该列中存储的数据。

行:表中的一个记录——又称数据库记录。

主键:一列或者一组列,其值能够唯一标识中每一

主键的满足条件:任意两行不具有相同的主键值;每一行都必须具有一个主键值(不允许出现null空值);主键列中的值不允许修改或更新;主键值不能重用(如果某行从表中删除,主键不能赋给以后的新行)。

1.2 什么是SQL——专门用来与数据库沟通的语言,提供一种从数据库中读写数据的简单有效的办法。

2.检索数据 select

使用select至少给出两条信息——想选择什么?从什么地方选择?

select语句返回原始的无顺序数据。

使用通配符*,对于不确定列明,可以检索名字未知的列。

distinct:指示数据库返回不同的值。作用于所有的列。

显示返回前五行:

select prod_name

from products

limit 5;

显示从第五行开始往下的5行:

select prod_name

from products

limit 5 OFFSET 5;——简化:limit 5,5

3.排序检索数据 order by

子句:SQL由子句构成,有些是必须,有些是可选。一个子句通常有一个关键字加上所提供的数据组成。

order by <列名1>,<列名2>,<列名3>...

先按照第二列排序,再按照第三列排序

select prod_id,prod_price,prod_name

from products

order by 2,3;

降序排列desc,生序排列asc。

4.过滤数据 where

空值检查 is null

select cust_name

from customers

where cust_email is null;

5. 高级数据过滤

and:条件同时满足

or:任一条件满足

and or 优先顺序:

显示ven_id为DLL 01和BRS01而且单价小于10

select prod_name,prod_price,vend_id

from Products

where vend_id='DLL01' or vend_id='BRS01' and prod_price>=10;

输出结果:

使用圆括号对操作符进行分组,and的优先级高于or:

select prod_name,prod_price,vend_id

from Products

where (vend_id='DLL01' or vend_id='BRS01') and prod_price>=10;

输出结果:

使用操作符in可以代替or操作符:

select prod_name,prod_price,vend_id

from Products

where vend_id in ('DLL01' ,'BRS01') and prod_price>=10;

输出结果:

使用not否定后面的条件。

6.用通配符进行过滤

6.1%:表示任何字符出现的任意次数。但是不能匹配空值null

使用%查询email

where email like ‘% @ 126.com ’

6.2:_:表示任何字符出现一次

6.3使用通配符的技巧

  1. 不要过度使用通配符,如果其他操作符能达到相同功能,尽可能使用其他操作符。
  2. 在使用通配符时,尽量不要把他们用在搜索模式开始处,通配符位于开始出,搜索起来是最慢的。
  3. 仔细注意通配符的位置。

7.创建计算字段

concat(列名1,'符号',列名2)→输出:列名1符号列名2

8.函数

8.1 文本处理函数:

  1. left()返回字符串左边的字符。
  2. length()返回字符串长度
  3. lower()将字符串变为小写
  4. upper()将字符串变为大写
  5. ltrim()去掉字符串左边的空格
  6. right()返回字符串右边的空格
  7. rtrim()去掉字符串右边的空格
  8. soundex()返回字符串的soundex

soundex:再cust_contact中找到读音类似'michael green'的

select cust_name,cust_contact

from customers

where soundex(cust_contact)=soundex('michael green')

8.2日期函数

  1. current_date:当前日期
  2. current_time:当前时间
  3. current_timestamp:当前日期和时间
  4. year/month/day:获取日期的年份、月份和日期
  5. dayname:日期对应的星期

8.3 数值处理函数

  1. abs():绝对值
  2. cos():余弦
  3. exp():指数
  4. pi():圆周率
  5. sin():正弦
  6. sqrt():平方根
  7. tan():正切

9. 汇总数据

聚集函数:对某些行运行的函数,计算并返回一个值。

  1. avg():只能用来确定一个列的值,忽略空值null
  2. count():如果指定列名count(列名)则会忽略空值行,如果count(*)则不会忽略。
  3. max()和min()
  4. sum()

在剧集汇总的时候,默认都是全部all;如果需要汇总内容只包含不同值,使用distinct。

10.分组数据

groupby分组的规定

  1. 子句可以包含任意数目的列,可以对分组进行嵌套
  2. 在group by中的子句嵌套了分组,数据将在最后的分组中进行汇总。
  3. 字句中每一列都必须是检索列或者有效的表达式
  4. 一般子句中长度均相等
  5. select语句猴子那个每一列都必须在group by子句中给树
  6. 如果分组列包括null空值,则null被分为一组

11.子查询

子查询的select只能查询单个列。

注意下面两段代码的不同。

select cust_name,cust_state,(select count(*)

from orders

where orders.cust_id=customers.cust_id) as orders

from customers

ORDER BY cust_name;

输出结果:

 

select cust_name,cust_state,(select count(*)

from orders

where cust_id=cust_id) as orders

from customers

ORDER BY cust_name;

输出结果:

12.联结表

可伸缩:能够适应不断增加的工作量而不失败。设计良好的数据库或应用程序成为可伸缩性好。

交叉联结(笛卡尔积):表1(a行)中每一行分别和表2(b行)中的所有行进行联结,生成a*b行的表。

13.高级联结

使用联结时,至少有一列不只出现在一个表中。

14.组合查询union

union将多条select语句组合成一个结果集。

比较两段代码:

select cust_name,cust_contact,cust_email

from customers

where cust_state in ('IL','IN','MI')

union

select cust_name,cust_contact,cust_email

from customers

where cust_name='Fun4ALL';

————————————————————

select cust_name,cust_contact,cust_email

from customers

where cust_state in ('IL','IN','MI')

or cust_name='Fun4ALL'

两段代码结果相同,但是对于一些复杂的过滤条件,从多个表中检索数据使用union可能更快捷。

union规则:

  1. 必须有两条或两条以上的select语句组成。
  2. union中每个查询必须包含相同的列、表达式和聚合函数。也就是select必须相同。
  3. 数据类型必须兼容

15.插入数据insert——操作之前进行备份!

  1. 插入完成的行

insert into 表名(表中的列名1,列名2,...,列名n)

values(每一列对应的内容,内容1,内容2,...,内容n)——————一定要正确!

2. 插入部分行,语法和上面相同,只是并不要求输入表名的全部列名——可以省略部分列名。但是省略的列必须满足:该列定义为允许空值null或者无值;表的定义给出默认值,这里没有该值则填充默认值。

3. 插入检索出的数据

insert into 被插入表名(被插入表中的列名1,列名2,...,列名n)

select 选择插入的表的列名1,列名2,...,列名n

from 选择插入的表

4. 从一个表复制到另一个表

select *

into 表1

from 表2;

创建一个新的表1,将表2的数据全部复制到表1中。

注意事项:

  1. 在使用select into时,,任何select选项和子句都可以使用包括where 和group by。
  2. 可利用联结从多个表插入数据,
  3. 不管从过多少个表中检索数据,数据都只能插入一列。

16. 更新和删除数据——操作之前进行备份!

16.1 updata更新

更新表中特定行,更新表中的所有行。

在使用update时,一定要小心,避免更新全部数据

update 表1

set 列名1=内容1

列名2=内容2

where 列名3=内容3

在表1中,将列名3为内容3的列名1和列名2分别赋值为内容1和内容2

16.2delete

  1. 删除表中特定行——注意不要省略where语句,否则会删除所有行
  2. 从表中删除所有行

delete from 表1

where 列名1=内容1

在表1中删除列名1为内容1的行

16.3 更新和删除的原则

  1. 除非确定更新和删除每一行,否则使用语句的时候一定要加上where!
  2. 保证每个表都有主键,使用where和主键配合,确定更新删除的范围
  3. 在使用更新和删除前,先用select看看选定的是不是要更新删除的内容。
  4. 使用强制实施引用完整数据库,,DBMS将不允许删除取数据与其他表相关联的行
  5. 要注意有没有存在撤销按钮,以防止更新删除错误

17. 创建和操纵表——操作之前进行备份!

17.1 创建 表

  1. 交互式创建和管理数据库表的工具
  2. 表可以直接只用SQL语句进行操纵

create table 表名1

(列名1 数据类型 not null或者null,

列名2 数据类型 not null或者null default 1,

.......

列名n 数据类型 not null或者null);

创建表1,包括列名1-列名n的表,列名2的默认值为1,创建的表1必须之前不存在。

17.2 更新表

alter table 表1

add 列名1 数据格式

在表1中更增加一个列名为列名1的列,数据格式为char

17.3 删除表

drop table 表1

删除表1

17.4 重命名表

rename

18.使用视图——一个查询

虚拟的表,使用时动态检索数据

视图的规则:

  1. 视图名字必须唯一,不能和别的视图和表重名。
  2. 创建视图数目没有限制
  3. 视图可以嵌套

18.1 创建视图

create view PC as

select cust_name,cust_contact,prod_id

from customers,orders,orderitems

where customers.cust_id=orders.cust_id

and orderitems.order_num=orders.order_num

创建一个功能是

select cust_name,cust_contact,prod_id

from customers,orders,orderitems

where customers.cust_id=orders.cust_id

and orderitems.order_num=orders.order_num

的视图叫做PC

对视图进行操作

select cust_name,cust_contact

from PC

where prod_id='RGAN01'

输出结果

18.2 使用视图重新格式化检索数据

  1. 在视图里连接两个列
  2. 在视图里过滤数据,比如空值异常值
  3. 在视图中计算字段

19.使用存储过程

存储的用途:

  1. 将语句封装,简化操作
  2. 不要求反复建立一些过程,所有的人员和程序使用相同的过程——代码
  3. 简化变动的管理。比如表名,列名变化,只需要修改存储过程的代码
  4. 存储过程中通常以编译过的形式存储,所以工作量减少
  5. 存在一些只能用在单个请求的元素和特性