数据库基础语句

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013617791/article/details/82821611

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〈被参照表名〉(〈与外码 对应的主码名〉)
    • 删除表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,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张表的内容和用途如下:

    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
    
    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
    
    -- 报错!!!因为前面并没有筛选出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
    
    -- 报错!!因为from sw_goods 这张数据表里面没有ag这个字段
    select goods_category_id , avg(goods_price) as ag from sw_goods where ag>1000 group by goods_category
    
    注意: 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语句

猜你喜欢

转载自blog.csdn.net/u013617791/article/details/82821611