SQL语句总结(以MySQL为对照)

模式

#1.创建模式
CREATE SCHEMA <模式名> AUTHORIZTION <用户名>
CREATE SCHEMA sche AUTHORIZATION root
#为用户root创建一个模式schema
#2.删除模式
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
DROP SCHEMA root CASCADE
#删除模式root
#1.CASCADE 级联操作 删除模式中的所有对象
#2.DISTRICT 限制操作 如果模式中仍然存在对象,则拒绝删除模式

数据库

#1.创建数据库
CREATE DATABASE <数据库名>
CREATE DATABASE databa;
#创建名为 databa的数据库
#2.删除数据库
DROP DATABASE <数据库名>
DROP DATABASE databa;
#删除名为 DATABASE的数据库

表的定义、删除、修改

#1.定义基本表
CREATE TABLE <表名>(
列名 数据类型 约束条件,
...
表级完整性的参照条件
);
CREATE TABLE user(
id int primary key increment,
name varchar(60) not null,
gender int(1) not null,
phone char(11) not null
)
#2.删除基本表
DROP TABLE <表名>
DROP TABLE user#3.修改基本表
ALTER TABLE old_name(旧表名) RENAME new_name(新表名)  #基本表重命名
ALTER TABLE <表名> (对列、约束的操作都以此句为前提)
ADD COLUMN <新列名> <数据类型> # 添加新列
ADD CONSTRAINT <约束名> <约束> #添加约束
DROP COLUMN <列名>CASCADERESTRICT#删除列【级联|限制】
DROP CONSTRAINT <完整约束名>RESTRICTCASCADE#删除约束
#MySQL删除约束
MODIFY <列名> <数据类型> #删除not null约束
DROP INDEX <UNIQUE约束名> #删除UNIQUE约束
DROP PRIMARY KEY #删除 primary key约束
DROP FOREIGN KEY <外键名> #删除foreign key 约束
#为表添加索引
ALTER TABLE tableName ADD INDEX indexName(columnName)
ALTER TABLE user ADD INDEX indexNam(id,dept_name); #为表user添加列id,dept_name的索引
#SQL定义——修改原有列定义 
ALTER/CHANGE COLUMN <列名> <数据类型>  #修改原有列定义
CHANGE COLUMN <列名> <新列名> <数据类型>	#在修改列定义的同时修改列名
#MySQL定义——修改原有列定义
MODIFY COLUMN <列名> <数据类型> #修改原有列定义
CHANGE COLUMN <列名> <新列名> <数据类型> #在修改列定义的同时修改列名

#将user表改名为use
ALTER TABLE user RENAME use;
#向user表中新增 loginTime 列
ALTER TABLE user ADD COLUMN loginTime TIMESTAMP;
#把user中的age列由int改为字符串
ALTER TABLE user MODIFY COLUMN age char10#修改列名并且更换列的域
ALTER TABLE user CHANGE COLUMN age agg char(10)
#添加约束
ALTER TABLE user ADD CONSTRAINT pariCon PRIMARY KEY(id) #为user添加以id为主键的约束
ALTER TABLE user ADD CONSTRAINT uniCon UNIQUE(id) #为user添加id的独一性约束
ALTER TABLE user ADD CONSTRAINT checkCon CHECK()  #为user添加CHECK约束


数据类型

数据类型 			含义
char(n)			    长度为n的定长字符串
varchar(n)		    最大长度为n的变长字符串
CLOB	 		    字符串大对象
BLOB			    二进制大对象
int 				    长整数
smallint			    短整数
bigint			    大整数
numeric(p,d)		    定点数,p位数字,d位小数
real 				    单浮点数
double			    双精度浮点数
float(n) 		    n精度浮点数
date			    日期,包含年、月、日,格式为YYYY-MM—DD
time			    时间,包含时、分、秒 格式为HH-MM-DD
timestamp		    时间戳类型,date+time
interval			    时间间隔类型			 

