MySQL数据库基础-基本语法

299 阅读6分钟

概要

MySQL 数据库管理系统(DBMS)全称 database mange system,通过SQL语句操作,SQL 的全称是 Structure Query Language,结构化的查询语言,它是一种针对表关联关系所设计的一门语言。

语法分类

  • 数据定义语法: 简称DDL (Data Definition Language),用来定义数据库对象:数据库、表、列等 (关键字: create,drop等)
  • 数据操作语法: 简称DML (Data Manipulation Language),用来对数据库中表的记录进行更新 (关键字: insert,update,delete等)
  • 数据查询语法: 简称DQL(Data Query Language),用来查询数据库中表的记录 (关键字: select)
  • 数据控制语法: 简称DCL(Data Control Language),用来定义数据库访问权限和安全级别,创建用户等。 (关键字: grant,revoke)

DDL-数据定义语法

创建数据库

    CREATE DATABASE [dbname];
    -- 设置字符集
    CREATE DATABASE [dbname] CHARACTER SET [charset_name];
    -- 设置校对规则
    CREATE DATABASE [dbname] COLLATE [collation_name];
    -- 创建语句
    CREATE DATABASE [dbname] CHARACTER SET [charset_name] COLLATE [collation_name];
    
    -- 查看当前服务器中所有数据库
    SHOW DATABASES
    -- 查看已创建的数据库的定义信息
    SHOW CREATE DATABASE [dbname]
    -- 查看已创建的数据库的定义信息
  • 注意细节
  1. charset_name: 默认 utf8
  2. collation_name: 默认 utf8_general_ci 不区分大小写 , utf8_bin 区分大小写
  3. 创建或者查看数据库的时候,可以使用反引号 ``, 规避关键词,可以使用关键字

删除数据库

    DROP DATABASE [dbname];
    DROP DATABASE IF EXISTS [dbname];

创建表

    CREATE TABLE [tablename](
           [columnname] [datatype],
           [columnname] [datatype],
           [columnname] [datatype],
    ) CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE INNODB;
  • 注意细节
  1. 如果在创建表的时候不设置字符集CHARACTER SET和校对规则COLLATE,会默认使用数库的字符集和校对规则
  2. 可是使用 CHARSET 代替 CHARACTER SET

删除表

    DROP TABLE [tablename];

修改表

    -- 添加列
    -- 单条 
    ALTER TABLE [tablename] ADD [column] [datatype] [NOT NULL?] [DEFAULT expr?] ;
    -- 多条
    ALTER TABLE [tablename] 
        ADD [column] [datatype] [NOT NULL?] [DEFAULT expr?], 
        ADD [column] [datatype] [NOT NULL?] [DEFAULT expr?];
    -- 多条
    ALTER TABLE [tablename] ADD (
        [column] [datatype] [NOT NULL?] [DEFAULT expr]
    );

    -- 修改列 --------------------------------------------------------------------
    -- 单条
    ALTER TABLE [tablename] MODIFY [column] [datatype] [NOT NULL?] [DEFAULT expr?];
    -- 多条
    ALTER TABLE [tablename] 
        MODIFY [column] [datatype] [NOT NULL?] [DEFAULT expr?],
        MODIFY [column] [datatype] [NOT NULL?] [DEFAULT expr?];

    -- 删除列 --------------------------------------------------------------------
    -- 单条
    ALTER TABLE [tablename] DROP [column];
    -- 多条
    ALTER TABLE [tablename] 
        DROP [column],
        DROP [column];
        
    -- 修改表名 ------------------------------------------------------------------
    RENAME TABLE [tablename] TO [tablename]; 
    
    -- 修改表的字符集 ------------------------------------------------------------
    ALTER TABLE [tablename] CHARACTER SET [charset_name];
    
    -- 修改表的列名 --------------------------------------------------------------
    -- 单条
    ALTER TABLE [tablename] CHANGE [columnname] [new_columnname] [NOT NULL?] [DEFAULT expr?];
    -- 多条
    ALTER TABLE [tablename]
        CHANGE [columnname] [new_columnname] [NOT NULL?] [DEFAULT expr?],
        CHANGE [columnname] [new_columnname] [NOT NULL?] [DEFAULT expr?];

查看表

    DESC [tablename];

DML-数据操作语法

