SQL必知必会学习总结

本文详细介绍了SQL的基本查询语法,包括ORDER BY子句、多列排序、指定排序方向、过滤搜索、高级数据过滤、通配符过滤、计算字段、数据处理函数以及汇总数据。还涉及了子查询、表连接、组合查询、插入、更新和删除数据的操作。强调了在进行UPDATE和DELETE操作时务必谨慎,通常需要配合WHERE子句使用。此外,还涵盖了创建和操纵表的相关知识,如添加、删除和修改表结构。
摘要由CSDN通过智能技术生成

仅供自我学习使用

 

Order by子句应该是Select语句中最后一条子句。

可以查询A列,按照B列数据排序

 

按多个列排序:

按照列名字

select A from table_a order by b,c

这样会先按照b排序,再按照c排序

 

按照列位置

select A from table_a order by 2,3

使用的时候要注意列是否存在

 

指定排序方向

默认——升序ASC。

降序 DESC ,只对它前面这个列有作用 —— order by a DESC,b

如果要对每个列都降序排列,要对每个列加上DESC

 

 

过滤搜索

在表名之后给出。

并不是所有的DBMS都支持这些操作符。<> != !< !>

与字符串类型比较要用单引号 ‘A’

BETWEEN 包括指定的两个值

NULL 空值。和包含字段包含0、空字符串或仅仅包含空格不一样

用来检查具有NULL值的列。WHERE a IS NULL

 

PostgreSQL比较严格。 =3.49 应该更改为 = decimal ‘3.49’

 

 

高级数据过滤

OR

在第一个条件满足时,不再计算第二个条件

 

AND优先级高于OR——解决办法,直接用圆括号

Where a条件 or b条件 and c条件——满足 a条件,或者是,b和c条件的

 

IN

功能和or一样,但是比or简洁、效率更高,in里面可以包含select子句动态建立where子句

 

NOT

where NOT A = 1 等同于 where A <> 1

但是MySQL中只支持NOT EXISTS

 

 

通配符进行过滤

谓词

LIKE是谓词而不是操作符

通配符搜索只能用于文本字段(串)

 

%

Microsoft Access使用*而不是%

搜索是可以区分大小写的

要注意匹配后面的空格 比如 F%y% 有些列设置了字符串长度,比如 “fish “这个字符串

 

 

_

只匹配单个字符

Microsoft Access使用?而不是_

 

 

[]

指定一个字符集,必须匹配指定位置(通配符的位置)的一个字符

Microsoft Access、Microsoft SQL Server和Sybase Adaptive Server支持集合。

 

where A LIKE ‘[JM]%’ 匹配任何以方括号中JM开头的联系人名 即 J开头或者 M开头的

 

^

不以J或M开头 WHERE A LIKE ‘[^JM]%’

Microsoft Access中用! WHERE A LIKE ‘[!JM]%’ 等同于 WHERE A NOT LIKE ‘[JM]%’

 

注意事项

不要过分使用通配符,尽量不要放在开始处

七 创建计算字段

计算字段并不实际存在于数据库表中,计算字段是运行时在select语句内创建的。

 

拼接字段

用+还是||

Access、SQL Server和Sybase使用+

DB2、Oracle、PostgreSQL和Sybase使用||

 

MySQL中的拼接使用CONCAT()函数

 

RTRIM()函数——去掉串的右边空格,返回格式化的数据

LTRIM()函数——去掉串的左边空格,返回格式化的数据

TRIM()函数——去掉左右两边的空格

 

 

八 使用数据处理函数

 

文本处理函数

SOUNDEX——将任何文本串转换为描述其语音表示的字母数字模式的算法。发音比较,not字母比较

 

日期和时间处理函数

DATEPART()——返回日期的一部分

DATE_PART

提取年份:

Access中:返回年 DATEPART('yyyy',order_date)=2004

MySQL中:YEAR(order_date)=2004

Oracle中:to_number(to_char(order_date,'YY'))=2004

to_char()——用来提取日期的成分,to_number()——将提取出的成分转换为数值,以便与2004比较

BETWEEN where order_date between to_date('011-JAN-2004') and to_date('31-DEC-2004')

 

数值处理函数

 

第9章 汇总数据

 

AVG()函数忽略列值为NULL的行

 

COUNT(*)——计数时,不管列中包含的是NULL还是非NULL。筛选出5行

COUNT(column))——忽略NULL。它可能只有3行非空

 

MAC()——找出最大的数值或者日期值

用于文本数据时,如果数据按照相应地列排序,则MAX()返回最后一行

忽略NULL的行

 

SUM()——忽略NULL的行

 

DISTINCT 平均值只考虑各个不同的价格

Select avg(DISTINCT price) AS avg_price

FROM products

WHERE id = '01';

 

第10张分组数据

数据分组

 