索引INDEX

#1.建立索引
CREATE [UNIQUE][CLUSTER] INDEX <索引名> ON <表名><列名><次序>.....# UNIQUE 表示每一个索引值都只对应唯一的数据记录
# CLUSTER 表示要建立的索引是聚簇索引
CREATE UNIQUE INDEX Stusno ON student(Sno ASC); #为表student的Sno列按照升序创建一个名为Stusno的索引
#2.为表添加索引
ALTER TABLE tableName ADD INDEX indexName(columnName)
ALTER TABLE user ADD INDEX indexNam(id,dept_name); #为表user添加列id,dept_name的索引
#3.删除索引
#SQL
DROP INDEX indexName ON tableName;
#MySQL
ALTER TABLE tableName DROP INDEX indexName 
ALTER TABLE user DROP INDEX ind; #为表user删除索引ind
#4.在创建表的时候直接定义索引
CREATE TABLE user(
id int primary key,
name varchar(100) not null,
gender char(10) not null,
INDEX indexName name
)
#5.查看缩影
SHOW INDEX FROM tableName;
SHOW INDEX FROM user;#查看user表中的索引

数据查询

#1、句式
SELECT [ALL|DISTINCT] <目标列>,... FROM <tableName/viewName>,...WHERE <条件表达式>】【 GROUP BY <列名1>HAVING<条件表达式>】【ORDER BY <列名>ASC|DESC】】
#2、单表查询
SELECT */<列名> FROM tableName WHERE <条件>
SELECT *  FROM user ;#查询user表中的所有元组
SELECT *  FROM user WHERE id = 1 ;#查询user表中所有id=1的元组


#3、消除表中的若干元组
#消除重复行——使用DISTINCT
SELECT DISTINCT * FROM user;
#4.
##1.确定连续范围BETWEEN...AND...
##2.确定集合
SELECT * FROM user WHERE id BETWEEN 1 AND 3; ## 查询user表中所有id在1到3的元组
SELECT * FROM user WHERE id in (1,3); ## 查询user表中所有id为1或3的元组

#5、字符串匹配
SELECT * FROM user WHERE name = '%liu%' ; #查找所有 name包括‘liu’的元组,%表示任意字符,任意个数
SELECT * FROM user WHERE name = '_liu' ; #查找所有 ?liu的元组,_表示一个任意字符

#6、聚集函数
##COUNT(*) 统计元组个数
SELECT COUNT(*) FROM user; #user中所有元组的个数
##COUNT(DISTINCT|ALL 列名) 某一列中值的个数
SELECT COUNT(DISTINCT|ALL id) FROM user; #user中所有非重复id|所有id的个数
##SUM(DISTINCT|ALL 列名) 某一列中值的总和(数值类型)
SELECT SUM(ALL id) FROM user; # user中所有id的和
##AVG(DISTINCT|ALL 列名) 某一列中值得平均值(数值类型)
SELECT AVG(ALL id) FROM user;
##MAX(DISTINCT|ALL 列名) 某一列中的最大值 (任意类型)
SELECT MAX(ALL name) FROM user;
##MIN(DISTINCT|ALL) FROM user 某一列中的最小值
SELECT MIN(ALL name) FROM user;
#7、GROUP BY 字句(分组)
SELECT * FROM tableName GROUP BY 列名; 根据列名分组,列名相同为一组
SELECT * FROM user GROUP BY name; #更具name给user中的元组分组 (没什么意义)
#用途:统计数据 
SELECT name,COUNT(name) FROM user;  #可以找到不同分组的数据特点 
#对分组进行筛选 HAVING,把每一个分组放入HAVING条件中,如果符合条件则筛选出
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)>3 ; #以Sno分组,筛选出出现3次以上的Sno
#8、连接查询
SELECT * FROM user,person WHERE user.id = person.id ; #查询user,person两表中所有id
相等的部分(适合索引)
##表的自身连接 : 表与表的笛卡尔积
SELECT * FROM user a,user b WHERE a.id1 = b.id2 ; #在同一个表联合查询(重要)
#9、外连接JOIN
SELECT * FROM tableName1 a [LEFT|RIGHT|FULL] OUTER JOIN person b on a.id = b.id 
#LEFT : 左外连接,左侧表全部都有,缺值补NULL
#RIGHT: 右外连接,右侧表全部都有,缺值补NULL
#FULL :全连接,两侧表都有,缺值补NULL 
MySQL不支持全连接
#自然连接
SELECT * FROM tableName1 a NATURAL JOIN tableName2  # 自然连接会去掉重复列,重复列是自动找到的,natural join 不需要USING与ON