添加数据

    --单条
    INSERT INTO [tablename] ([columnname1],[columnname3],[columnname4]) 
        VALUES ([columnvalue1],[columnvalue2],[columnvalue3]);
    --多条
    INSERT INTO [tablename] ([columnname1],[columnname3],[columnname4]) 
        VALUES
        ([columnvalue1],[columnvalue2],[columnvalue3]),
        ([columnvalue1],[columnvalue2],[columnvalue3]),
        ([columnvalue1],[columnvalue2],[columnvalue3]);
  • 注意细节
  1. 字段的数据类型中字符串的整型会自动转换datatype:int, 值为"30"存入后为30
  2. 字符和日期类型应该包含在单引号中''
  3. 插入的值是否可以NULL,取决于创建列时是否指定了NOT NULL
  4. 如果给表中所有的列添加值,可以不写 VALUES 前面的列名
  5. 默认值的使用: 如果列有指定 NOT NULL,那么添加数据的时候默认会给NULL, 如果期望是一个指定的默认值是使用DEFAULT [value]来设置

更新数据

    -- 无条件更新
    UPDATE [tablename] 
        SET 
        [columnname] = [columnvalue]
        
    -- 有条件更新
    UPDATE [tablename] 
        SET 
        [columnname] = [columnvalue]
        WHERE 
        [columnname] = [columnvalue]
        
    -- 原有条件上更新    
    UPDATE [tablename] 
        SET
        [columnname] = [columnname] + [columnvalue:100]
    
    -- 更新多个字段数据   
    UPDATE [tablename] 
        SET 
        [columnname] = [columnvalue], 
        [columnname] = [columnvalue];       

删除数据

    DELETE FROM [tablename] WHERE [columnname] = [columnvalue]
  • 注意细节
  1. 没有WHERE会添加所有数据

DQL-数据查询语法

基本查询

```sql
   -- 可以使用表达式或者列名查询
   SELECT [ * | columnname | expr,columnname | expr,...] FROM [tablename];
   
   -- 查询语句中使用as 设置别名
   SELECT [columnname] AS [alias] FROM [tablename];
   
   --  DISTINCT 去重,查询的列值相等
   SELECT DISTINCT [ * | columnname | expr,columnname | expr,...] FROM [tablename];
```

子句-条件查询

```sql
   SELECT [ * | columnname | expr,columnname | expr,...] 
       FROM [tablename]
       WHERE [expr];
```
  • 注意细节

1.WHERE子句中经常使用的运算符

类型表达式说明
比较运算符
> < <= >= = <> !=大于,小于,大于等于,小于等于,不等于(两种方式)
BETWEEN ...AND...在某一个区间
IN(set)IN列表中的指定值查询 例:IN(10,200), 实际是 OR的简写
LIKE '%..%'
NOT LIKE '..'
模糊查询
IS NULL判断是否为空
逻辑运算符
AND多个条件同时成立
OR多个条件任意一条成立
NOT不成立 例:WHERE NOT(val > 100)

子句-排序查询

```sql
   --升序 ASC
   SELECT [ * | columnname | expr,columnname | expr,...] 
       FROM [tablename]
       WHERE [expr];
       ORDER BY [columnname] ASC
       
    --降序  DESC
    SELECT [ * | columnname | expr,columnname | expr,...] 
       FROM [tablename]
       ORDER BY [columnname]  DESC
       
    --多组数据排序方式
    SELECT *FROM [tablename]
       ORDER BY [columnname]  ASC ,  [columnname]  DESC
```
  • 注意细节
  1. ORDER BY 可以是表中的列名,也可以是SELECT语句后指定的AS别名
  2. ORDER BY ASC默认升序 DESC降序
  3. ORDER BY 子句应该位于 SELECT语句的结尾

子句-分组查询

    SELECT [columnname], SUM(columnname1) AS [as_columnname1],AVG(columnname2) AS [as_columnname2] 
    FROM [tablename] 
    GROUP BY [as_columnname1] ,[as_columnname2];
    
     SELECT [columnname], SUM(columnname1) AS [as_columnname1],AVG(columnname2) AS [as_columnname2] 
    FROM [tablename] 
    GROUP BY [as_columnname1], [as_columnname2] HAVING [expr];
  • 注意细节
  1. HAVING 是对一个表的数据进行了分组之后,对“组信息”进行相应 条件筛选,HAVING,只能根据select子句中可出现的字段(数据)来进行条件设定,HAVING子句与WHERE子句一样,都是用于条件判断的。

