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 between ‘1998-01-01‘ and ‘1998-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连接。
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