嵌套查询

#1.IN : 结果是否在集合中(常用)
SELECT * FROM user WHERE id IN (
	SELECT id FROM person) 
# 查询user表中的信息,外查询所查到的每一个元组的id应该在person的id集合当中

#2.普通嵌套查询
 SELECT * FROM user WHERE (
 		SELECT AVG(salary) FROM person = user.salary)
#3.带有ANY、SOME、ALL 谓词的嵌套查询
# ANY、SOME某个
# ALL 全部(全称量词)
SELECT * FROM  user WHERE salary > SOME | ALL(
	SELECT salary FROM person)
#查询user表中 salary > 大于perosn中的salary,SOME指大于
任意一个 salary就行, ALL指大于所有的salary
#4.带有EXISTS谓词的嵌套查询,只产生逻辑的真假 EXISTS|NOT EXISTS
SELECT * FROM user WHERE EXISTS (
	SELECT * FROM user WHERE id = 1
)
把外层查询查出来的每一个元组 放到 内存查询中进行条件的判断,如果条件符合,则外层查询出的元组有效。

## 集合查询

//1.参加集合查询的 表之间 列必须相同,每一列都要做相应的操作
//2.集合查询的关键词 连接的是 不同的SELECT字句
#1.UNION 并集操作,所有结果全部输出
SELECT id,dept_name FROM person 
UNION 
SELECT id,dept_name FROM  user 
#查询person表中所有的id,dept_name和user中所有的id,dept_name
#2.INTERSECT 交集操作
SELECT id,dept_name FROM person 
INTERSECT 
SELECT id,dept_name FROM user
#查询两个表中相同的id与dept_name
#3.EXCEPT 差集操作
SELECT id,dept_name FROM person 
EXCEPT
SELECT id,dept_name FROM user
#查询 person中所有的id,dept_name 减去 与user表中的交集之后的元组
//MySQL中不支持 INTERSECT、EXCEPT 操作

派生表查询

//派生表的 作用是建立一个临时的新表,用作查询(方便快捷)
#SQL语法
SELECT * FROM person,(SELECT dept_name FROM user) AS tem_table(dept_name) WHERE person.dept_name = tem_table.dept_name 
#查询 person与由user中dept_name组成的新派生表tem_table的联合查询中,二者dept_name相等的部分
# MySQL派生表语法不同:
SELECT * FROM person,(SELECT id newID FROM user) AS tem_table WHERE person.id = tem_table.newID
//该句语义同上,但派生表新列的重命名在 SELECT 语句旧列名之后 ,派生表之后不能定义新的列
//在SQL中AS可以省略,但MySQL不可以
#with as 语句(在MySQL中不可用)
WITH temportable AS (SELECT name,dept_name FROM person); //取person的name,dept_name构造一个临时表

插入数据

#1.插入元组
INSERT INTO user(id,dept_name) VALUES (3'dept_name')  #为指定的列添加相应的值
INSERT INTO user VALUES3'dept_name'#不指定列就必须 添加所有列的值
#2.插入子查询结果
INSERT INTO user (SELECT id,dept_name FROM person) //不可以使用VALUE
//自己赋值需要使用VALUE,使用子查询结果赋值不能使用VALUE

