SQL基础知识


1、有代表性的关系型数据库有:
Oracle
SQL Server
DB2
PostgreSQL
MySQL

2、SQL语句分为三类
(1) DDL,数据定义语言
CREATE DROP ALTER

(2) DML,数据操纵语文
INSERT SELECT UPDATE DELETE

(3)DCL,数据控制语言
COMMIT ROLLBACK GRANT REVOKE

3、建表语句
create table <表名>
(<列名1> <数据类型> <该列所需约束>,
<列名2> <数据类型> <该列所需约束>,
<列名3> <数据类型> <该列所需约束>,

<该表的约束1> <该表的约束2> <该表的约束3>,…
)

4、关系数据库以行为单位读写数据

5、SQL语句以分号;结尾

6、数据库、表、列的命名只能由字母、数字、下划线组成,且以字母开头

7、Oracle中不推荐使用vachar,而是varchar2

8、select *无法设定列的显示顺序,会按照create table语句的定义对列进行排序

9、可以使用AS为列设定别名,使用中文时要用双引号,不能使用单引号

10、distinct只能用在第一个列名之前,如果后面有多个列,则会同时对这些列除重

11、单行注释用-- --,多行注释用/**/
MySQL的注释-- – 后面要加个空格,否则无法识别

12、sql中的运算都是以行为单位的,所有包含null的计算(+ -*/),结果肯定都是null

13、很多RDBMS使用!= 来实现不等于功能,这不是标准SQL,出于安全考虑,不建议使用,可以使用<>

14、字符串类型的比较是按字典序进行的

15、取null记录时要用is null或is not null,=null无法得到想要的结果

16、SQL是面向集合的语言,可以画文氏图来理解集合关系

17、AND运算符优先于OR

18、比较运算符会把运算结果以真值的形式进行返回

19、可以通过创建真值表,无论多复杂的条件都会更容易理解,可以将真值表中的真设为1,假变为0,则AND即为逻辑积,OR为逻辑和,NOT为反转

20、通常的逻辑运算为二值逻辑,SQL中的逻辑运算为三值逻辑,除了true、false 还有unknown(不确定),null为不确定

21、count(*)会得到包含null的数据行数,而count(列名)会得到null值之外的数据行数

22、聚合函数会将null排除在外,在计算之前就已经把null排除了,avg()在计算时不会把null的行数加入运算,因为在计算前已经排除了,这与等价为0并不相同,而count()不会排除null

23、max/min几乎适用于所有的数据类型的列,而sum/avg只能用于数值类型

24、group by子句就像切蛋糕那样把表进行了分组,在group by子句中指定的列称为聚合键或分组列,当聚合键中包含null时,在结果中会以不确定行(空行)的形式表现出来

25、sql的书写顺序与DBMS内部的执行顺序并不相同,比如:from->where->group by->select->order by

26、在使用聚合函数时,select子句中只能存在以下三种元素:
常数
聚合函数
group by子句中指定的列名,即聚合键

27、使用group by 子句时,select子句中不能出现聚合键之外的列名,因为通过某个聚合键将表分组后,结果中的一行数据就代表一组,例如使用单价将表进行分组后,一行就代表一个物品单价,如果将商品名称加到select子句中,此时聚合键单价与商品名并不是一对一的,假如单价为20元的有水杯和洗衣液,但是20元这一行无法确定对应哪个商品名

28、group by子句中不能用select中指定的列的别名,因为DBMS内部的select子句是在group by之后执行的,执行group by时select中定义的别名DBMS还不知道

29、where子句=指定行所对应的条件,having子句=指定组所对应的条件

30、聚合键所对应的条件不应该书写在having子句中,而应该写在where子句中

31、通常从表中抽取数据时,如果没有特别指定顺序,最终排列顺序便无从得知,即使同一条select语句,每次执行时排序很可能发生变化

32、可以在order by子句中指定多个排序键,规则是优先使用左侧的键,如果该列存在相同值的话,再接着参考右侧的键,排序键中存在null时,会在开头或末尾进行汇总

33、order by子句中可以使用select指定的列别名,因为执行顺序在select之后,也可以使用存在于表中,但是不包含在select子句之中的列和聚合函数

