sql知识点简单梳理

 创建模式

create    schema test0402;

 use    test0402;

 创建表

createtable Course(

Cno    char(4) primary key,

Cname    char(40) ,

Cpno    char(4),

Ccredit    smallint,

foreignkey (Cpno) references Course(Cno));

 修改表

Alter table Student add S_entrance datetime;

alter table course add UNIQUE(Cname);

alter table course drop index Cname;

 删除

Droptable 表名cascade/restrict

Cascade删除没有限制,相关依赖全部删除

Restrict删除有条件限制,待删除的表不能有约束(check、foreign key等),不能有视图、触发器、存储过程或者函数等

drop database

truncate tabe tbalename(仅仅删除表格中的数据)

 约束

Not  null

建表时添加,create table ###(name_id cahr(52) not null...)

unique

(单个列)建表时添加,create table a (1,类型,列2,类型,...... unique(1));建表后,alter table a add unique(列2

2)多列且命名。建表时,create table a (1,类型,列2,类型,...... constraint c_person unique(1,列2) )

建表后,alter table 1 add constraint c_person unique(1,列2) )

(3)删除

alter table a drop index c_person

Primary key

(1)CREATE TABLE Persons

(......PRIMARY KEY (Id_P))

(2)CREATE TABLE Orders

(......CONSTRAINT pk_PerOrders PRIMARY KEY (Id_P))

(3)ALTER TABLE Orders

ADD PRIMARY KEY (Id_P)

(4)ALTER TABLE Orders

ADD CONSTRAINT pk_PerOrders

PRIMARY KEY (Id_P)

(5)ALTER TABLE Orders

DROP PRIMARY KEY pk_PerOrders

Foreign key 

(1)CREATE TABLE Orders

(....FOREIGN KEY (Id_P) REFERENCES Persons(Id_P))

(2)CREATE TABLE Orders

(......CONSTRAINT fk_PerOrders FOREIGN KEY (Id_P)

REFERENCES Persons(Id_P))

(3)ALTER TABLE Orders

ADD FOREIGN KEY (Id_P)

REFERENCES Persons(Id_P)

(4)ALTER TABLE Orders

ADD CONSTRAINT fk_PerOrders

FOREIGN KEY (Id_P)

REFERENCES Persons(Id_P)

(5)ALTER TABLE Orders

DROP FOREIGN KEY fk_PerOrders

check

对特定列进行约束其取值范围

(1)CREATE TABLE Persons

(

...

CHECK (Id_P>0)

)

(2)ALTER TABLE Persons

ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')

(3)ALTER TABLE Persons

DROP CHECK chk_Person

default

插入默认值

(1)CREATE TABLE Persons

(

......,

City varchar(255) DEFAULT 'Sandnes'

)

(2)ALTER TABLE Persons

ALTER City SET DEFAULT 'SANDNES'

(3)ALTER TABLE Persons

ALTER City DROP DEFAULT

 

索引

carete index on tbalename(colname)

create unique indec on tablename(colname)

CREATE INDEX PersonIndex
ON Person (LastName, FirstName)

alter table tablename drop index indexname


 查询

Select[distinct/all(默认all)] 列/列/列 from 表名/视图名

 [where 条件表达式]

[gruopby 列名[having 条件表达式]]

group by 分组,having 控制分组条件,用COUNT()函数和GROUP BY语句可以统计同一值的记录条数

[orderby 列名[ASC(默认升序)/desc]]

 查询条件

(1)确定范围

between下限 and 上限 (两端都包含)

Notbetween 下限 and 上限

(2)比较大小

=,>,<,<>(不等于),!=,>=,<=,!>(不大于),!<(不小于)

(3)确定集合

In和 not in

(4)字符匹配

notlike/Like <匹配串>[escape<换码字符串>]

% 任意长度的字符串
_ 任意单个字符串
[charlist] 字符列中的任何单一字符
[^charlist]
或者
[!charlist]
不在字符列中的任何单一字符

一个汉字占两个字符的位置

***like‘db|_d’escape ‘\

查询db_d的相关信息,用escape声明’\’后的只是普通字符,不具有通配符含义

(5)涉及空值的查询

Select*from sc where  grade is null(is notnull)

(6)     多重条件查询

And 和or连接多个查询条件。And优先级较高

(7)where后避免对字段进行函数操作,否则会使字段上的索引失效,全表扫描,降低查询速度

 Order by

按照查询结果对多个属性列排序(升序asc默认/降序desc)

空值,升序在后,降序最先显示

聚集函数

注意:where 后不可以跟聚集函数作为条件表达式

除了count(*),其他都跳过空值不处理

count([distinct|all] *)

统计元组个数

count([distinct|all]  列名)

统计一列中值得个数

Sum([distinct|all]  列名)

求和(数值型)

AVG([distinct|all]  列名)

求平均(数值型)

max([distinct|all]  列名)

最大值

min([distinct|all]  列名)

最小值

 Group by字句

将查询结果按一列或多列的值分组,值相等的为一组

分组后,聚集函数将作用于每一组。否则,作用于整个查询结果

Where 和 having的区别:

Where作用于基本表或者视图,选择满足条件的元组;

Having 作用于组,选择满足条件的组

 连接查询

等值与非等值

等值 =

非等值 不是=

自身连接

自己和自己

外连接

左外连接(列出左边全部,右边缺失的填补null)

Left outer join

右外连接(列出右边全部,左边缺失的填补null)

Right outer join

复合连接

Where后面跟多个连接条件

 嵌套查询

(1)

上层查询:父查询或者外层查询

下层查询:子查询或者内层查询

子查询中不能使用order by,order by只能对最终查询结果排序

有些嵌套查询可以用连接运算替代

(2)

不相关子查询:子查询的查询条件不依赖与父查询(一下子将子查询求解出来)

相关子查询:子查询的查询条件依赖于父查询(反复求值,先取父查询中的一个元组,遍历内层查询,再从外层查询中取出一个元组,遍历内层查询。。。)

(3)带有any/some/all的子查询:

子查询跟在比较运算符之后,只有返回的是单值的时候可以用比较运算符

返回多值时,要用any(有些用some)或者all,且和比较运算符搭配使用

 

(4)带有exists的子查询

返回true或者false,只关心内层操作是否有返回值

in和exists  

in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。  

如果查询的两个表大小相当,那么用in和exists差别不大。  

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in: 

如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。  not in 逻辑上不完全等同于not exists,如果你误用了not in,小心你的程序存在致命的BUG: 

 (6)集合查询

Uninon 并集 uninon all 并集,保留重复值

Intersect 交集

Except 差操作

猜你喜欢

转载自blog.csdn.net/brave_jcc/article/details/79796282