SQL语句学习笔记一

主键

主键 (Primary Key) 中的每一笔资料都是表格中的唯一值。换言之,它是用来独一无二地确认一个表格中的每一行资料。主键可以是原本资料内的一个栏位,或是一个人造栏位 (与原本资料没有关系的栏位)。主键可以包含一或多个栏位。当主键包含多个栏位时,称为组合键 (Composite Key)

以下举几个在建置新表格时设定主键的方式:

 

MySQL:

CREATE TABLE Customer

(SID integer,

Last_Name varchar(30),

First_Name varchar(30),

PRIMARY KEY (SID));

 

Oracle:

CREATE TABLE Customer

(SID integer PRIMARY KEY,

Last_Name varchar(30),

First_Name varchar(30));

 

SQL Server:

CREATE TABLE Customer

(SID integer PRIMARY KEY,

Last_Name varchar(30),

First_Name varchar(30));

 

以下则是以改变现有表格架构来设定主键的方式:

 

MySQL:

ALTER TABLE Customer ADD PRIMARY KEY (SID);

 

Oracle:

ALTER TABLE Customer ADD PRIMARY KEY (SID);

 

SQL Server:

ALTER TABLE Customer ADD PRIMARY KEY (SID);

 

请注意,在用ALTER TABLE语句来添加主键之前,我们需要确认被用来当做主键的栏位是设定为 NOT NULL ;也就是说,那个栏位一定不能没有资料。

 

外来键

外来键是一个(或数个)指向另外一个表格主键的栏位。外来键的目的是确定资料的参考完整性(referential integrity)。换言之,只有被准许的资料值才会被存入资料库内。

 

举例来说,假设我们有两个表格:一个 CUSTOMER 表格,里面记录了所有顾客的资料;另一个 ORDERS 表格,里面记录了所有顾客订购的资料。在这里的一个限制,就是所有的订购资料中的顾客,都一定是要跟在 CUSTOMER 表格中存在。在这里,我们就会在 ORDERS 表格中设定一个外来键,而这个外来键是指向 CUSTOMER 表格中的主键。这样一来,我们就可以确定所有在 ORDERS 表格中的顾客都存在 CUSTOMER 表格中。换句话说,ORDERS表格之中,不能有任何顾客是不存在于 CUSTOMER 表格中的资料。

 

这两个表格的结构将会是如下:

 

CUSTOMER 表格 栏位名 性质

SID 主键

Last_Name 

First_Name 

 

 

ORDERS 表格 栏位名 性质

Order_ID 主键

Order_Date 

Customer_SID 外来键

Amount 

 

在以上的例子中,ORDERS 表格中的 customer_SID 栏位是一个指向 CUSTOMERS 表格中 SID 栏位的外来键。

 

以下列出几个在建置 ORDERS 表格时指定外来键的方式:

 

MySQL:

CREATE TABLE ORDERS

(Order_ID integer,

Order_Date date,

Customer_SID integer,

Amount double,

Primary Key (Order_ID),

Foreign Key (Customer_SID) references CUSTOMER(SID));

 

Oracle:

CREATE TABLE ORDERS

(Order_ID integer primary key,

Order_Date date,

Customer_SID integer references CUSTOMER(SID),

Amount double);

 

SQL Server:

CREATE TABLE ORDERS

(Order_ID integer primary key,

Order_Date datetime,

Customer_SID integer references CUSTOMER(SID),

Amount double);

 

以下的例子则是藉着改变表格架构来指定外来键。这里假设 ORDERS 表格已经被建置,而外来键尚未被指定:

 

MySQL:

ALTER TABLE ORDERS

ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);

 

Oracle:

ALTER TABLE ORDERS

ADD (CONSTRAINT fk_orders1) FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);

 

SQL Server:

ALTER TABLE ORDERS

ADD FOREIGN KEY (customer_sid) REFERENCES CUSTOMER(sid);

 