GROUP BY子句中列出的每个列,都必须是检索列 或 有效的表达式(不能是聚集函数)

在SELECT中使用表达式,必须在GROUP BY子句中指定相同的表达式,不能使用别名

大多数SQL实现不允许GROUP BY列带有长度可变的数据类型(如
文本或备注型字段)。

除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY
子句中给出。

如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列
中有多行NULL值,它们将分为一组。


 

必须 where ... group by....order by...

 

group by 2,1——先按照2分组,再按照1分组

 

过滤分组

where过滤行

having过滤分组 having仅在与Group by子句结合时,才使用。

having支持所有where操作符

 

select vend_id from products

where price >= 4

having count(*)>=2

 

第11章 使用子查询

第12章 连结表

 

第13章

自然联结P94还没看。

 

 

第14章 组合查询

Union

可以把2条sql语句的结果,拼接起来。

注意:

2条或者以上的SELECT语句

每个查询必须包含相同的列、表达式活聚集函数(各个列不需要以相同次序列出)

列数据类型必须兼容:类型不必完全相同、但必须是DBMS可以隐含转换的类型,如:不同的数值类型/不同的日期类型

包含或取消重复的行

重复的行会被自动取消。这是UNION的默认行为。

不想重复,用UNION ALL

 

 

对组合查询结果排序

只能使用一条ORDER BY子句,必须出现在最后一条SELECT语句之后。 只能用同一种方式排序结果集。

 

DBMS会把所有的结果按照这个order by的规则来排序。

 

其他类型的UNION

EXCEPT(有时称为MINUS):只在第一个表中存在,不存在第二个表中的行。

INTERSECT可用来检索2个表中都存在的行

 

第15章 插入数据

INSERT INTO user VALUES('A','B')

 

INSERT INTO user (A,B,C) VALUES('a','b','c')

可在INSERT操作中省略某些列的条件:

  • 该列定义为允许NULL值(无值或空值);
  • 在表定义中给出默认值

插入检索出的数据——INSERT SELECT,可以插入多行

INSERT INTO user(A,B,C) SELECT A,B,C FROM driver

 

driver中的列名不需要和user的列名一致,只是会按照顺序,把值插入进去。

从一个表复制到另一个表——SELECT INTO

DB2不支持

INSERT SELECT:导出数据

SELECT INTO:导入表

ORACLE

SELECT * INTO user FROM driver

 

如果只想复制列A

SELECT * INTO A FROM driver

MySQL

CREATE TABLE user AS SELECT * FROM driver

注意事项

  • 任何SELECT选项和子句都可以使用,包括WHERE和GROUP BY
  • 可利用联结从多个表插入数据
  • 不管从多少个表中检索数据,数据都只能插入到单个表中

第16章 更新和删除数据

UPDATE user SET A = 'a' WHERE id = '0001';

where子句告诉DBMS更新哪一行,没有这句的话,就会把表中所有A列的值更改为a

 

更新多个列

UPDATE user SET A = 'a' B = 'b' WHERE id = '0001';

 

在update语句中使用子查询:

 

FROM关键字 用来自表A的数据更新B表的行。有些DBMS支持

 

删除某个列的值,设置它为NULL(前提:运行NULL值)

UPDATE user SET A=NULL WHERE id = '0001';

 

删除数据——DELETE

DELETE FROM user WHERE id = '0001';

FROM可选。但是最好保留,保证可移植性。

 

delete删除内容,不删除表

 

更快的删除 删除所有行,用TRUNCATE TABLE语句,完成相同工作,更迅速(因为不记录数据的变动)

 

使用原则

  • 使用UPDATE和DELETE语句,要带WHERE子句,除非要更新和删除每一行
  • 保证每个表都有主键
  • 在进行UPDATE/DELETE语句使用WHERE子句前,应该使用SELECT进行测试,保证记录是正确的
  • 使用强制实施引用完整性的数据库,这样DBMS将不允许删除具有与其他表相关联的数据的行
  • 有的DBMS运行DBM施加约束,以防止执行不带WHERE子句的UPDATE/DELETE。如果采用的DBMS支持这个特性,应该使用它。

第17章 创建和操纵表

Oracle、PostgreSQL、SQL Server、Sybase中:

CREATE TABLE 表名 (类名 类型 NOT NULL, id CHAR(10) NOT NULL );

 

MySQL:varchar——text

 

默认NULL。

 

替换现有的表

先删除该表,再重建它。不能覆盖它。

 

指定默认值

获得系统日期

更新表——ALTER TABLE

一般的DBMS都不太支持修改表,在设计的时候就应该设计好。

有值的列更改更是有限制,对无数据的列几乎没有限制

 

ALTER TABLE 表名 ADD 列名 类型

 

删除表——DROP TABLE

删除整个表,而不是表内容。删除表没有撤销也没有确认。

重命名表——Rename

每个DBMS的要求不一样

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值