子句-分页查询

     SELECT * FROM [tablename] 
         GROUP BY [as_columnname1] 
         LIMIT [start] ,[rows]
  • 注意细节
  1. LIMIT [每页显示数 * (页数-1)] , [每页显示数]

自链接查询

     SELECT * FROM [tablename1] [as_tablename1] ,[tablename1] [as_tablename2]

子查询-单列

    -- 单行子查询
     SELECT * FROM [tablename] 
         WHERE [columnname] = (
          SELECT * FROM [tablename] WHERE [columnname]
         )
      
      -- 多行子查询
      SELECT * FROM [tablename] 
         WHERE [columnname] IN (
          SELECT * FROM [tablename] WHERE [columnname]
         )

子查询-多列

    // 子句中只能是一条数据
     SELECT * FROM  [tablename]
         WHERE([columnname1], [columnname1]) = (
              SELECT [columnname1], [columnname1] FROM [tablename] 
         )
         
     // 子句中只能是多条数据
     SELECT * FROM  [tablename]
         WHERE([columnname1], [columnname1]) IN (
              SELECT [columnname1], [columnname1] FROM [tablename] 
         )
   

子查询-临时表

    // 子查询临时表
     SELECT *
         FROM ( 
             SELECT * FROM [tablename] WHERE [columnname] 
         ) [temp_tablename]
         WHERE [condition]
         
     SELECT *
         FROM ( 
             SELECT * FROM [tablename] WHERE [columnname] 
         ) [temp_tablename] ,[tablename]
         WHERE [condition]
   

子查询 ALL&ANY

    // ALL 表示比之所有都要的...的数据
     SELECT * FROM  [tablename]
         WHERE [columnname] > ALL(
              SELECT * FROM [tablename] WHERE [condition] 
         )
         
      // ANY 表示比之其中之一都要的...的数据   
      SELECT * FROM  [tablename]
         WHERE [columnname] > ANY(
              SELECT * FROM [tablename] WHERE [condition] 
         )
   

合并查询 UNION ALL & UNION

    SELECT * FROM  [tablename] UNION ALL SELECT * FROM  [tablename]
    SELECT * FROM  [tablename] UNION SELECT * FROM  [tablename]
  • 细节
  1. UNION ALL 不会去重 UNION 会去重

外链接查询 LEFT JOIN...ON & RIGHT JOIN...ON

    SELECT * FROM  [tablename1] LEFT JOIN [tablename2] ON [condition] 
    SELECT * FROM  [tablename1] RIGHT JOIN [tablename2] ON [condition] 
  • 细节
  1. LEFT JOIN...ON 左表为主全部显示 RIGHT JOIN...ON 右表为主全部显示

总结

    -- 基本顺序
     SELECT [columnname...]
         FROM [tablename] 
         GROUP BY [columnname...]
         HAVING [condition...]
         ORDER BY [columnname...]
         LIMIT [start] ,[rows]
  • 总体细节
  1. 日期可以类型可以直接比较查询
  2. %表示0到多个任意字符
  3. _表示单个任意字符
  4. 数据库中判断 NULL需要使用 IS NULL
  5. 多表查询默认情况下,实际是笛卡尔集的数据

DCL-数据控制语法

备份和恢复数据库

需要在 Dos 中命令行执行

    -- 备份数据库,不写密码的时候会在执行的时候填写
    -- mysqldump -u root -p -B db1 db2 > e:/dbbackup.sql
    mysqldump -u [username] -p [password] -B [dbname1 dbname2] > [backup file].sql
    
    -- 备份表
    -- mysqldump -u root -p db table1 table2 > e:/dbbackup.sql
     mysqldump -u [username] -p [password] [dbname] [tablename1 tablename2] > [backup file].sql
     
    -- 恢复
    -- source [backup file].sql
      source e:/dbbackup.sql
    

参考资料

138 张图带你 MySQL 入门
MySQL 三万字精华总结 + 面试100 问,和面试官扯皮绰绰有余(收藏系列)
MySQL 一文搞懂MySQL语法(进阶)