mysql

摘自菜鸟教程,供记忆用

数据库

  • MySQL 创建数据库CREATE DATABASE 数据库名;

  • drop 命令删除数据库drop database <数据库名>;

  • MySQL 选择数据,在你连接到 MySQL 数据库后,可能有多个可以操作的数据库,所以你需要选择你要操作的数据库。use RUNOOB;

数据表

  • MySQL 创建数据表CREATE TABLE table_name (column_name column_type);
  • MySQL 删除数据表DROP TABLE table_name ;

数据记录

  • MySQL 插入数据

    INSERT INTO table_name ( field1, field2,...fieldN )
                           VALUES
                           ( value1, value2,...valueN );
     - 如果数据是字符型,必须使用单引号或者双引号,如:"value"。
    
  • SQL SELECT语句来查询数据。

    SELECT column_name,column_name
    FROM table_name
    [WHERE Clause]
    [LIMIT N][ OFFSET M]
    - 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
    - SELECT 命令可以读取一条或者多条记录。
    - 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
    - 你可以使用 WHERE 语句来包含任何条件。
    - 你可以使用 LIMIT 属性来设定返回的记录数。
    - 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
    
  • MySQL WHERE 子句,我们知道从SELECT 语句用来读取数据。如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。

    SELECT field1, field2,...fieldN FROM table_name1, table_name2...
    [WHERE condition1 [AND [OR]] condition2.....
    - 你可以使用 AND 或者 OR 指定一个或多个条件。
    - WHERE 子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。
    - WHERE 子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。
    - 操作符= <> != > < >= <=可用于 WHERE 子句中。
    
  • MySQL UPDATE 更新

    UPDATE table_name SET field1=new-value1, field2=new-value2
    [WHERE Clause]
    
  • MySQL DELETE 语句

    DELETE FROM table_name [WHERE Clause]
    - 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
    
  • MySQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *****。

    SELECT field1, field2,...fieldN 
    FROM table_name
    WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
    - 你可以在 WHERE 子句中使用LIKE子句。
    - 你可以使用LIKE子句代替等号 =。如果没有使用百分号 **%**, LIKE 子句与等号 **=** 的效果是一样的。
    
  • MySQL UNION 操作符,MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。

    SELECT expression1, expression2, ... expression_n
    FROM tables
    [WHERE conditions]
    UNION [ALL | DISTINCT]
    SELECT expression1, expression2, ... expression_n
    FROM tables
    [WHERE conditions];
    - DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
    - ALL:可选,返回所有结果集,包含重复数据。
    
  • **ORDER BY **排序,如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

    SELECT field1, field2,...fieldN from table_name1, table_name2...
    ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]
    - 你可以设定多个字段来排序。
    - 你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
    
  • GROUP BY 语句,GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

    SELECT column_name, function(column_name)
    FROM table_name
    WHERE column_name operator value
    GROUP BY column_name;
    - 例如:SELECT name, COUNT(*) FROM   employee_tbl GROUP BY name;
    
  • WITH ROLLUP可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:

    mysql> SELECT name, SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
    +--------+--------------+
    | name   | singin_count |
    +--------+--------------+
    | 小丽 |            2 |
    | 小明 |            7 |
    | 小王 |            7 |
    | NULL   |           16 |
    +--------+--------------+
    4 rows in set (0.00 sec)
    其中记录 NULL 表示所有人的登录次数。
    我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:
    select coalesce(a,b,c);
    参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。
    以下实例中如果名字为空我们使用总数代替:
    mysql> SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM  employee_tbl GROUP BY name WITH ROLLUP;
    +--------------------------+--------------+
    | coalesce(name, '总数') | singin_count |
    +--------------------------+--------------+
    | 小丽                   |            2 |
    | 小明                   |            7 |
    | 小王                   |            7 |
    | 总数                   |           16 |
    +--------------------------+--------------+
    4 rows in set (0.01 sec)
    
  • Mysql 连接的使用, JOIN 在两个或多个表中查询数据。你可以在 SELECT, UPDATE 和 DELETE 语句中使用 Mysql 的 JOIN 来联合多表查询。JOIN 按照功能大致分为如下三类:

    • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录
    • LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录
    • RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
  • MySQL NULL 值处理,当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。为了处理这种情况,MySQL提供了三大运算符:

    • IS NULL: 当列的值是 NULL,此运算符返回 true。

    • IS NOT NULL:当列的值不为 NULL, 运算符返回 true。

    • <=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。

      在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false 。

      select * , columnName1+isnull(columnName2,0) from tableName;
      columnName1,columnName2 为 int 型,当 columnName2 中,有值为 null 时,columnName1+columnName2=null, ifnull(columnName2,0) 把 columnName2 中 null 值转为 0。
      
  • MySQL ALTER命令,用来修改数据表名或者修改数据表字段

    • 删除,添加或修改表字段

      • 如下命令使用了 ALTER 命令及 DROP 子句来删除以上创建表的 i 字段:

        mysql> ALTER TABLE testalter_tbl  DROP i;
        如果数据表中只剩余一个字段则无法使用DROP来删除字段。
        
      • MySQL 中使用 ADD 子句来向数据表中添加列,如下实例在表 testalter_tbl 中添加 i 字段,并定义数据类型:

        mysql> ALTER TABLE testalter_tbl ADD i INT;
        执行以上命令后,i 字段会自动添加到数据表字段的末尾。
        mysql> SHOW COLUMNS FROM testalter_tbl;可以查看数据库表中的列
        如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列ALTER TABLE testalter_tbl ADD i INT FIRST;), AFTER 字段名(设定位于某个字段之后ALTER TABLE testalter_tbl ADD i INT AFTER c;)。
        FIRST 和 AFTER 关键字可用于 ADD 与 MODIFY 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置。
        
    • 修改字段类型及名称

      • 如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。

        例如,把字段 c 的类型从 CHAR(1) 改为 CHAR(10),可以执行以下命令:
        mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
        使用 CHANGE 子句, 语法有很大的不同。 在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。尝试如下实例:
        mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
        mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
        
    • 指定是否包含值

      以下实例,指定字段 j 为 NOT NULL 且默认值为100 。
      mysql> ALTER TABLE testalter_tbl 
          -> MODIFY j BIGINT NOT NULL DEFAULT 100;
          如果你不设置默认值,MySQL会自动设置该字段默认为 NULL。
      
    • 修改字段默认值

      mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
      mysql> SHOW COLUMNS FROM testalter_tbl;
      

      你也可以使用 ALTER 命令及 DROP子句来删除字段的默认值,如下实例:

      mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
      mysql> SHOW COLUMNS FROM testalter_tbl;
      

      修改数据表类型,可以使用 ALTER 命令及 TYPE 子句来完成。尝试以下实例,我们将表 testalter_tbl 的类型修改为 MYISAM :

      注意:查看数据表类型可以使用 SHOW TABLE STATUS 语句。

      mysql> ALTER TABLE testalter_tbl ENGINE = MYISAM;
      mysql>  SHOW TABLE STATUS LIKE 'testalter_tbl'\G
      
    • 修改表名

      mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
      