34、order by 子句中可以使用select子句中的列按照从左向右的进行排列时所对应的编号,但是不建议使用,因为代码可读性差,后续可能会在sql标准中删除该功能

35、插入默认值的2种方法:
(1) 显式插入,在values子句中指定default关键字

(2) 隐式插入,在列清单和values中省略默认值的列,此时会自动设定为该列的默认值,没有默认值则设定为null

36、truncate为舍弃的意思,可以快速删除表中的全部数据,在oracle中此方法不能使用rollback,执行方法的同时会默认执行commit操作

37、模式(shcema):关于数据库和表的布局及特性的信息

38、如果将表想象为网格,网格中垂直的列为表列,水平行为表行

39、主键
一列或一组列,其值能够唯一区分表中每个行,唯一标识表中每行的这个列或这组列为主键,用来表示一个特定的行

40、表中的任何列都可以作为主键,只要满足2个条件:
(1) 任意两列都不具有相同的主键值
(2) 每个行都必须具有一个主键值,主键列不允许有null

41、关于主键的好习惯:
(1)不更新主键列的值
(2)不重用主键列的值
(3)不在主键列中使用可能会更改的值

42、desc查看表结构,show create table查看建表语句

43、可以在mysql的命令行程序中执行 help show显示允许的show语句

44、sql语句不区分大小写,许多sql开发人员喜欢对所有的sql关键字使用大写,而对所有的列和表使用小写,使代码更易于阅读和调试

45、limit可以指定要检索的开始行和行数,select * from A limit 5,5,指的是返回从行5开始的5行

46、带一个值的limit总是从第一行开始,给出的数为返回的行数,带两个值的limit可以指定从行号为第一个值的位置开始

47、mysql5 支持limit的另一种语法为limit 4 offset 3,意为从行3开始取4行,等价于limit 3,4

48、desc只能应用到其后面的一个列,如果想在多个列上进行降序排序,就要对每个列指定desc关键字

49、字符串类型的值进行比较时需要使用单引号,数值类型的比较不需要

50、外键
为某个表中的一列,它包含另一个表的主键,定义了两张表之间的关系

51、在联结两张表的时候,你实际上做的是将第一个表中的每一行与第二个表中的每一行配对,where子句作为过滤条件,它只包含那些匹配给定条件的行

52、insert low_priority into可以降低insert语句的优先级,避免影响select的性能

53、需要主键自增的时候可以设定
cust_id int not null auto_increment,每张表只能建一个auto_increment且必须被索引

54、建表时可以为字段设置默认值
quanlity int not null default 1

55、数据库引擎
(1) InnoDB
可靠的事务处理引擎,它不支持全文本搜索

(2) MEMORY
在功能等同于MyISAM,但由于数据存储在内存中,速度很快,特别适合于临时表

(3) MyISAM
性能极高的引擎,支持全文本搜索,可能是最受欢迎的引擎

56、更新一个视图将更新其基表,如果对视图进行增加或删除行,实际上是对其基表增加或删除行

57、触发器是mysql响应insert update delete任意语句而自动执行的一条mysql语句,位于begin和end之间的一组语句,只有表才支持触发器,视图和临时表不支持

58、每个表最多支持6个触发器,insert update delete的之前和之后

59、标量就是单一的意思,标量子查询有一特殊的限制,就是必须而且只能返回1行1列的结果

60、能够使用常数或者列名的地方,无论是select子句、group by子句、having子句,还是order by子句,几乎所有的地方都可以使用标量子查询

61、在细分的组内进行比较时,需要使用关联子查询,且结合条件一定要写在子查询中

62、谓词包含
Like、between、is null 、is not null 、in、 exists

63、在like中使用_可以匹配任意1个字符

64、between会包含两个临界值,如果不想包含则要>和<

65、in 和not in是无法取出null的,终究还是要用is null is not null

66、exists只有一个参数,通常都会是一个子查询,只关心记录是否存在,因此返回哪些列都没有关系,所以作为exsits参数的子查询中经常使用select *

67、case表达式的语法分为简单case 表达式和搜索case表达式
简单case表达式只能对一列的值进行判断无法多列:
case <表达式>
when <表达式> then <表达式>

else <表达式>
end

case表达式的else子句可以省略不写,这时会默认为else null,但是防止漏读,还是显式写出来比较好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值