MySQL5.7 基础之二

Wesley13
• 阅读 621

设计范式:

  第一范式:字段是原子性

  第二范式:存在可用主键

  第三范式:任何表都不应该有依赖于其它表非主键的字段

创建数据库、设计数据表

  字段:字段名、数据类型、约束(通过键来实现,而键其实可以当做索引来用)

DDL:CREATE、DROP、ALTER

DML:INSERT(REPLACE)、DELETE、UPDATE 、SELECT

DCL:GRANT、REVOKE

数据类型: datatype
    字符:
        定长字符:
            不区分大小写 char(#) 用或不用,给1个占10个
            区分大小写 binary(#)

        变长字符: 
            不区分大小写 varchar(#) 有结束符,占用一个, 给1个,占2个
            区分大小写 varbinary(#)

        对象存储:大文本存储
            TEXT 不区分大小写
            BLOB  区分----二进制的大对象
        内置类型:
            ENUM   枚举(给你几种,最多有几种选择)
            SET    集合
    数值:    
        精确:整型[int]、十进制[decimal]
            int
                tinyint   1byte
                smallint  2bytes
                mediumint 3bytes
                int       4bytes
                bigint       8bytes  范围: 0 - 2^64-1
        近似: 单精度浮点[float]、双精度浮点[double]    日期时间型:       日期:DATE       时间:TIME       日期时间:TIMESTAMP       年份:YEAR(2),YEAR(4)

修饰符: 所有类型:
  NOT NULL      :非空约束
  DEFAULT NULL :设定默认值  UNIQUE  KEY   PRIMARY KEY

 数值型适用:  UNSIGNED :(对整型和数值型)无符号---不能表示负数,仅用于表示正数   AUTO_INCREMENT :自增长--整型  

二、数据库基础应用:

2.1、DDL

2.1.1、表:

CREATE  TABLE [IF NOT EXISTS] 'tbl_name' (col1 type1,col2 type2, ...)

  col1 type1:

     PRIMARY KEY(col1,...)

     INDEX(col1,...)

     UNIQUE KEY(col1,...)

查询默认引擎:  mysql>SHOW ENGINES;

获取帮助:  mysql>HELP CREATE TABLE;获取表创建命令:  mysql> SHOW CREATE TABLE students;查询表状态:  mysql>SHOW TABLE STATUS LIKE 'tbl_name' \G;  \G--把每一行数据竖排显示删除表  mysql> DROP TABLE [IF EXISTS] 'tbl_name';查看表上的索引  mysql> SHOW INDEXES FROM  [db_name.]tbl_name;查看表结构   mysql> DESC tbl_name; 查看某库中的表   mysql> SHOW TABLES FROM database_name;

 

E.G 

定义单字段的唯一键:

mysql> CREATE TABLE students (id int UNSIGNED NOT NULL PRIMARY KEY,name VARCHAR(20) NOT NULL,Age tinyint UNSIGGNED);

MySQL5.7 基础之二

多字段组合式唯一键(两者联合起来不一样就可以):

mysql> CREATE TABLE tbl2 (id int UNSIGNED NOT NULL ,name VARCHAR(20) NOT NULL,Age tinyint UNSIGNED,PRIMARY KEY(id,name));

MySQL5.7 基础之二

2.1.2、ALTER 修改表

  帮助:    mysql>HELP ALTER TABLE;

ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}  设定默认值或移除默认值这两个属性

CHANGE [COLUMN] old_col_name new_col_name column_definition    修改字段名字和字段定义
  [FIRST|AFTER col_name]

MODIFY [COLUMN] col_name column_definition      只修改字段定义 或字段的排序
  [FIRST | AFTER col_name]

语法:
ALTER TABLE 'tb_name'

  a) 字段:

    添加字段:add        

  | ADD [COLUMN] col_name  column_definition [FIRST | AFTER col_name]  e.g  mysql> ALTER TABLE students ADD gender ENUM('m','f')  AFTER name;

    删除字段:drop

      e.g  mysql> ALTER TABLE students drop  gender ;  

    修改字段:alter(删除字段默认值)、change(该字段名称)、modify(字段属性定义)

        注:该字段名字的时候,还必须把字段的属性定义出来,任何字段都有其字段定义
         类型修饰符必须紧跟在类型后面
         如果主键定义过,可以不需要重新定义。
e.g
修改字段名称mysql> ALTER TABLE students CHANGE id sid int UNSIGNED NOT NULL PRIMARY KEY;
  ERROR 1068 (42000): Multiple primary key defined
mysql> ALTER TABLE students CHANGE id sid int UNSIGNED NOT NULL ;
  Query OK, 0 rows affected (0.01 sec)
  Records: 0 Duplicates: 0 Warnings: 0

  b) 索引: 键都是索引,但索引不是键

    添加索引:add     

添加唯一键约束:
   | ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name]
  e.g    mysql> ALTER TABLE students ADD UNIQUE KEY(name);
