SQL总结
1.SQL的简介
SQL是用于访问和处理数据库的标准的计算机语言。
2.什么是SQL?
SQL-->指结构化查询语言
SQL-->可以访问和处理数据库
SQL-->是一种ANSI(美国国家标准化组织)标准的计算机语言
3.SQL可以做什么?
1) SQL 面向数据库执行查询-- 2)SQL 可从数据库取回数据 --3)SQL 可在数据库中插入新的记录 --4)SQL 可更新数据库中的数据
--5)SQL 可从数据库删除记录 --6)SQL 可创建新数据库 -- 7) SQL 可在数据库中创建新表 --8)SQL 可在数据库中创建存储过程
--9)SQL 可在数据库中创建视图 --10)SQL 可以设置表、存储过程和视图的权限
SQL语句主要分类
(1)DDL:Data Definition Languages,数据定义语言,常用的语句关键字主要包括create、drop、alter等;
(2)DML:Data Manipulation Language,数据操作语句,常用的语句关键字主要包括insert、delete、update和select等;
(3)DCL:Data Control Language,数据控制语言,常用的语句关键字包括grant、revoke等。
4. SQL SELECT语句 (SELECT 语句用于从数据库中选取数据)
语法: select * from 表名;(查询全部) SELECT column_name,column_name FROM 表名;(查询具体的列)
5.SQL SELECT DISTINCT 语句(SELECT DISTINCT 语句用于返回唯一不同的值)
语法:SELECT DISTINCT column_name,column_name FROM 表名;
6.SQL WHERE 子句(WHERE 子句用于过滤记录)
语法: SELECT column_name,column_name FROM 表名 WHERE column_name operator value;
ps:条件的值如果是数值字段,请不要使用引号。文本则使用引号。
6-1.WHERE 子句中的运算符
= 等于
<>不等于。注释:在 SQL 的一些版本中,该操作符可被写成 !=
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式
IN 指定针对某个列的多个可能值
6-2.Where 子句
Where +条件(筛选行) 比较运算符包涵:= > < >= ,<=, !=,<> 表示(不等于)-->Select * from emp where ename='SMITH';
逻辑运算
And:与 同时满足两个条件的值-->Select * from emp where sal > 2000 and sal < 3000;
Or:或 满足其中一个条件的值-->Select * from emp where sal > 2000 or comm > 500;
Not:非 满足不包涵该条件的值。-->select * from emp where not sal > 1500;
特殊条件
is null:空值判断-->Select * from emp where comm is null;
between and :在之间的值-->Select * from emp where sal between 1500 and 3000;
NOT BETWEEN: 不在之间的值-->Select * from emp where sal not between 1500 and 3000;
in : 允许在 WHERE 子句中规定多个值-->Select * from emp where sal in (5000,3000,1500);
Like:模糊查询-->Select * from emp where ename like 'M%';
% 表示多个字值,_ 下划线表示一个字符;
M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。
%M% : 表示查询包含M的所有内容。
%M_ : 表示查询以M在倒数第二位的所有内容。
7.SQL ORDER BY 关键字(ORDER BY 关键字用于对结果集进行排序)
语法: SELECT column_name,column_name FROM 表名 ORDER BY column_name,column_name ASC|DESC;
PS: ASC: 是升序的意思 默认是升序
DESC: 是降序的意思
8.SQL INSERT INTO 语句(INSERT INTO 语句用于向表中插入新记录)
语法:1)形式无需指定要插入数据的列名,只需提供被插入的值即可-->INSERT INTO 表名 VALUES (value1,value2,value3,...);
2)需要指定列名及被插入的值-->INSERT INTO 表名 (column1,column2,column3,...) VALUES (value1,value2,value3,...);
9.SQL UPDATE 语句(UPDATE 语句用于更新表中的记录)
语法:UPDATE 表名 SET column1=value1,column2=value2,... WHERE some_column=some_value;
PS:如果我们省略了 WHERE 子句 执行起来将会把表中所有的数据修改
10.SQL DELETE 语句(DELETE 语句用于删除表中的记录)
语法:DELETE FROM 表名 WHERE some_column=some_value;
------------------------------------------高级SQL-----------------------------------------------------
1.SQL SELECT TOP, LIMIT, ROWNUM 子句(SELECT TOP 子句用于规定要返回的记录的数目)
语法: SELECT TOP number|percent column_name(s) FROM 表名;
等价于:MYSQL语法-->SELECT column_name(s) FROM 表名 LIMIT number;
Oracle语法-->SELECT column_name(s) FROM 表名 WHERE ROWNUM <= number;
2.SQL 通配符 (通配符可用于替代字符串中的任何其他字符) 在 SQL 中,通配符与 SQL LIKE 操作符一起使用。
% 替代 0 个或多个字符 -->SELECT * FROM 表名 WHERE url LIKE 'https%'; (选取 url 以字母 "https" 开始的所有网站:)
_ 替代一个字符 -->SELECT * FROM 表名 WHERE name LIKE '_oogle';(选取 name 以一个任意字符开始,然后是 "oogle" 的所有客户:)
[charlist] 字符列中的任何单一字符 -->SELECT * FROM 表名 WHERE name REGEXP '^[GFs]';(选取 name 以 "G"、"F" 或 "s" 开始的所有网站)
[^charlist] 或 [!charlist] 不在字符列中的任何单一字符 -->SELECT * FROM 表名 WHERE name REGEXP '^[^A-H]';(选取 name 不以 A 到 H 字母开头的网站)
3.SQL别名(可以为表名称或列名称指定别名)
语法:SELECT column_name(s) AS alias_name1 FROM table_name AS alias_name2;
使用情况: 1)在查询中涉及超过一个表
2)在查询中使用了函数
3)列名很长或者可读性差
4)需要把两个列或者多个列结合在一起
4. SQL 连接(JOIN) (SQL join 用于把来自两个或多个表的行结合起来)
4.1.不同的 SQL JOIN
INNER JOIN:如果表中有至少一个匹配,则返回行 -->语法:SELECT column_name(s) FROM table1 INNER JOIN table2 ON table1.column_name=table2.column_name;
LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行 -->语法: SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_name=table2.column_name;
PS:在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。
RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行 -->语法:SELECT column_name(s) FROM table1 RIGHT JOIN table2 ON table1.column_name=table2.column_name;
FULL JOIN:只要其中一个表中存在匹配,则返回行。 -->语法:SELECT column_name(s) FROM table1 FULL OUTER JOIN table2 ON table1.column_name=table2.column_name;
5.SQL UNION 操作符(SQL UNION 操作符合并两个或多个 SELECT 语句的结果)
语法:union连接两个表的查询结果集,重复的不显示--> select country from 表1 union select country from 表2;
union all连接俩个个表的查询结果集,显示重复--> select country from 表1 union all select country from 表2 order by country;
6.SQL SELECT INTO 语句(SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中)
语法:SELECT * INTO 表名 FROM table1;-->复制所有的列插入到新表中
SELECT column_name(s) INTO 表名 FROM table1; -->复制指定的列插入到新表中
7.SQL INSERT INTO SELECT 语句(INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中)
语法:INSERT INTO 表2 SELECT * FROM 表1; -->从一个表里面复制所有的列插入到另一个已存在的表中
INSERT INTO 表2 (column_name(s)) SELECT column_name(s) FROM 表1; -->只复制指定的列插入到另一个已存在的表中
8. 创建之前判断该数据库是否存在
if exists (select * from sysdatabases where name='databaseName')
drop database databaseName
go
Create DATABASE database-name
1)CREATE DATABASE 语句用于创建数据库。-->CREATE DATABASE dbname;
2)CREATE TABLE 语句用于创建数据库中的表
判断表是否存在
if exists(select * from dbo.sysobjects where id = object_id(N’ [dbo].[表名]’) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
-- 删除表
drop table [dbo].[表名]
GO
语法:CREATE TABLE table_name
(
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
....
);
3)SQL 约束(Constraints)SQL 约束用于规定表中的数据规则
3).1 NOT NULL - 指示某列不能存储 NULL 值。
语法: 语法:CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)
3).2 UNIQUE - 保证某列的每行必须有唯一的-->PS:一张表里面可以有多个UNIQUE约束,但只可拥有一个PRIMARY KEY约束。
3).2.1 当表被创建的时候:
在SQL SERVER/ORACLE:
CREATE TABLE Persons
(
P_Id int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
)
在MYSQL中:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
UNIQUE (P_Id)
)
命名UNIQUE约束,定义多个列的UNIQUE约束,在MySQL / SQL Server / Oracle中:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName)
)
3)2.2当表创建完的时候:
在MySQL / SQL Server / Oracle 中:
ALTER TABLE Persons ADD UNIQUE (P_Id) -->未命名
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName) -->命名
3)2.3 删除UNIQUE约束
在MYSQL中:
ALTER TABLE Persons DROP INDEX uc_PersonID
在SQL Server / Oracle 中:
ALTER TABLE Persons DROP CONSTRAINT uc_PersonID
3).3 PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。
3).3.1 当表被创建的时候:
在SQL SERVER/ORACLE:
CREATE TABLE Persons
(
P_Id int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
)
在MYSQL中:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
PRIMARY KEY (P_Id)
)
命名PRIMARY KEY约束,定义多个列的PRIMARY KEY约束,在MySQL / SQL Server / Oracle中:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
3)3.2当表创建完的时候:
在MySQL / SQL Server / Oracle 中:
ALTER TABLE Persons ADD PRIMARY KEY (P_Id) -->未命名
ALTER TABLE Persons ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName) -->命名
3)3.3 删除PRIMARY KEY约束
在MYSQL中:
ALTER TABLE Persons DROP PRIMARY KEY
在SQL Server / Oracle 中:
ALTER TABLE Persons DROP CONSTRAINT pk_PersonID
3).4 FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
3).4.1 当表被创建的时候:
在MYSQL中:
CREATE TABLE Orders
(
O_Id int NOT NULL,
OrderNo int NOT NULL,
P_Id int,
PRIMARY KEY (O_Id),
FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)
)
在SQL SERVER/ORACLE:
CREATE TABLE Orders
(
O_Id int NOT NULL PRIMARY KEY,
OrderNo int NOT NULL,
P_Id int FOREIGN KEY REFERENCES Persons(P_Id)
)
命名FOREIGN KEY 约束,定义多个列的FOREIGN KEY 约束,在MySQL / SQL Server / Oracle中:
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)
)
3)4.2当表创建完的时候:
在MySQL / SQL Server / Oracle 中:
ALTER TABLE Orders ADD FOREIGN KEY (P_Id) REFERENCES Persons(P_Id) -->未命名
ALTER TABLE Orders ADD CONSTRAINT fk_PerOrders FOREIGN KEY (P_Id) REFERENCES Persons(P_Id) -->命名
3)4.3 删除FOREIGN KEY约束
在MYSQL中:
ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders
在SQL Server / Oracle 中:
ALTER TABLE Orders DROP CONSTRAINT fk_PerOrders
3).5 CHECK - 保证列中的值符合指定的条件。
3).5.1 当表被创建的时候:
在MYSQL中:
CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
CHECK (P_Id>0)
)
在SQL SERVER/ORACLE:
CREATE TABLE Persons
(
P_Id int NOT NULL CHECK (P_Id>0),
City varchar(255)
)
命名 CHECK 约束,定义多个列的 CHECK 约束,在MySQL / SQL Server / Oracle中:
CREATE TABLE Persons
(
P_Id int NOT NULL,
City varchar(255),
CONSTRAINT chk_Person CHECK (P_Id>0 AND City='China')
)
3)5.2当表创建完的时候:
在MySQL / SQL Server / Oracle 中:
ALTER TABLE Persons ADD CHECK (P_Id>0)-->未命名
ALTER TABLE Persons ADD CONSTRAINT chk_Person CHECK (P_Id>0 AND City='Sandnes') -->命名
3)5.3 删除CHECK约束
在MYSQL中:
ALTER TABLE Persons DROP CHECK chk_Person
在SQL Server / Oracle 中:
ALTER TABLE Persons DROP CONSTRAINT chk_Person
3).6 DEFAULT - 规定没有给列赋值时的默认值。
3).6.1 当表被创建的时候:
在MYSQL/SQL SERVER/ORACLE中:
CREATE TABLE Persons
(
P_Id int NOT NULL,
City varchar(255) DEFAULT 'China'
)
3)6.2当表创建完的时候:
在MySQL中:
ALTER TABLE Persons ALTER City SET DEFAULT 'China'
在SQL Server中:
ALTER TABLE Persons ALTER COLUMN City SET DEFAULT 'China'
在Oracle 中:
ALTER TABLE Persons MODIFY City DEFAULT 'China'
3)6.3 删除DEFAULT约束
在MYSQL中:
ALTER TABLE Persons ALTER City DROP DEFAULT
在SQL Server / Oracle 中:
ALTER TABLE Persons ALTER COLUMN City DROP DEFAULT
9.SQL CREATE INDEX 语句(CREATE INDEX 语句用于在表中创建索引)
语法:CREATE INDEX index_name ON table_name (column_name)-->允许重复的索引
CREATE UNIQUE INDEX index_name ON table_name (column_name) -->不允许重复的索引
10.SQL DROP 语句(可以轻松地删除索引、表和数据库)
1)DROP INDEX语句
1).1 在SQL Server 中:
DROP INDEX table_name.index_name
2).2在Mysql中:
ALTER TABLE table_name DROP INDEX index_name
3).3在Oracle中:
DROP INDEX index_name
2)DROP TABLE 语句
语法:DROP TABLE table_name
3)DROP DATABASE 语句
语法:DROP DATABASE database_name
4)TRUNCATE TABLE 语句(仅仅需要删除表内的数据,但并不删除表本身)
语法:TRUNCATE TABLE table_name
11.SQL ALTER TABLE 语句(ALTER TABLE 语句用于在已有的表中添加、删除或修改列)
1)在表中添加列:ALTER TABLE table_name ADD column_name datatype
2)删除表中的列:ALTER TABLE table_name DROP COLUMN column_name
3)改变列中的数据类型:
3).1 在SQL Server中:
ALTER TABLE table_name ALTER COLUMN column_name datatype
3).2 在My SQL / Oracle中:
ALTER TABLE table_name MODIFY COLUMN column_name datatype
12.SQL AUTO INCREMENT 字段(Auto-increment 会在新记录插入表中时生成一个唯一的数字)
1)在Mysql中
语法:CREATE TABLE Persons
(
ID int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
PRIMARY KEY (ID)
)
PS:默认地,AUTO_INCREMENT 的开始值是 1,每条新记录递增 1。
2)SQL SERVER中
语法:CREATE TABLE Persons
(
ID int IDENTITY(1,1) PRIMARY KEY,
City varchar(255)
)
PS:在上面的实例中,IDENTITY 的开始值是 1,每条新记录递增 1。
3)在Oracle中,需要通过 sequence 对象,生成数字序列 创建 auto-increment 字段
语法:CREATE SEQUENCE seq_person
MINVALUE 1
START WITH 1
INCREMENT BY 1
CACHE 10
上面的代码创建一个名为 seq_person 的 sequence 对象,它以 1 起始且以 1 递增。
要在 "Persons" 表中插入新记录,我们必须使用 nextval 函数((该函数从 seq_person 序列中取回下一个值))
实例:INSERT INTO Persons (ID,FirstName,LastName) VALUES (seq_person.nextval,'Lars','Monsen')
13.SQL 视图(Views)(视图是可视化的表)
1)SQL 创建视图 CREATE VIEW 语法
CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
2)SQL 更新视图 CREATE OR REPLACE VIEW 语法
CREATE OR REPLACE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition
3)SQL 删除视图 DROP VIEW 语法
DROP VIEW view_name
14.SQL 日期
1)在MYSQL中
返回当前时间和日期: now()
返回当前时间:CURTIME()
返回当前日期:CURDATE()
提取日期或日期/时间表达式的日期部分: DATE()
返回两个日期之间的天数:DATEDIFF()
用不同的格式显示日期/时间:DATE_FORMAT()
2)在SQL Server中:
返回当前的日期和时间:GETDATE()
返回日期/时间的单独部分 :DATEPART()
返回两个日期之间的时间:DATEDIFF()
用不同的格式显示日期/时间:CONVERT()
3)在Oracle中:
当前日期和时间:Sysdate
日期f和s间相差月数:Months_between(f,s)
日期和字符转换函数用法:to_date,to_char
4)SQL Date 数据类型
4).1在Mysql中:
DATE - 格式:YYYY-MM-DD
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS
YEAR - 格式:YYYY 或 YY
4).2 在Sql Server中:
DATE - 格式:YYYY-MM-DD
DATETIME - 格式:YYYY-MM-DD HH:MM:SS
SMALLDATETIME - 格式:YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式:唯一的数字
4).3 在Oracle中:
DATE - 格式:YYYY-MM-DD HH24:MI:SS
timestamp -格式:YYYY-MM-DD HH:MI:SS.FF6
15.SQL NULL 值 (NULL 值代表遗漏的未知数据 默认的表的列可以存放null值)
1)NULL值
语法:SQL IS NULL-->使用 IS NULL 来查找 NULL 值。
SQL IS NOT NULL-->使用 IS NOT NULL 来查找不是NULL 值。
2)NULL函数
ISNULL() 函数用于规定如何处理 NULL 值。NVL()、IFNULL() 和 COALESCE() 函数也可以达到相同的结果。
语法:select id,name,url,ifnull(alexa,0)from websites; -->如果alexa列为null值,则赋予0,否则,取原值
16.SQL通用数据类型
数据类型 描述
VARCHAR(n) 字符/字符串。可变长度。最大长度 n。
BOOLEAN 存储 TRUE 或 FALSE 值
INTEGER(p) 整数值(没有小数点)。精度 p。
FLOAT 近似数值,尾数精度 16。
DATE 存储年、月、日的值。
TIME 存储小时、分、秒的值。
TIMESTAMP 存储年、月、日、小时、分、秒的值。
17.SQL函数总结
1)统计函数
COUNT(*) 返回行数
SUM(COLNAME/EXPRESSION) 返回指定列或表达式的数值和;
AVG(COLNAME/EXPRESSION) 返回指定列或表达式中的数值平均值
MIN(COLNAME/EXPRESSION) 返回指定列或表达式中的数值最小值
MAX(COLNAME/EXPRESSION) 返回指定列或表达式中的数值最大值
2)日期函数
YEAR(DATE/DATETIME EXPRESSION) 返回指定表达式中的年份
MONTH(DATE/DATETIME EXPRESSION) 返回指定表达式中的月份
DAY(DATE/DATETIME EXPRESSION) 返回指定表达式中的当月几号
DATE(NOT DATE EXPRESSION) 返回指定表达式代表的日期值
CURRENT[FIRST TO LAST] 返回当前日期的日期时间值
3)数学函数
ABS(COLNAME/EXPRESSION): 取绝对值
MOD(COLNAME/EXPRESSION,DIVISOR) 返回除以除数后的模(余数)
ROUND(COLNAME/EXPRESSION,[FACTOR]) 返回指定列或表达式的圆整化值
4)字符串处理函数
lower,将字符串中每个大写字母转换为小写字母
upper,将字符串中每个小写字母转换为大写字母
substr,返回字符串中的某一部分,例substr(col,1,2)
replace,将字符串中的某一组字符转换成其他字符,例replace(col,”each”,”eve”)
substring,返回字符串中的某一部分,例substring(col,from 1 to 4)
LEN() ,返回文本的长度
FORMAT(),用于对字段显示进行格式化
18.SQL 查询语句的一般格式为
SELECT [ALL|DISTINCT] <算术表达式列表> FROM <表名或视图名列表>
[ WHERE <条件表达式 1> ]
[ GROUP BY <属性列表 1> [ HAVING <条件表达式 2 > ] ]
[ ORDER BY <属性列表 2> [ ASC|DESC ] ] ;
19.存储过程
1)存储过程(Stored Procedure),是一组为了完成特定功能的SQL 语句,类似一门程序设计语言,也包括了数据类型、流程控制、输入和输出和它自己的函数库。
存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。
2)存储过程的优点
2).1存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译
2) .2使用存储过程可提高数据库执行速度,效率要比T-SQL语句高。
2) .3当对数据库进行复杂操作时,可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
2) .4降低网络的通信量,提高通信速率。
2) .5存储过程可以重复使用,可减少数据库开发人员的工作量。
2) .6安全性高,可设定只有某些用户才具有对指定存储过程的使用权
3)存储过程的语法
--------------创建存储过程-----------------
create proc StuProc
@sname varchar(100)
as
begin
select S#,Sname,Sage,Ssex from student where sname=@sname
end
go
--------------调用存储过程-----------------
exec StuProc '赵雷' //执行语句--存储过程如果有参数,后面加参数格式为:@参数名=value,也可直接为参数值value
--------------删除存储过程-----------------
drop procedure procedure_name --在存储过程中能调用另外一个存储过程,而不能删除另外一个存储过程