MySQL 索引

索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。

创建索引时,你需要确保该索引是应用在SQL 查询语句的条件(一般作为 WHERE 子句的条件)。

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

普通索引

  • 创建索引,这是最基本的索引,它没有任何限制。它有以下几种创建方式:

    创建索引,如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
    CREATE INDEX indexName ON mytable(username(length)); 
    
    修改表结构(添加索引)
    ALTER table tableName ADD INDEX indexName(columnName)
    
    创建表的时候直接指定
    CREATE TABLE mytable(  
    ID INT NOT NULL,   
    username VARCHAR(16) NOT NULL,  
    INDEX [indexName] (username(length))  
    );  
    
  • 删除索引的语法

    DROP INDEX [indexName] ON mytable; 
    

唯一索引

  • 它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

    创建索引
    CREATE UNIQUE INDEX indexName ON mytable(username(length)) 
    
    修改表结构
    ALTER table mytable ADD UNIQUE [indexName] (username(length))
    
    创建表的时候直接指定
     CREATE TABLE mytable(  
    ID INT NOT NULL,   
    username VARCHAR(16) NOT NULL,  
    UNIQUE [indexName] (username(length))  
    ); 
    

使用ALTER 命令添加和删除索引

有四种方式来添加数据表的索引:

- ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 
  该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
  
