SQL查漏补缺学习笔记(二)高级部分

ps:本篇随笔以Oracle为前提!

1.返回前5行数据:

SQL server/MS Access:

select top 5 name from table;

MySQL:

select name from table limit 5;

Oracle:

select name from table where rownum<=5;

2.使用like进行模糊匹配时,如果想要返回不包括匹配字符的记录,直接在like前面加上not即可。

3.通配符补充:

%替代0或多个字符;
_替代一个字符;
[charlist]字符列中的任意一个字符
[^charlist]后者[!charlist]不在字符列中任意字符

使用[charlist]时,MySQL中用regexp或者not regexp来表示正则表达式。

eg.选取 name 以 "G"、"F" 或 "s" 开始的所有网站:

select * from websites where name regexp ‘^[GFs]‘;

选取 name 不以 A 到 H 字母开头的网站:

select * from websites where name regexp ^[^A-H];

4.注意使用in操作符时,后面的值都放在括号里并且用逗号隔开。

select * from websites where name in (Google,百度);

5.BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。

eg.选取age介于12-26之间的记录:

select * from table where age between 12 and 26;

选取name不在字母G到N之间的:

select * from table where name not between ‘G‘ and ‘N‘;

选取birthday在1998-01-01到1998-12-31之间的:

select * from table where birthday between1998-01-01‘ and1998-12-31‘;

6.SQL别名:涉及多张表时可以为表取别名,涉及列的改变时可以给列取别名。

eg.把三个列(name、age 和 sex)结合在一起,并创建一个名为 "stu_info" 的别名:

select concat(name,,,age,,,sex) as stu_info from table;

查找student表中学生的name,sex和course表中的cname,teacher:

select s.name,s.sex,c.cname,c.teacher from student s, course c where s.sid=c.sid;

7.SQL的JOIN:用on连接。

SQL查漏补缺学习笔记(二)高级部分

inner join 两张表中都匹配时才显示,有时也叫join;

left join 左表中的所有行都要显示,有时也叫left outer join;

right join 右表中的所有行都要显示,有时也叫rigth outer join;

full outer join 只要有一个表中有匹配就显示。

范围从小到大依次为:inner join < left join || right join < full outer join。

eg.返回所有学生的姓名,年龄和课程,如果学生没有课程则不显示该学生,没有学生选的课程也不显示。

select s.name,s.age,c.cname from student s inner join course c on s.sid=c.sid;

 8.SQL UNION 操作符合并两个或多个 SELECT 语句的结果,即取结果的并集。

使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的中国(CN)的数据(也有重复的值):

SELECT country, name FROM Websites
WHERE country=CN
UNION ALL
SELECT country, app_name FROM apps
WHERE country=CN
ORDER BY country;

注意:union 与union all的区别在于,union会去重,union all不会,所有的结果(包括重复结果)都会显示出来。

9.复制表select into from与insert into select的区别:

 select into from 要求目标表不存在,因为在插入时会自动创建;insert into select from 要求目标表存在。

复制多个表中的数据插入到新表中:

SELECT Websites.name, access_log.count, access_log.date
INTO WebsitesBackup2016
FROM Websites
LEFT JOIN access_log
ON Websites.id=access_log.site_id;

只复制id为1的 APP 到 "Websites" 中:

INSERT INTO Websites (name, country)
SELECT app_name, country FROM apps
WHERE id=1;

10.创建表create table,注意为小括号,字段先写字段名再写数据类型,里面的字段用逗号隔开,最后一个字段不用加逗号,括号外面加上分号。

CREATE TABLE Persons
(
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

11.SQL约束:

  • NOT NULL - 指示某列不能存储 NULL 值。
  • UNIQUE - 保证某列的每行必须有唯一的值。
  • PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
  • FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
  • CHECK - 保证列中的值符合指定的条件。
  • DEFAULT - 规定没有给列赋值时的默认值。

not null非空约束:

在创建表时添加非空约束:

create table person
(
sid
int not null, sname varchar(32) );

给已创建的表中某个字段添加非空约束:

alter table person
modify sname varchar(32) not null;

给已创建的表中某个字段删除非空约束:

alter table person
modify sname varchar(32) null;

unique唯一约束:

添加unique约束有两种,一种直接在字段后面加unique,一种定义CONSTRAINT uname UNIQUE(sid,sname)(适用于多个字段的约束)

create tavle student
(
sid int not null unique,
sname varchar(32)
);
create table student
(
sid int not null,
sname varchar(32),
constraint uc_stuId unique(sid,sname)
);

给已经创建的表添加unique约束:

alter table student
add unique(sid);
alter table student
add constraint uc_stuId(sid,sname);

如需撤销 UNIQUE 约束:

alter table student
drop constraint uc_stuId;

primary key与unique类似。

foreign key外键约束:要在foreign key后面加上references 父表(主键字段)

CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
)

check约束:在check后面的括号里加入约束条件即可

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City=Sandnes)
)

12.创建索引create index:

CREATE INDEX PIndex
ON Persons (LastName)

删除索引:

DROP INDEX PIndex

13.ALTER TABLE 语句用于在已有的表中添加、删除或修改列。

如需在表中添加列,请使用下面的语法:

ALTER TABLE table_name
ADD column_name datatype

如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):

ALTER TABLE table_name
DROP COLUMN column_name

要改变表中列的数据类型,请使用下面的语法:

ALTER TABLE table_name
MODIFY COLUMN column_name datatype

14.auto-increment自增长:

您必须通过 sequence 对象(该对象生成数字序列)创建 auto-increment 字段。

请使用下面的 CREATE SEQUENCE 语法:

CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10

上面的代码创建一个名为 seq_person 的 sequence 对象,它以 1 起始且以 1 递增。该对象缓存 10 个值以提高性能。cache 选项规定了为了提高访问速度要存储多少个序列值。

要在 "Persons" 表中插入新记录,我们必须使用 nextval 函数(该函数从 seq_person 序列中取回下一个值):

INSERT INTO Persons (ID,FirstName,LastName)
VALUES (seq_person.nextval,Lars,Monsen)

上面的 SQL 语句会在 "Persons" 表中插入一条新记录。"ID" 列会被赋值为来自 seq_person 序列的下一个数字。"FirstName"列 会被设置为 "Lars","LastName" 列会被设置为 "Monsen"。

15.SQL视图:

创建视图:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No

我们可以像这样查询上面这个视图:

SELECT * FROM [Current Product List]

16.SQL的null值处理:

SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NULL

如果 "UnitsOnOrder" 是 NULL,则不会影响计算,因为如果值是 NULL 则 ISNULL() 返回 0:

Oracle 没有 ISNULL() 函数。不过,我们可以使用 NVL() 函数达到相同的结果:

SELECT ProductName,UnitPrice*(UnitsInStock+NVL(UnitsOnOrder,0))
FROM Products

SQL查漏补缺学习笔记(二)高级部分

上一篇:数据库三范式是什么?


下一篇:Python数据库实践——自己设计大学排名