SQL简单使用-进阶篇
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL简单使用-进阶篇相关的知识,希望对你有一定的参考价值。
与上一篇的《SQL简单使用-基础篇》相连续的篇章,《SQL简单使用-基础篇》以下简称《基础篇》。在《基础篇》中,主要简单的带大家了解一下SQL命令中最主要的增删改查命令的使用,增INSERT INTO、删DETELE/DROP/TRUNCATE、改UPDATE、查SELECTE。因为增删改查是SQL命令的核心也是最基础的部分,所以本篇张还是围绕增删改查的使用进行进阶性的介绍与使用。
先从《基础篇》中提到的where子句里面的通配符讲起。
1.like 用于在where子句中搜索列中的指定模式
示例:select * from websites where name like ‘%oo%‘;
注:(%分号表示任意数据,_表示任意一个数据,动手练两边就能熟悉)
‘G%‘ 搜索以G开头的数据
‘%G‘ 搜索以G结尾的数据
‘%g%‘ 搜索包含g的数据
‘G‘ 搜索以G开头的两位数据
‘G‘ 搜索以G结尾的两位数据
‘G‘ 搜索包含G的三位数据
1.1 通配符还有一种(%、_和[charlist])
示例:[charlist]使用select * from websites where name REGEXP ‘^[A-H]‘;
2.between 用于选取介于两个值之间的数据范围内的值
示例:select * from websites where alexa between 1 and 20;
示例:添加not使用select * from websites where alexa not between 1 and 20;
示例:结合IN使用select * from websites where ( alexa BETWEEN 1 and 20) and country in (‘USA‘,‘CN‘);
示例:文本select * from websites where name between ‘A‘ and ‘H‘; 不包含H
3.top 用于规定返回记录的数据,实用
示例:SQL server (SELECT TOP number|percent column_name(s) FROM table_name;)select top 50 percent * from websites;
示例:Oracle(SELECT column_name(s) FROM table_name WHERE ROWNUM <= number;)select * from websites where ROWNUM <5;
示例:mysql (SELECT column_name(s) FROM table_name LIMIT number;)select * from websites limit 3;
4.IN 操作符允许在where子句中规定多个值
示例:查看表websites中name列的多条数据select * from websites where name in(‘baidu‘,‘Google‘);
5.别名 可以为表名称或列名称指定别名。
语法:列名称语法
SELECT column_name AS alias_name FROM table_name;
示例:select name AS n,country AS c from websites;
语法:表名称语法
SELECT column_name(s) FROM table_name AS alias_name;
示例:select w.name,w.url,a.count,a.date from websites AS w ,access_log AS a where w.id=a.site_id and w.name=‘菜鸟教程‘;
注:
1.在查询中涉及超过一个表
2.在查询中都是用了函数
3.列名称很长或者可读性差 都需要把两个列或者多个列结合在一起。
6.join 子句用于把来自两个表或者多个表的行结合起来,基于这些表之间的共同字段
join类型有一下几种:
INNER JOIN:如果表中有至少一个匹配,则返回行
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,则返回行(MYSQL不支持)
首先,连接的结果可以在逻辑上看作是由SELECT语句指定的列组成的新表。
左连接与右连接的左右指的是以两张表中的哪一张为基准,它们都是外连接。
外连接就好像是为非基准表添加了一行全为空值的万能行,用来与基准表中找不到匹配的行进行匹配。假设两个没有空值的表进行左连接,左表是基准表,左表的所有行都出现在结果中,右表则可能因为无法与基准表匹配而出现是空值的字段。
来源:《数据库系统原理教程》,王珊,陈红编著,P86
示例: inner join
SELECT
websites.id,
websites.NAME,
access_log.count,
access_log.date
FROM
websites
INNER JOIN access_log ON websites.id = access_log.site_id;
7.union 用于合并两个或多个select语句的结果集
语法:
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
示例: union 去重
SELECT country FROM Websites
UNION
SELECT country FROM apps
ORDER BY country;
示例:union all 显示所有包括重复部分
select country from websites
union all
select country from apps;
示例:带有where的union all
select country,name from websites where country=‘CN‘
union all
select country,app_name from apps where country=‘CN‘ order by country;
- into 从一个表复制数据,把数据插入到另一个新表中
注:MySQL 数据库不支持 SELECT ... INTO 语句,但支持 INSERT INTO ... SELECT 。
语法: 复制所有的列插入新表中SELECT * INTO newtable [IN externaldb] FROM table1;
语法:只复制希望的列插入到新表中SELECT column_name(s) INTO newtable [IN externaldb] FROM table1;
8.1 insert into select
示例:复制 "apps" 中的数据插入到 "Websites" 中:INSERT INTO websites (name,country) select app_name,country from apps;
- create 用于创建数据库或者数据表
语法:创建数据库create database db_name;
语法:创建数据表create table table_name ( column_name1 data_type(size), column_name2 data_type(size), column_name3 data_type(size), ... ... ); date_type 数据类型,size参数规定表中列的最大长度
示例:创建名称为runoob的数据库create database runoob;
示例:创一个student_informaton表,包含五列:student_id,student_name,student_class,student_tele,student_add
create table student_infomation
(
student_id int(10),
student_name char(4),
student_class char(10),
student_tele int(11),
student_add varchar(255)
);
前面是列名,后面跟的是对于列名的数据类型
10.约束 用于规定表中的数据规则
约束可以在创建表的时候通过create table语句规定,或者在表创建之后通过alter table语句规定
语法:crate table + constraint
create table table_name
(
column_name1 type_data(size) constraint,
column_name2 type_data(size) constraint,
column_name3 type_data(size) constraint,
... ...
);
在SQL中,我们有如下约束:
NOT NULL 指示某列不能存储 NULL 值,强制字段始终包含值,否则就无法插入新记录或者更新记录。
UNIQUE 保证某列的每行必须有唯一的值。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK 保证列中的值符合指定的条件。
DEFAULT 规定没有给列赋值时的默认值。
10.1 not null约束 约束强制不接受到任何null值
示例: student_tele不能为空
create table student_information (
student_id INT (10) ,
student_name CHAR (4),
student_class CHAR (10),
student_tele INT (11) NOT NULL,
student_add VARCHAR (255)
);
10.2 UNIQUE 约束唯一标识数据库表中的每条记录。
UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。
请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。
示例:MYSQL
create table student_information (
student_id INT (10),
student_name CHAR (4),
student_class CHAR (10),
student_tele INT (11),
student_add VARCHAR (255),
unique (student_id)
);
示例:SQL server/oracle
create table student_information (
student_id int (10) NOT NULL UNIQUE,
student_name CHAR (4),
student_class CHAR (10),
student_tele INT (11),
student_add VARCHAR (255),
);
示例:SQL mysql/server/oracle 定义过个列的unique约束。
create table student_information (
student_id int (10) NOT NULL UNIQUE,
student_name CHAR (4),
student_class CHAR (10),
student_tele INT (11),
CONSTRAINT stu_inf UNIQUE (student_id,student_name)
); 这里的 stu_inf 为约束名称constraint_name,自定义。
alter table时的unique约束
示例:
alter table student_information
add unique (student_id);
示例:添加多个unique,
alter table student_information
add constraint stu_inf unique (student_id,student_add);
撤销unique约束
示例:mysql
alter table student_information
drop index stu_inf;
示例:SQL
alter table student_information
drop constraint stu_inf;
10.3 primary key 主键必须包含唯一的值,主键不能为null,每个表都应该有一个主键,并且是唯一的。
示例:参照unique,将其中的unique替换为 primary key即可。 上述有添加多个unique示例,如果改为primary 可以意思就是主键由添加的几个列组成。
10.4 foreign key 约束
a.可以用来预防破坏表之间连接的行为
b.防止非法数据插入外键列,因为它必须是指向的那个表中的值之一
示例:MYSQL
create table websites(
id int(11) NOT NULL,
name char(20) NOT NULL,
url varchar(255) NOT NULL,
alexa int(11) NOT NULL,
country char(10) NOT NULL,
primary key (id),
foreign KEY (id) references apps(id)
);
示例:SQL server/oracle
CREATE TABLE websites
(
Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
Id int FOREIGN KEY REFERENCES apps(Id)
);
示例:MySQL/SQL Server/Oracle
CREATE TABLE websites
(
Id int NOT NULL,
OrderNo int NOT NULL,
Id int,
PRIMARY KEY (O_Id),
CONSTRAINT fk_PerOrders FOREIGN KEY (Id)
REFERENCES apps(Id)
);
alter table 使用foreign key约束
示例:
ALTER TABLE Orders
ADD FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
示例:如需命名 FOREIGN KEY 约束,并定义多个列的 FOREIGN KEY 约束
ALTER TABLE Orders
ADD CONSTRAINT fk_PerOrders
FOREIGN KEY (P_Id)
REFERENCES Persons(P_Id)
撤销FOREIGN KEY约束
示例:mysql
alter table Orders drop index fk_PerOrders;
示例:SQL
alter table Orders drop constraint fk_PerOrders;
10.5 CHECK 约束
用于限制列中的值的范围
示例:MYSQL
create table websites(
id int(11) NOT NULL,
name char(20) NOT NULL,
url varchar(255) NOT NULL,
alexa int(11) NOT NULL,
country char(10) NOT NULL,
check (id>0)
);
alter table 使用check约束alter table websites add check (id>0);
撤销check约束(参照unique约束中的alter table)alter table websites drop check constraint_name;
10.6 DEFAULT 约束
1.用于向列中插入默认值
2.如果没有规定其它值,那么将默认值添加到所有的记录
示例:MYSQL
create table student_information (
student_id INT (10) NOT NULL,
student_name CHAR (4),
student_class CHAR (10) DEFAULT ‘‘ comment ‘班级‘,
student_tele INT (11),
student_add VARCHAR (255)
); comment 是为 字段或列的属性添加注释用的
alter table 使用 default
示例:MYSQL
alter table websites
alter country set default ‘CN‘;
示例:SQL serveralter table websites add constraint ad_c default ‘CN‘ for country;
示例:oraclealter table websites modify country default ‘CN‘;
撤销default约束
示例:MYSQL
alter table websites
alter country drop default;
示例:SQL server/oracle
alter tables websites
alter column country drop default;
- create index 用于在表中创建索引
在表中创建索引可以更高效的查询数据,用户无法查看到索引,他们只能被用来加速搜索/查询。
注:更新一个包含索引的表所耗费的时间比没有索引表的时间更长,这是由于索引本身也需要更新。因此,理想的做法是仅仅在尝尝被所有的列(及表)上面创建索引。
语法:创建一个简单的索引,允许使用重复的值create index index_name ON table_name (column_name);
语法:在表中创建唯一的索引,不允许使用重复的值(create unique table):唯一的索引意味着两个行不能拥有相同的索引值。create UNIQUE index index_name ON table_name (column_name);
示例:将websites表中name列中创建名为web_index的索引。create index web_index ON websites (name);
12.drop 可以删除表,索引和数据库
DROP INDEX 语句用于删除表中的索引。
用于 SQL Server 的 DROP INDEX 语法:DROP INDEX table_name.index_name
用于 DB2/Oracle 的 DROP INDEX 语法:DROP INDEX index_name
用于 MySQL 的 DROP INDEX 语法:ALTER TABLE table_name DROP INDEX index_name
DROP TABLE 语句用于删除表。
DROP DATABASE 语句用于删除数据库。
仅仅需要删除表内的数据,但并不删除表本身TRUNCATE TABLE table_name
13.ALTER TABLE 用于在已有的表中添加、删除或修改列。
添加列的语法:ALTER TABLE table_name ADD column_name datatype;
删除表中的列语法:ALTER TABLE table_name DROP COLUMN column_name datatype;
改变表中数据类型语法:ALTER TABLE table_name MODIFY COLUMN column_name datatype;
示例: 在website表中添加名为column_date的列,然后修改列的数据类型,删除添加的列
alter table websites add column_date date; 添加
alter table websites modify column column_date year;修改
alter table websites drop column column_date; 删除
参考菜鸟教程请添加链接描述整理的笔记
以上是关于SQL简单使用-进阶篇的主要内容,如果未能解决你的问题,请参考以下文章
Linq To Sql进阶系列用object的动态查询与保存log篇