- ALTER TABLE tbl_name ADD UNIQUE index_name (column_list):
    这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。

- ALTER TABLE tbl_name ADD INDEX index_name (column_list):
  添加普通索引,索引值可出现多次。

- ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):
  该语句指定了索引为 FULLTEXT ,用于全文索引。

以下实例为在表中添加索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;

使用 ALTER 命令添加和删除主键

主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也可以使用 ALTER 命令删除主键:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
删除主键时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。

显示索引信息

你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。

mysql> SHOW INDEX FROM table_name; \G

MySQL 复制表

如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等。 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的。如何完整的复制MySQL数据表,步骤如下:

  • 使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。mysql> SHOW CREATE TABLE runoob_tbl \G;

  • 复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。mysql> CREATE TABLE clone_tbl ......

  • 如果你想复制表的内容,你就可以使用 INSERT INTO ... SELECT 语句来实现。执行完第二步骤后,你将在数据库中创建新的克隆表 clone_tbl。 如果你想拷贝数据表的数据你可以使用 INSERT INTO... SELECT 语句来实现。

    mysql> INSERT INTO clone_tbl (runoob_id,
        ->                        runoob_title,
        ->                        runoob_author,
        ->                        submission_date)
        -> SELECT runoob_id,runoob_title,
        ->        runoob_author,submission_date
        -> FROM runoob_tbl;
    Query OK, 3 rows affected (0.07 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    执行以上步骤后,你将完整的复制表,包括表结构及表数据。
    

MySQL 序列使用

MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。使用 AUTO_INCREMENT

MySQL 处理重复数据

防止表中出现重复数据

  • 你可以在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一)索引来保证数据的唯一性。

  • INSERT IGNORE INTO 与 INSERT INTO 的区别就是 INSERT IGNORE 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。

以下实例使用了 INSERT IGNORE INTO,执行后不会出错,也不会向数据表中插入重复数据:
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
    -> VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
    -> VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)
INSERT IGNORE INTO 当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。 而 REPLACE INTO 如果存在 primary 或 unique 相同的记录,则先删除掉。再插入新记录。
  • 另一种设置数据的唯一性方法是添加一个 UNIQUE 索引,如下所示:

    CREATE TABLE person_tbl
    (
       first_name CHAR(20) NOT NULL,
       last_name CHAR(20) NOT NULL,
       sex CHAR(10),
       UNIQUE (last_name, first_name)
    );
    

统计重复数据

以下我们将统计表中 first_name 和 last_name的重复记录数:

mysql> SELECT COUNT(*) as repetitions, last_name, first_name
    -> FROM person_tbl
    -> GROUP BY last_name, first_name
    -> HAVING repetitions > 1;
  
  以上查询语句将返回 person_tbl 表中重复的记录数。 一般情况下,查询重复的值,请执行以下操作:
- 确定哪一列包含的值可能会重复。
- 在列选择列表使用COUNT(*)列出的那些列。
- 在GROUP BY子句中列出的列。
- HAVING子句设置重复数大于1。

过滤重复数据

如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。

mysql> SELECT DISTINCT last_name, first_name
    -> FROM person_tbl;

你也可以使用 GROUP BY 来读取数据表中不重复的数据:

mysql> SELECT last_name, first_name
    -> FROM person_tbl
    -> GROUP BY (last_name, first_name);

删除重复数据

如果你想删除数据表中的重复数据,你可以使用以下的SQL语句:

mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl  GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;

当然你也可以在数据表中添加 INDEX(索引) 和 PRIMAY KEY(主键)这种简单的方法来删除表中的重复记录。方法如下:

mysql> ALTER IGNORE TABLE person_tbl
    -> ADD PRIMARY KEY (last_name, first_name);

posted on 2019-06-03 10:19  j_x_x  阅读(124)  评论(0编辑  收藏  举报

导航