zoukankan      html  css  js  c++  java
  • 数据表的操作

    操作表

    增:

      语法:create table 表名(

      字段名 列类型 [可选的参数], ### 记住加逗号

       字段名 列类型 [可选的参数], ### 记住加逗号

       字段名 列类型 [可选的参数] ### 最后一行不加逗号

      )charset utf8;

      列约束:(*********************)
      auto_increment : 自增 1 用于ID值
      primary key : 主键索引,加快查询速度, 列的值不能重复
      not noll    标识该字段不能为空
      default  为该字段设置默认值

      例子1:

        create table t1(
        id int,
        name char(5)
        )charset=utf8;

        Query OK, 0 rows affected (0.72 sec) #### 如果回显是queryok,代表创建成功

       增加数据
       语法:
          insert into 表名 (列1, 列2) values (值1,'值2');
          例子:
            insert into t1 (id, name) values (1, 'zekai');
            insert into t1 (id, name) values (1, 'zekai2');
          查询数据:
        语法:
          select 列1, 列2 from 表名; (*代表查询所有的列)
          例子:
            mysql> select * from t1;

            +------+-------+
            | id | name |
            +------+-------+
            | 1 | zekai |
            +------+-------+
            1 row in set (0.00 sec)

      例子2:

        create table t2(
          id int auto_increment primary key,
          name char(10)
        )charset=utf8;

                  insert into t2 (name) values ('zekai1');

      例子3:

        create table t3(
          id int unsigned auto_increment primary key,
          name char(10) not null default 'xxx',
          age int not null default 0
        )charset=utf8;

        mysql> insert into t3 (age) values (10);
        Query OK, 1 row affected (0.05 sec)

        mysql> select * from t3;
        +----+------+-----+
        | id | name | age |
        +----+------+-----+
        | 1 | xxx | 10 |
        +----+------+-----+

      列类型

          create table 表名(
            字段名 列类型 unsigned [可选的参数], ### 记住加逗号
            字段名 列类型 [可选的参数], ### 记住加逗号
            字段名 列类型 [可选的参数] ### 最后一行不加逗号
            .....
          )charset=utf8; #### 后面加分号

          - 数字
            - 整型
            tinyint  (-128,127)  (0,255)
            smallint (-32768,32767)  (0,65535)
            int (**********)(-2 147 483 648,2 147 483 647)  (0,4 294 967 295)推荐使用
            mediumint
            bigint
        

            a.整数类型
            b.取值范围
            c.unsigned 加上代表不能取负数 只适用于整型

            应用场景:
              根据公司业务的场景,来选取合适的类型

          - 浮点型 (***********)
            create table t5(
              id int auto_increment primary key,
              salary decimal(16,10),
              num float
            )charset=utf8;

            float: 不一定精确 (m,d)m是数字总个数,d是小数点后个数
            decimal: 非常的精确的数字 (5000.23) decimal(6, 2) m是数字总个数(负号不算),d是小数点后个数。
       例子1:
          正好 10 位:
          mysql> insert into t5 (salary, num) values (500023.2312345678, 5000.2374837284783274832);
          Query OK, 1 row affected (0.04 sec)

          mysql> select * from t5;
          +----+-------------------+---------+
          | id | salary | num |
          +----+-------------------+---------+
          | 1 | 500023.2312345678 | 5000.24 |
          +----+-------------------+---------+
          1 row in set (0.00 sec)
       例子2:
          少于10位:用0  补足
          mysql> insert into t5 (salary, num) values (500023.231234567, 5000.2374837284783274832);
          Query OK, 1 row affected (0.04 sec)

          mysql> select * from t5;
          +----+-------------------+---------+
          | id | salary | num |
          +----+-------------------+---------+
          | 1 | 500023.2312345678 | 5000.24 |
          | 2 | 500023.2312345670 | 5000.24 |
          +----+-------------------+---------+
       例子3:
          多于10位:四舍五入
          mysql> insert into t5 (salary, num) values (500023.23123456789, 5000.2374837284783274832);
          Query OK, 1 row affected, 1 warning (0.03 sec)

          mysql> select * from t5;
          +----+-------------------+---------+
          | id | salary | num |
          +----+-------------------+---------+
          | 1 | 500023.2312345678 | 5000.24 |
          | 2 | 500023.2312345670 | 5000.24 |
          | 3 | 500023.2312345679 | 5000.24 |
          +----+-------------------+---------+

        - 字符串

          - char(长度) : 定长
            create table t6(
              id  int unsigned auto_increment primary key,
              name char(10) not null default 'xxx',
            )charset=utf8;

          - varchar(长度):变长
            create table t6(
              id int auto_increment primary key,
              name varchar(10) not null default 'xxx'
            )charset=utf8;

         mysql> insert into t6 (name) values ('hello');
         Query OK, 1 row affected (0.03 sec)

            mysql> select * from t6;
            +----+-------+
         | id | name |
            +----+-------+
            | 1 | hello |
            +----+-------+
            1 row in set (0.00 sec)

            mysql> insert into t6 (name) values ('hellodbsabdsjabjdsa');
            ERROR 1406 (22001): Data too long for column 'name' at row 1

        区别:
          char: 定长, 无论插入的字符是多少个,永远固定占规定的长度
        场景:
          1. 身份证
          2. 手机号 char(11)
          3. md5加密之后的值,比如密码 等 char(32)

        varchar: 变长, 根据插入的字符串的长度来计算所占的字节数,但是有一个字节是用来保存字符串的大小的

        注意:如果, 不能确定插入的数据的大小, 一般建议使用 varchar(255)

        - 时间日期类型
          YEAR
            YYYY(1901/2155)

          DATE
            YYYY-MM-DD(1000-01-01/9999-12-31)

          TIME
            HH:MM:SS('-838:59:59'/'838:59:59')

          DATETIME (***************************)

            YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)

          TIMESTAMP

            YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)

          例子:
            create table t8(
              d date,
              t time,
              dt datetime
            );
            mysql> insert into t8 values(now(),now(),now());
            Query OK, 1 row affected, 1 warning (0.08 sec)

            mysql> select * from t8;
            +------------+----------+---------------------+
            | d | t | dt |
            +------------+----------+---------------------+
            | 2019-10-29 | 10:49:51 | 2019-10-29 10:49:51 |
            +------------+----------+---------------------+
            1 row in set (0.00 sec)
            insert into t8 values(now(),now(),now());

            - 枚举
              列出所有的选项
              create table t9 (
                id int auto_increment primary key,
                gender enum('male','female')
              )charset utf8;

            mysql> insert into t9 (gender) values ('male');
            Query OK, 1 row affected (0.04 sec)

            mysql> insert into t9 (gender) values ('female');
            Query OK, 1 row affected (0.03 sec)

            mysql> insert into t9 (gender) values ('dshajjdsja');

     改

    1. 修改表名
    alter table 旧表名 rename 新表名;

    mysql> alter table t8 rename t88;
    Query OK, 0 rows affected (0.19 sec)

    2. 增加字段
    alter table 表名
    add 字段名 列类型 [可选的参数],
    add 字段名 列类型 [可选的参数];

    mysql> alter table t88 add name varchar(32) not null default '';
    Query OK, 0 rows affected (0.82 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    上面添加的列永远是添加在最后一列之后

    alter table 表名
    add字段名 列类型 [可选的参数] first;

    mysql> alter table t88 add name3 varchar(32) not null default '' first;
    Query OK, 0 rows affected (0.83 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    alter table 表名
    add 字段名 列类型 [可选的参数] after字段名;
    mysql> alter table t88 add name4 varchar(32) not null default '' after d;
    Query OK, 0 rows affected (0.68 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    3. 删除字段
    alter table 表名 drop 字段名;

    mysql> alter table t88 drop name4;
    Query OK, 0 rows affected (0.66 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    4. 修改字段
    alter table 表名 modify 字段名 数据类型 [完整性约束条件…];

    mysql> alter table t88 modify name2 char(20); #修改的原name2后面的约束条件
    Query OK, 1 row affected (0.88 sec)
    Records: 1 Duplicates: 0 Warnings: 0

    alter table表名 change 旧字段名 新字段名 新数据类型 [完整性约束条件…];

    mysql> alter table t88 change name2 name22 varchar(32) not null default '';
    Query OK, 1 row affected (0.82 sec)
    Records: 1 Duplicates: 0 Warnings: 0

    mysql> alter table t88 change name22 name23;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1


    drop table 表名; #### 线上禁用
    mysql> drop table t9;
    Query OK, 0 rows affected (0.18 sec)

    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | t1 |
    +----------------+
    1 row in set (0.00 sec)

    复制表结构:like
    mysql> ## 1. 查看t88表的创建语句
    mysql> show create table t88;
    +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table |
    +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | t88 | CREATE TABLE `t88` (
    `name3` varchar(32) NOT NULL DEFAULT '',
    `d` date DEFAULT NULL,
    `t` time DEFAULT NULL,
    `dt` datetime DEFAULT NULL,
    `name` varchar(32) NOT NULL DEFAULT '',
    `name22` varchar(32) NOT NULL DEFAULT ''
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    +-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.01 sec)

    mysql> ## 2. like
    mysql> create table t89 like t88;
    Query OK, 0 rows affected (0.33 sec)

    操作表数据行

    增加数据:

    语法: insert into 表名 (列1, 列2) values (值1,'值2');

    例子: insert into t1 (id, name) values (1, 'zekai');

    insert into t1 (id, name) values (1, 'zekai2');

    insert into t1 (id, name) values (1, 'zekai2'),(2, 'zekai3'),(3,'zekai4');

    delete from 表名 where 条件;
    mysql> delete from t5 where id=1;
    mysql> delete from t5 where id>1;
    mysql> delete from t5 where id>=1;
    mysql> delete from t5 where id<1;
    mysql> delete from t5 where id<=1;
    mysql> delete from t5 where id>=1 and id<10;
    Query OK, 1 row affected (0.06 sec)

    delete from 表名; 删除表中所有的数据

    此时删完所有数据后,再填入数据,id会接着原来的自增。

    mysql> insert into t5 (salary, num) values (500023.2312345679, 5000.24);
    Query OK, 1 row affected (0.08 sec)

    mysql> select * from t5;
    +----+-------------------+---------+
    | id | salary | num |
    +----+-------------------+---------+
    | 4 | 500023.2312345679 | 5000.24 |
    +----+-------------------+---------+
    1 row in set (0.00 sec)

    truncate 表名; #### 没有where条件的
    mysql> truncate t5;
    Query OK, 0 rows affected (0.25 sec)

    mysql> select * from t5;
    Empty set (0.00 sec)

    mysql> insert into t5 (salary, num) values (500023.2312345679, 5000.24);
    Query OK, 1 row affected (0.06 sec)

    mysql> select * from t5;
    +----+-------------------+---------+
    | id | salary | num |
    +----+-------------------+---------+
    | 1 | 500023.2312345679 | 5000.24 |
    +----+-------------------+---------+
    1 row in set (0.00 sec)

    区别:
    1. delete之后,插入数据从上一次主键自增加1开始, truncate则是从1开始
    2. delete删除, 是一行一行的删除, truncate:全选删除 truncate删除的速度是高于delete的

    update 表名 set 列名1=新值1,列名2=新值2 where 条件;
    mysql> update t66 set name='xxxx' where id=30;
    Query OK, 1 row affected (0.04 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    mysql> update t66 set name='xxxx' where id<30;
    mysql> update t66 set name='xxxx' where id<=30;
    mysql> update t66 set name='xxxx' where id>=30;
    mysql> update t66 set name='xxxx' where id>30;
    mysql> update t66 set name='xxxx' where id>20 and id<32;
    mysql> update t66 set name='xxxx' where id>20 or name='zekai';

    Query OK, 1 row affected (0.04 sec)
    Rows matched: 1 Changed: 1 Warnings: 0

    语法:
    select 列1, 列2 from 表名; (*代表查询所有的列)
    select * from 表名; (*代表查询所有的列)
    select * from t66 where id>30 and id<40;
    select * from t66 where id>30;
    select * from t66 where id<30;
    select * from t66 where id<=30;
    select * from t66 where id>=30;
    select * from t66 where id!=30;
    select * from t66 where id<>30;
    mysql> select * from t1;
    +------+-------+
    | id | name |
    +------+-------+
    | 1 | zekai |
    +------+-------+
    1 row in set (0.00 sec)

    between..and...: 取值范围是闭区间

    select * from t66 where id between 30 and 40;
    mysql> select * from t66 where id between 31 and 33;
    +----+--------+
    | id | name |
    +----+--------+
    | 31 | dsadsa |
    | 32 | dsadsa |
    | 33 | dsadsa |
    +----+--------+

    避免重复distinct
    mysql> select distinct name from t66;
    +--------+
    | name |
    +--------+
    | xxxx |
    | hds |
    | dsadsa |
    +--------+
    3 rows in set (0.00 sec)

    通过四则运算查询 (不要用)
    mysql> select name, age*10 from t3;
    +------+--------+
    | name | age*10 |
    +------+--------+
    | xxx | 100 |
    +------+--------+
    1 row in set (0.01 sec)

    mysql> select name, age*10 as age from t3;
    +------+-----+
    | name | age |
    +------+-----+
    | xxx | 100 |
    +------+-----+
    1 row in set (0.02 sec)

    in(80,90,100):

    mysql> select * from t66 where id in (23,34,11);
    +----+------+
    | id | name |
    +----+------+
    | 11 | xxxx |
    | 23 | hds |
    +----+------+
    2 rows in set (0.04 sec)

    like : 模糊查询     一般不用
    以x开头:
    mysql> select * from t66 where name like 'x%';
    +----+------+
    | id | name |
    +----+------+
    | 1 | xxxx |
    | 2 | xxxx |
    | 3 | xxxx |
    | 4 | xxxx |
    | 8 | xxxx |
    | 9 | xxxx |
    | 10 | xxxx |
    | 11 | xxxx |
    | 15 | xxxx |
    | 16 | xxxx |
    | 17 | xxxx |
    | 18 | xxxx |
    | 30 | xxxx |
    +----+------+
    13 rows in set (0.05 sec)

    以x结尾:
    mysql> select * from t66 where name like '%x';
    +----+------+
    | id | name |
    +----+------+
    | 1 | xxxx |
    | 2 | xxxx |
    | 3 | xxxx |
    | 4 | xxxx |
    | 8 | xxxx |
    | 9 | xxxx |
    | 10 | xxxx |
    | 11 | xxxx |
    | 15 | xxxx |
    | 16 | xxxx |
    | 17 | xxxx |
    | 18 | xxxx |
    | 30 | xxxx |
    +----+------+
    13 rows in set (0.00 sec)

    包含x的:
    mysql> select * from t66 where name like '%x%';


  • 相关阅读:
    背包解法
    第十六周周总结
    软件工程个人课程总结
    学期课后个人总结
    spring事务
    梦断代码03
    团队冲刺的第二十四天
    第十五周周总结
    百度输入法评价
    找到水王
  • 原文地址:https://www.cnblogs.com/fjn839199790/p/11760128.html
Copyright © 2011-2022 走看看