zoukankan      html  css  js  c++  java
  • 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);
    
  • 相关阅读:
    javascript 获取get参数方法(获取url参数方法)详解
    javascript标签页切换功能(极简代码)
    mb_substr()截取中文方法的详解 (加上‘utf-8’,字符串截取不到的问题详解)
    mysql 垂直分表技术的实战演练,有实战代码。
    php+ajax 实战 (使用ajax小技巧)
    最近开发的ECG项目
    android操作线程各种方法解析
    SQLite数据库在多线程写锁文件的解决办法
    SILVERLIGHT 应急卫生模拟演练项目之childwindow
    SILVERLIGHT 应急卫生模拟演练项目之GRID布局
  • 原文地址:https://www.cnblogs.com/jiangxiangxiang/p/10966085.html
Copyright © 2011-2022 走看看