文章目录
DDL
DDL(数据库定义语言),用于数据库、表、列、索引等数据库对象的定义(创建)
和结构的修改
。
数据库
- 创建:
create
database 数据库名 - 删除:
drop
database 数据库名 - 改变使用的数据库:
use
数据库名
表
- 创建:
create
table 表名(
〈列名〉〈数据类型〉〈列级完整性约束条件〉……
CONTRAINT〈约束名〉〈表级完整性约束条件〉……)- 列级约束条件
- NOT NULL 或 NULL
NOT NULL约束不允许字段值为空,而NULL约束允许字段值为空。 - UNIQUE
惟一性约束,即不允许列中出现重复的属性值。 - PRIMARAY KEY [CLUSTERED|NON CLUSTERED]
定义该字段为主码并建立聚集(非)索引。
1、多个属性构成的主码只能通过表级约束条件定义:PRIMARY KEY (Sno,Cno)
2、单个属性构成的主码可通过列级或表级约束条件定义:Sno CHAR(9) PRIMARY KEY 或 PRIMARY KEY (Sno) - DEFAULT
默认值约束。 DEFAULT〈约束名〉〈默认值〉FOR〈列名〉 - CHECK
检查约束。CONSTRAINT〈约束名〉CHECK (〈约束条件表达式〉)
1、单一属性设限
CONSTRAINT C2 CHECK(性别 IN (‘男’,‘女’))
CONSTRAINT C3 CHECK(成绩 BETWEEN 0 AND 100)
2、多属性之间设限
CHECK (Ssex=‘女’ OR Sname NOT LIKE ‘Ms.%’) - identity(初值,步长)
定义字段为数值型数据,并指出它的初始值和逐步增加的步长值 - reference 参照表(对应字段)
定义该字段为外码,并指出被参照表及对应字段
- 表级约束条件
- UNIQUE
- PRIMARY KEY[CLUSTERED|NON CLUSTERED]
- check(条件表达式)
- FOREIGN KEY
CONTRAINT〈约束名〉FOREIGN KEY(〈外码〉) REFERENCES〈被参照表名〉(〈与外码 对应的主码名〉)
- NOT NULL 或 NULL
- 删除表:
drop
table 表名 - 修改表的约束or属性:
alter
table 表名
[rename
新表名] 更改表名
[add
column 列名 类型 约束 or CONSTRAINT 约束名 约束定义] 增加字段或者字段和表的约束
[drop
column 列名 or CONSTRAINT 约束名] 删除字段或约束
[alter
] 增加字段宽度或约束,一般不允许修改和减少,也不能改动字段标识
[modify
] 修改字段类型和约束,不能改动字段标识
[change
] 修改字段类型和约束,允许修改字段标识。后面要写两次列名,比较麻烦。
{check
|nocheck
}constraint{all|约束名组}使约束有效或无效(check使之有效,nocheck使之无效,all指全部约束)
first
after
:配合add、alter、modify、change使用,用于改变列的位置
- 列级约束条件
索引
-
创建:
create
[UNIQUE] [CLUSTERED|NONCLUSTERED]
index〈索引名〉 ON〈表名〉(〈列名〉[〈次序〉][,〈列名〉[〈次序〉]]…);UNIQUE
建立唯一索引,不允许有两行具有相同索引值
CLUSTERED|NONCLUSTERED
建立聚集或者非聚集索引,每张表只能有一个聚集索引,默认值为非聚集索引- alter table 表名
add
[UNIQUE|FULLTEXT] index 索引名 [using [BTREE|HASH]] (列名); - create table 表名{
学号 char(6),
课程号 char(3),
成绩 tinyint(1),
学分 tinyint(1),
primary key(学号,课程号);
index cj(成绩)//index 索引名 [索引类型] (索引列名)
}
-
删除:
drop
index 索引名 -
查看:
show
index in 表名
DML
DML(数据库操纵语言),用于实现对数据库表的内容
(而非结构)的增删改查
功能。
-
增加行
INSERT INTO
〈表名〉[(〈属性列1〉[,〈属性列2〉…)]
VALUES
(〈常量1〉[,〈常量2〉]…),
(〈常量1〉[,〈常量2〉]…)……
或
INSERT INTO
〈表名〉[(〈属性列1〉[,〈属性列2〉]…)]
〈子查询〉 -
删除行
DELETE FROM
〈表名〉[WHERE〈条件〉]; -
修改某几行的属性值
UPDATE
〈表名〉
SET
〈列名〉=〈表达式〉[,〈列名〉=〈表达式〉][,…n] -
查找行
查找语句以及注意事项
SELECT
〈属性1,属性2,……〉(可以使用distinct、top等关键字)
from 表1,表2,……(可以有多个表,结果是笛卡尔乘积;可以是左右连接)
where 元组需要满足的条件(可以用in)
group by的注意事项
- 在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚集函数(可以不是group by子句中指定列的聚集函数)
- 对于不包含聚集函数的group by语句,筛选结果只保留第一个结果值,相当于使用了distinct
--结果是显示每个部门的名称(无重复) select sum(钱),部门 from table group by 部门
- group by和group by all的区别
- group by all 不管where的筛选条件,而对表中所有的行根据属性进行分组并显示在结果集中
- 如果select里面有聚集函数,则group by all 中不符合where筛选的结果显示为null
select 类别,AVG(定价) 平均价 from 图书馆 where 出版社='机械出版社' group by 类别
--会对出版社非机械出版社的书也根据类别进行分组,只不过对应的平均价为null select 类别,AVG(定价) 平均价 from 图书馆 where 出版社='机械出版社' group by all 类别
DCL
DCL(数据库控制语言),用于控制访问权限和设定安全级别。
- grant
- 功能:授权
- 格式
grant 权限列表 on 库.表 to 用户名@'ip' identified by "密码" [WITH GRANT OPTION];
- 应用
- 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。
grant select on testdb.* to common_user@ '%' grant insert on testdb.* to common_user@ '%' grant update on testdb.* to common_user@ '%' grant delete on testdb.* to common_user@ '%' --上面四条可以合成下面1条 grant select, insert, update, delete on testdb.* to common_user@ '%' --all等同于all privileges,其中的privileges可以省略 grant all on *.* to wang@ '192.168.1.150' identified by "password"; --把查询权限授予所有用户 GRANT SELECT ON TABLE SC TO PUBLIC; --把INSERT权限授予用户U5,并允许将此权限再授予其他用户 GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION; --192.168.1.%表示一个网段 grant all privileges on *.* to wang@'192.168.1.%' identified by "123456"; --grant 作用在表中的列上: grant select(id, se, rank) on testdb.apache_log to dba@localhost; --授权之后,不要忘记更新权限表 flush privileges
- 数据库开发人员,创建表、索引、视图、存储过程、函数等权限。
--grant 创建、修改、删除 MySQL 数据表结构权限。 grant create on testdb.* to developer@ '192.168.0.%'; grant alter on testdb.* to developer@ '192.168.0.%'; grant drop on testdb.* to developer@ '192.168.0.%'; --grant 操作 MySQL 外键权限: grant references on testdb.* to developer@ '192.168.0.%'; --grant 操作 MySQL 临时表权限: grant create temporary tables on testdb.* to developer@ '192.168.0.%'; --grant 操作 MySQL 索引权限: grant index on testdb.* to developer@ '192.168.0.%'; --grant 操作 MySQL 视图权限 grant create view on testdb.* to developer@ '192.168.0.%'; --grant 操作 MySQL 存储过程、函数权限: grant create routine on testdb.* to developer@ '192.168.0.%'; -- now, can show procedure status grant alter routine on testdb.* to developer@ '192.168.0.%'; -- now, you can drop a procedure grant execute on testdb.* to developer@ '192.168.0.%'; grant execute on procedure testdb.pr_add to 'dba'@ 'localhost'; grant execute on function testdb.fn_add to 'dba'@ 'localhost';
- 查看权限
--查看当前用户下所有的权限 show grants; --查看其他 MySQL 用户权限: show grants for dba@localhost;
- 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。
- revoke
- 功能: 收回权限
- 格式: revoke跟grant语法差不多,只需要把关键字 “to” 换成 “from” 即可,并且revoke语句中不需要跟密码设置。
revoke 权限列表 on 库.表 from 用户名@'ip';
- 应用
--撤销已经赋予给 MySQL 用户权限的权限。 revoke all on *.* from dba@localhost; revoke insert,select,update,delete,drop,create,alter on huanqiu.* from wang@'%'; flush privileges;
grant和revoke的注意事项
- grant, revoke用户权限后,该用户只有重新连接MySQL数据库,权限才能生效。
- 如果想让授权的用户,也可以将其拥有的权限grant给其他用户,那么授权时需添加选项 “grant option”!
- mysql
授权表
一共涉及到5个表,分别是user、db、host、tables_priv和columns_priv。
这5张表的内容和用途如下:1)user表
user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。
2)db表
db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。
3)host表
host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。
4)tables_priv表
tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。
5)columns_priv表
columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。 - 如果给一个用户设置的权限过大,除了上面使用
revoke
回收部分权限外,还可以使用grant
进行权限修改
。也就是说,grant不仅可以添加权限,也可以修改权限(实际上就是对同一’用户名’@'ip’设置权限,以覆盖之前的权限);grant修改后的权限将覆盖之前的权限!
别名
表名or临时表or属性名 as 别名
表名or临时表or属性名+空格+别名
常见问题
sql语句的执行顺序
SQL语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。但在SQL语句中,第一个被处理的子句式FROM,而不是第一出现的SELECT。SQL查询处理的步骤序号:
(8)SELECT (9) DISTINCT|TOP (11) <TOP_specification> <select_list>
(12) INTO tablename 将结果保存到新表中
(1) FROM <left_table> 笛卡尔乘积
(3) <join_type> JOIN <right_table> 隐含的筛选条件
(2) ON <join_condition> 筛选条件
(4) WHERE <where_condition> 筛选条件
(5) GROUP BY <group_by_list> 分组
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition> 筛选条件
(10) ORDER BY <order_by_list> 排序条件
where和having的区别
where | having |
---|---|
对from中的数据进行筛选,而不能对group by分组后的数据筛选(也就是说只能对返回的查询结果集进行过滤操作 | 对select from 的结果或者group by分组后 的结果进行筛选 |
不能使用聚集函数 | 可以使用聚集函数 |
- where和having都可以使用的场景:
select goods_price,goods_name from sw_goods where goods_price > 100
解释:上面的having可以用的前提是我已经筛选出了goods_price字段,在这种情况下和where的效果是等效的,但是如果我没有select goods_price 就会报错!!因为having是从前筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选的。select goods_price,goods_name from sw_goods having goods_price > 100
- 只可以用where,不可以用having的情况:
select goods_name,goods_number from sw_goods where goods_price > 100
-- 报错!!!因为前面并没有筛选出goods_price 字段 select goods_name,goods_number from sw_goods having goods_price > 100
- 只可以用having,不可以用where情况:
select goods_category_id , avg(goods_price) as ag from sw_goods group by goods_category having ag > 1000
注意: where 后面要跟的是数据表里的字段,如果我把ag换成avg(goods_price)也是错误的!因为表里没有该字段。而having只是根据前面查询出来的是什么就可以后面接什么。-- 报错!!因为from sw_goods 这张数据表里面没有ag这个字段 select goods_category_id , avg(goods_price) as ag from sw_goods where ag>1000 group by goods_category
Not null unique和primary key的区别
DBMS会给primary key建立索引
drop turncate delete的区别
- drop
删除整个表 - truncate
- delete
内连接 左连接 右连接 外连接
假设左表有M行,右表有N行,x=max(M,N),y=min(M.N)
- 内连接:仅保留满足删选条件的部分,最少0行,最多y行
- 左连接:左表不变,右表满足条件的列增加进左表,最少M行,最多M行
- 右连接:右表不变,左表满足条件的列增加进右表,最少N行,最多N行
- 外连接:两表不满足条件的行也保留,最少x行,最多M+N行
MySQL中between and的取值范围
between 1 and 100 --表示取 1<=x<=100的值,即包含两边的边界值
参考文献
https://www.jianshu.com/p/bb19b6b0fdc3 sql语句执行顺序
http://keep.iteye.com/blog/240665 group by和having/where的区别
https://segmentfault.com/a/1190000008284099 having/where的区别
https://www.jb51.net/article/91915.htm grant revoke语句
https://www.cnblogs.com/kevingrace/p/5719536.html grant revoke语句
https://blog.csdn.net/liuwengai/article/details/51321198 grant revoke语句