添加索引:
   | ADD {INDEX|KEY} [index_name]   
  e.g    mysql> ALTER TABLE students ADD INDEX(age); 

    删除索引:drop

  注:每个索引都有Key_name字段值,如果定义索引时没给索引名字,那么索引名字就是字段名字;如果索引在多键上,那么索引名字就是多键上的第一个字段名字

  c) 表选项 (副作用大一般不用)

2.1.3、索引:是特殊数据结构;定义在查找时作为查找条件的字段;只用添加和删除

   优点:加速查询操作

   缺点:额外占用空间;插入数据时需要插入2次-----原表中插入一行的同时索引中也要插入一行,更重要的是索引是排序的

a)、帮助:

  mysql> HELP CREATE|DROP  INDEX;

b)、语法:

创建索引:  CREATE INDEX index_name ON tbl_name (inde_col_name,...)
注:索引只要用不上了就立刻删除,否则会产生多余IO,影响性能删除索引:  DROP INDEX index_name ON tbl_name

 e.g

  mysql> DROP INDEX name ON students;

MySQL5.7 基础之二

三、DML: INSERT、DELETE、SELECT、UPDATE

3.1、INSERT

a)帮助信息:

  mysql> HELP INSERT;

b)语法:

INSERT [INTO] tbl_name [(col1_name,col2_name,...)] {VALUES | VALUE} (value1_list),(value2_list),(...),...

e.g  mysql> INSERT INTO students  VALUES(1,'yangguo','m'),(2,'guoxiang','F');

    mysql> INSERT INTO students  (sid,name)   VALUES (3,'zhangwuji'),(4,'zhaoming');

MySQL5.7 基础之二

3.2、DELETE

3.2.1、语法:

DELETE  FROM tbl_name [WHERE clause] [ORDER BY 'col_name'[DESC]][LIMIT [m,]n] #只写到WHERE前面会清空整张表(慎)

e.g   mysql> DELETE FROM students WHERE sid=3;

3.3、SELECT

3.3.1、语法

SELECT col1,col2,... FROM tbl_name [WHERE clause] [ ORDER BY 'col_name' [ASC|DESC] ] [LIMIT [m,]n]

                            #指定字段显示       [#指定字段并判断显示 ] [排序【升序|降序】]

LIMIT 

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
 
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

3.3.2、字段表示法:

   *: 所有字段
  as: 字段别名    col1 AS alias1        mysql> SELECT sid as stusid,name as stuname FROM students;

 MySQL5.7 基础之二

注:不允许一个经常拿来做查找条件字段出现空值

E.G

a)mysql> SELECT * FROM students WHERE sid>3;

MySQL5.7 基础之二

b)mysql> SELECT * FROM students WHERE gender='m';

MySQL5.7 基础之二

根据name字段排序 默认升序

c)mysql> SELECT * FROM students ORDER BY name;

MySQL5.7 基础之二

d)降序排序

 mysql> SELECT * FROM students ORDER BY name DESC;

e)限制显示前2行:

 mysql> SELECT * FROM students ORDER BY name DESC LIMIT 2;

MySQL5.7 基础之二

f)偏移量为1,最大数目是2行;

 mysql> SELECT * FROM students ORDER BY name DESC LIMIT 1,2;

