文章目录

DDL

DDL(数据库定义语言),用于数据库、表、列、索引等数据库对象的定义(创建)结构的修改

数据库

  • 创建:create database 数据库名
  • 删除:drop database 数据库名
  • 改变使用的数据库:use 数据库名

  • 创建create table 表名(
    〈列名〉〈数据类型〉〈列级完整性约束条件〉……
    CONTRAINT〈约束名〉〈表级完整性约束条件〉……)
    • 列级约束条件
      • 表级约束条件
    • 删除表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〈表名〉(〈列名〉[〈次序〉][,〈列名〉[〈次序〉]]…);
  • 删除drop index 索引名

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,dropcreatealter on huanqiu.* from wang@'%';
      flush privileges;
      

grant和revoke的注意事项

  • grant, revoke用户权限后,该用户只有重新连接MySQL数据库,权限才能生效。
  • 如果想让授权的用户,也可以将其拥有的权限grant给其他用户,那么授权时需添加选项 “grant option”!
  • mysql授权表一共涉及到5个表,分别是user、db、host、tables_priv和columns_priv。
    这5张表的内容和用途如下:
  • 如果给一个用户设置的权限过大,除了上面使用revoke回收部分权限外,还可以使用grant进行权限修改。也就是说,grant不仅可以添加权限,也可以修改权限(实际上就是对同一’用户名’@'ip’设置权限,以覆盖之前的权限);grant修改后的权限将覆盖之前的权限!

别名

表名or临时表or属性名 as 别名
表名or临时表or属性名+空格+别名

常见问题

sql语句的执行顺序

SQL语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。但在SQL语句中,第一个被处理的子句式FROM,而不是第一出现的SELECT。SQL查询处理的步骤序号:

where和having的区别

  • where和having都可以使用的场景
select goods_price,goods_name from sw_goods where goods_price > 100
select goods_price,goods_name from sw_goods having goods_price > 100

解释:上面的having可以用的前提是我已经筛选出了goods_price字段,在这种情况下和where的效果是等效的,但是如果我没有select goods_price 就会报错!!因为having是从前筛选的字段再筛选,而where是从数据表中的字段直接进行的筛选的。

  • 只可以用where,不可以用having的情况
select goods_name,goods_number from sw_goods where goods_price > 100
select goods_name,goods_number from sw_goods having goods_price > 100 //报错!!!因为前面并没有筛选出goods_price 字段
  • 只可以用having,不可以用where情况
select goods_category_id , avg(goods_price) as ag from sw_goods group by goods_category having ag > 1000
select goods_category_id , avg(goods_price) as ag from sw_goods where ag>1000 group by goods_category //报错!!因为from sw_goods 这张数据表里面没有ag这个字段

注意: where 后面要跟的是数据表里的字段,如果我把ag换成avg(goods_price)也是错误的!因为表里没有该字段。而having只是根据前面查询出来的是什么就可以后面接什么。

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语句

10-02 14:33