修改数据

UPDATE user SET dept_name = 'new_name' WHERE id = 1
#将id=1 的元组记录中的 dept_name 修改为 'new_name'
#带子查询的修改语句
UPDATE user SET dept_name = 'name' WHERE in (SELECT id IN person)
//将user表中所有id存在于person集合中的元组 dept_name赋值为'name'

删除数据

#1、删除某一记录
DELETE FROM user WHERE id = 1#删除user表中 id = 1 的记录
#2、删除表中全部的记录
DELETE FROM user//使得user表成为空白,删除所有的记录
#3、带有子查询的删除
DELETE FROM user WHERE id IN (SELECT id FROM person);
#删除user中所有id在person的id集合中的元组

空值

#1、空值判断
IS NULL  
IS NOT NULL
SELECT * FROM person WHERE dept_name IS NOT NULL; #查询person表中所有dept_name不为NULL的元组
SELECT * FROM person WHERE dept_name IS NULL; #查询person表中所有dept_name 为 NULL的元组
#2、空值的算术运算
  1、 空值与另一个值的 算术运算 还为空值
  2、 空值与空值的 比较运算结果为UNKNOWN

视图

#1、建立视图
CREATE VIEW new_view AS SELECT a.id,a.name,b.dept_name FROM person a,user b;
//创建视图 new_view ,该视图的列 分别为 person 中的id,name 和 user中的dept_name
CREATE VIEW new_view(id,na,dept) AS SELECT a.id,a.name,b.dept_name FROM person a ,user b;
//创建视图 new_view ,该视图的列 分别为 person 中的id,name 和 user中的dept_name,并为这些属性
重新命名为id、na、dept
#WITH CHECK OPTION
CREATE VIEW new_view AS SELECT a.id,a.name,b.dept_name FROM person a,user b where a.id = b.id WITB CHECK OPTION;
//创建视图 new_view ,该视图的列 分别为 person 中的id,name 和 user中的dept_name,条件是 person 与 user 中id相等。 WITH CHECK OPTION 使得之后任何对该视图的操作,都会自动检查WHERE条件(即两表id是否相等)

//视图不仅可以建立在表上面,还可以建立在其他的视图上面
#2.删除视图
DROP VIEW new_view CASCADE;
级联删除视图new_view,可选CASCADE同时删除由该视图定义的一系列视图,可空也可选RESTRICT
#3.查询视图
同表
#4.视图更新
操作同表,但某些视图不可更新,视图的更新必须要能够对应到对应表的更新
//视图不可更新情况:DB2
1、视图由 两个以上基本表导出
2、视图的字段来自于字段表达式或常数,则不允许UPDATEINSERT
3、视图的字段来自聚集函数
4、视图定义中含有GROUP BY子句
5、视图定义中含有DISTINCT 短语
6、视图定义中含有嵌套查询,并且内层查询的FROM字句中涉及的表也是导出该视图的基本表

权限

#1、授权 GRANT
GRANT [权限] ONTABLE|VIEW[表名|视图名] TO [用户名]WITH GRANT OPTION;
WITH GRANT OPTION:获得权限的用户 还可以把这种权限赋予别的用户

GRANT SELECT ONTABLEuser TO u2,u3; //把user表的SELECT权限赋予用户u2,u3,有无TABLE都行
GRANT SELECT ONTABLEuser TO PUBLIC; //把user表的SELECT权限赋予所有用户,有无TABLE都行
GRANT UPDATE(dept_name),SELECT ON user TO u2; //把user表的UPDATE dept_name的权限以及SELECT的权限赋予u2
#2、收回授权 REVOKE
REVOKE [权限] ONTABLE|VIEW[表名|视图名] FROM [用户名]CASCADE|RESTRICT;