MySQL5.7 基础之二

3.3.3、WHERE clase

  操作符:>、< 、>=、 <= 、 == 、!=
      BETWEEN .... AND ....
           基于字符串比较的
     LIKE :模糊匹配
        %:任意长度的任意字符
        _: 任意单个字符
      RLIKE :基于正则表达式匹配 (能不用就不用---基于引擎查找)
      IS NULL
      IS NOT NULL 
      条件逻辑操作: and 、or 、not

E.G   

mysql> SELECT * FROM students WHERE sid>=2 and sid <=4;

mysql> SELECT * FROM students WHERE sid BETWEEN 2 AND 4;

匹配 "z" 开头字段

  mysql> SELECT * FROM students WHERE name LIKE 'z%';

3.4、UPDATE

语法

UPDATE tbl_name SET col1_name=val1, col2_name=val2,... [WHERE clause] [ORDER BY 'col_name'[DESC]][LIMIT [m,]n]

e.g   mysql> UPDATE students SET gender='f' WHERE sid=4;

四、DCL、用户账号及权限管理:

用户账号:'user'@'host'

    user :用户名

    host : 此用户访问mysqld服务时允许通过哪些主机远程创建连接

       IP 、网络地址、主机名、通配符(%和_); 

mysqld服务器端在验证客服端身份时,它会尝试在每一次客户端创建连接时反解客户端的IP地址为主机名,并根据主机名来检查权限

有时候明明做了授权却没法访问,可能是你根据主机名做了授权,但本机服务器却没法反解对方IP地址到主机名
因此建议 :禁止检查主机名

  /etc/my.cnf  
  [mysqld]
 skip_name_resolve=yes  跳过主机名解析

4.1、创建用户账号:

帮助:HLEP CREATE USER; 

语法:

CREATE USER [IF NOT EXISTS] 'username'@'host' [IDENTIFIED BY 'password']

e.g

mysql> SELECT User,Host,authentication_string FROM user;T User,Host,aua FROM user;

MySQL5.7 基础之二

4.2、删除用户:

帮助:HELP DROP USER;

语法:

DROP USER [IF NOT EXISTS] 'username1'@'host','username2'@'host',...;

4.3、授权

   权限级别:管理权限、数据库、表、字段、存储例程

GRANT

帮助: 

  mysql> HELP GRANT;

  mysql> HELP SHOW GRANTS;

查看指定用户获得的权限

  mysql> SHOW  GRANTS FOR  'user'@'host';

查看当前用户所拥有的的权限

  mysql> SHOW GRANTS FOR CURRENT_USER;

基本语法:

GRANT priv_type,... ON  [object_type] db_name.tbl_name  TO 'user'@'host' [IDENTIFIED BY 'password']

注:object_type与db_name.*  类型要一致

priv_type :ALL [PRIVILEGES]、column_list

object_type: {
TABLE            # 默认
| FUNCTION   #存储函数上的权限
| PROCEDURE  #存储过程上的权限

db_name.tbl_name :
*.*  :所有库的所有表
db_name.*    : 指定库的所有表
db_name.tbl_name  : 指定库的指定表
db_name.routine_name :指定库的存储例程

REVOKE 回收权限:

帮助信息:

   mysql> HELP REVOKE;

基本语法:  

REVOKE priv_type,... ON db_name.tb_name FROM 'user'@'host'; 

E.G

mysql> GRANT SELECT,DELETE ON testdb.* TO 'test'@'%' IDENTIFIED BY 'test';

mysql> SHOW GRANTS FOR CURRENT_USER;

MySQL5.7 基础之二

mysql> REVOKE DELETE ON testdb.* FROM 'test'@'%';

MySQL5.7 基础之二

注:MariaDB服务器进程启动时会读取mysql库中的所有授权表至内存中

  (1)使用GRANT或REVOKE等执行权限操作会保存在表中,MariaDB的服务进程会自动重读授权表;

  (2)对于不能够或不能及时重读授权表的命令,可手动让MariaDB的服务进程重读授权表

      mysql>FLUSH PRIVILEGES;

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这