创建表

CREATE TABLE customer

(First_Name char(50),

Last_Name char(50),

Address char(50),

City char(50),

Country char(25),

Birth_Date date)

 

Create table a as select * from  b 可以看做复制表b,表属性没有复制

 

创建视图

CREATE VIEW V_Customer

AS SELECT First_Name, Last_Name, Country

FROM Customer

 

创建索引

CREATE INDEX IDX_CUSTOMER_LAST_NAME

on CUSTOMER (Last_Name)

 

添加字段

ALTER table customer add Gender char(1)

 

修改字段名称

ALTER table customer change Address Addr char(50)

 

修改字段类型

ALTER table customer modify Addr char(30)

 

删除字段

ALTER table customer drop Gender

 

 

常见的SQL函数

AVG (平均)

COUNT (计数)

MAX (最大值)

MIN (最小值)

SUM (总合)

 

字符连接

MySQL: CONCAT()

Oracle: CONCAT(), ||

SQL Server: +

 

截取字符串

MySQL: SUBSTR(), SUBSTRING()

Oracle: SUBSTR()

SQL Server: SUBSTRING()

去掉空格

MySQL: TRIM(), RTRIM(), LTRIM()

Oracle: RTRIM(), LTRIM()

SQL Server: RTRIM(), LTRIM()

 

 

集合操作

INTERSECT

相对与UNION来说,就是两个集合的交集

 

MINUS 

A MINUS B 表示在A集合去掉B集合

 

 

Having子句

HAVING 子句通常是在一个 SQL 句子的最后。一个含有 HAVING 子句的 SQL 并不一定要包含 GROUP BY 子句。HAVING 的语法如下:

SELECT "栏位1", SUM("栏位2")

FROM "表格名"

GROUP BY "栏位1"

HAVING (函数条件) S

 

SELECT store_name, SUM(sales)  FROM Store_Information  GROUP BY store_name  HAVING SUM(sales) > 1500

 

 

DDL语句对数据库对象如表、列和视进行定义。它们并不对表中的行进行处理,这是因为DDL语句并不处理数据库中实际的数据。这些工作由另一类SQL语句数据操作语言(DML)语句进行处理。

 


假设有如下表:


一个为投票主表,一个为投票者信息表~记录投票人IP及对应投票类型,左右连接实际说是我们联合查询的结果以哪个表为准~
1
:如右接连 right join right outer join

我们以右边voter表为准,则左表(voteMaster)中的记录只有当其ID在右边(voter)中存在时才会显示出来,如上图,左边中ID3.4.5.6因为这些ID右表中没有相应记录,所以没有显示!


2
:因此我们自然能理解左连接 left join 或者 left outer join

可见,现在右边中ID在中存在时才会显示,当右边中没有相应数据时则用NULL代替!


3
:全连接 full join 或者 full outer join,为二个表中的数据都出来,这里演示效果与上一样!
4
:内连接 inner join 或者 join;它为返回字段ID同时存在于表voteMaster voter中的记录

5
:交叉连接(完全连接)cross join 不带 where 条件的
没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1table2交叉连接产生6*3=18条记录).

等价select vm.id,vm.voteTitle,vt.ip from voteMaster as vm,voter as vt

6:
自连接。

如下表:



这是一个部门表,里面存放了部门及其上级部门,但都放在同一张表中,我们假设现在需要用SQL查询出各部门及其上级部门!就如何做,
当然,不用自连接也一样,可以如下:

我们达到预期目的!在这个查询中使用了一个子查询完成对上级部门名的查询,如果使用自连接,那么结构上感觉会清晰很多。

是不是也同样完成了功能呢,这里除了使用自连接外,还使用了左连接,因为省电力没有上级部门,他是老大,如果使用内连接,就会把这条记录过滤掉,因为没有和他匹配的上级部门。
自连接用的比较多的就是对权形结构的查询!类似上表!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值