REVOKE UPDATE(dept_name) ON user FROM u2; //把user表的对dept_name属性修改的权限从用户u2处收回
REVOKE SELECT ON TABLE user FROM PUBLIC; //收回所有用户对表user的SELECT权限

用户操作

#1、创建数据库用户
CREATE USER [用户名]WITH】【CONNECT|RESOURCE|DBA】;
CONNECT:最低级权限,只能够登录数据库,进行别人授权的操作
RESOURCE:中等级权限,能够	创建表与视图,不能够 创建 模式,不能够创建 新的用户,可是使用GRANT命令赋予权限
DBA:最高级权限,数据库管理员,用户一切的权限

CREATE USER root WITH DBA; //创建数据库管理员root
#MYSQL语法不同:
CREATE USER [用户名] IDENTIFIED BY [密码] ; //无法初始赋予权限
CREATE USER user_test1 IDENTIFIED BY '1119ly'; //创建用户 user_test1 ,密码是 1119ly

角色操作

#数据库角色
角色是权限的集合,可以为 一组具有相同权限的用户创建一个角色
#1、创建角色
CREATE ROLE [角色名];
CREATE ROLE role1; //创建角色role1
#2、为角色授权
GRANT [角色] TO [角色|用户]WITH ADMIN OPTION;
//把角色授予用户或者授予另一个角色,WITH ADMIN OPTION 使得可以再授权

GRANT SELECT ON TABLE user TO role1; //给角色role1授予对user表的SELECT权限
GRANT role1 TO user2; //将角色role1授予用户user2,使得user2具有了role1的全部权限
#3、角色权限收回
REVOKE [权限] ON [表名|视图名] FROM [角色]REVOKE SELECT ON TBALE user FROM role1; //回收role1的SELECT user表的权限

##MySQL不支持

时间类型

##1.DATE 类型 YYYY-MM-DD
2021-03-30
##2.TIME 类型 HH-mm-ss
00:27:30
##3.TIMESTAMP 类型 YYYY-MM-DD HH-mm-ss
2021-03-30 00:27:30
##4.INTERVAL时间间隔
##5.EXTRACT函数 :从DATE/TIME/TIMESTAMP中抽取元素
EXTRACT (year FROM user.startTime)
user表中startTime中的year
##6.CAST函数 : 转化String类型为 DATE/TIME/TIMESTAMP
CAST <string-valued-expression> AS DATE

自定义类型

## 1、CREATE TYPE 自定义类型
CREATE TYPE Dollars AS NUMERIC(12,2);
//创建域为NUMERIC(12,2)的类型Dollars
## 2、CREATE DOMAIN person_name char(20) not null;
//创建一个域:该域为 char(20)
## 3、用新创建的域定义新创建的类型
CREATE TYPE type_new AS person_name;

## 以上所有用法MySQL均不支持

Constraints on a Single Relation

##1.not null约束
##2.primariy key 约束
##3.unique 约束
CREATE TABLE user(
id int primary key,
name varchar(30) not null
)
//创建表user,id为主键约束,name为NOT NULL约束,不可为NULL
##4.check 检查约束
CREATE TABLE user(
id int primary key,
name varchar(30) not null,
salary int(30)
check(salary>30)
)
//创建表 user,其中设置check约束,user表中的每个子项salary都必须>30 , 如果 salary<=30则不会添加到user表中

CREATE DOMAIN hourly_wage numeric(5,2) 
	CONSTRAINT value_test CHECK(value>=4.00)
//创建 域 hourly_wage ,设置CHECK约束,域中的值必须>=4.00

##5.ASSERTION 断言约束
CREATE ASSERTION <assertion-name> CHECK <checkConent>
CREATE ASSERTION assert CHECKNOT EXISTS
	(
     SELECT * FROM user WHERE salary < 0   
	)//创建断言约束assert,内容为 : user表中不存在salary<的表项,
不符合该断言的元组不会被插入user

##MySQL并不支持 Assertion约束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值