MySQL入门(6)- 创建表、表的复制、增/删/改 表结构

本文详细介绍了MySQL中创建、复制及修改表结构的操作,包括数据类型选择、字段约束、默认值设定。同时,展示了如何向表中插入数据、更新和删除记录。还探讨了字符编码问题,以及SQL脚本的使用。此外,通过实例演示了如何利用ALTER TABLE语句增加、修改和删除字段。

创建表、表的复制、增/删/改 表结构

此系列记录PN视频学习笔记


* 本博客涉及到的数据为bjpowernode.sql,数据见文末,SQL文见MySQL入门(9)文末。

* 该数据有三张表,分别是部门表dept(deptno部门编号、dname部门名称、loc位置)、

                                       员工表emp(empno工号、ename员工姓名、job职位、mgr直属领导工号、

                                                            hiredate入职日期、sal月薪、comm补贴、deptno部门编号)、

                                        薪水等级表salgrade(grade等级、losal区间下限、hisal区间上限)



   1、表格(table),用来存储数据,表格是一种格式化文件。

    2、表格行被称为记录(表中的数据),表格列被称为字段。

    3、表格的字段属性包括:字段名称、字段数据类型、字段长度、字段约束

    4、建表最大的难度是字段个数,每个字段的长度,数据类型

    5、语法结构:

    create table tableName(

    columnName dataType(length),

    columnName dataType(length),

columnName dataType(length),

);

set character_set_results= ‘gbk’;


 6、关于MYSQL数据库中的数据类型

           -varchar

                    * 可变长度字符串:根据实际长度动态分配储存空间

                    * varchar(3)表示存储的数据不能超过3个字符长度

           -char

                    * 定长字符串:不用判断,效率高

                    * varchar和char相比:

                                - 都是字符串类型

                                - varchar比较只能,可以根据实际数据长度分配空间,比较节省空间,

                                    但是在分配的时候需要执行相关的判断程序,效率较低

                                - char不需要动态分配空间,所以执行效率很高,但是可能会导致空间浪费。

                                - 若字段中数据不具备伸缩性,如性别,建议采用char类型存储

                                - 若字段数据具备很强伸缩性,建议采用varchar类型存储

                    * char(3) 表示存储的数据不能超过3个字符长度

           -int

                    * 整数型

                    * int(3)表示最大可以存储999

           -bigint

                    * 长整型

                    * 对应java程序中的long类型

           -float

                    * 浮点型单精度

           -double

                    * 浮点型双精度

                    * double(7,2),表示7个有效数字,两个小数位

           -date

                    * 日期类型

                    * 在实际开发中为了通用,所以日期类型一般不使用,一般采用字符代替

           -blob

                    * Binary LargeObject  二进制大对象

                    * 专门存储图片、声音、视频等数据

                    * 数据库表中存储一个图片是很常见的,但是存储一个比较大的时间是很少的,一般都是提供一个视频的链接地址

           -clob

                    * CharacterLarge Object  字符大对象

                    * 可以存储比较大的文本,4G+的字符串可以被储存

           - 其他...

 

    7、创建表格【学生表】

       字段:学号【int】、姓名【varchar】、性别【char】、出生日期【date】、邮箱地址【varchar】

       建表语句:

       CREATE TABLE t_student(

                        no INT(15),

                        name VARCHAR(32),

                        gender CHAR(1),

                        birth DATE,

                        email VARCHAR(128)

);

 

注意: *表格名字最好以t_或者tbl_开始,增强可读性

       * VARCHAR最好是2的幂数,方便储存中文

        mysql>desc t_student;

        +--------+--------------+------+-----+---------+-------+

        |Field  | Type         | Null | Key | Default | Extra |

        +--------+--------------+------+-----+---------+-------+

        | no     | int(15)      | YES |     | NULL    |      |

        | name   | varchar(32)  | YES |     | NULL    |      |

        | gender |char(1)      | YES  |     |NULL    |       |

        |birth  | date         | YES |     | NULL    |      |

        |email  | varchar(128) | YES  |     |NULL    |       |

        +--------+--------------+------+-----+---------+-------+

删除表格:

       drop table t_student;【若数据可中没有t_student,会报错】

       drop table if exists t_student;【最好此阿勇这种方式删除一个表格,是MYSQL的特色,其他数据库没有】

 

    8、向t_student表格中插入数据

       8.1向表格中插入数据必须使用insert语句,这属于DML语句

       8.2DML语句包括:insert,delet,update【增删改表中的数据,与表的结构无关】

       8.3insert语句的语法格式:

              INSERTINTO tablename(columnname1,columnname2,columnname3...)values(value1,value2,value3...)

              字段和值必须一一对应:个数必须相同,数据类型必须一致。

       8.4向t_student表格中插入数据

             INSERTINTO t_student(no,name,gender,birth,email)

            INSERT INTO t_student(no,name,gender,birth,email) 

            mysql> select * from t_student;

            +------+----------+--------+------------+--------------------------+

            | no   |name     | gender | birth      | email                    |

            +------+----------+--------+------------+--------------------------+

            |    1 |zhangsan | m      | 1970-10-11 |zhangsan@bjpowernode.com |

            |    2 |lisi     | f      | 1971-10-11 | lisi@bjpowernode.com     |

            +------+----------+--------+------------+--------------------------+

 

    8.5 可以这样执行insert语句吗?

    INSERT into t_student(no,email) VALUES(3,’wangwu@163.com’);

    mysql> select * from t_student;

    +------+----------+--------+------------+--------------------------+

    | no   | name     | gender | birth      | email                    |

    +------+----------+--------+------------+--------------------------+

    |    1 | zhangsan | m      | 1970-10-11 | zhangsan@bjpowernode.com |

    |    2 | lisi     | f     | 1971-10-11 | lisi@bjpowernode.com    |

    |    3 | NULL     | NULL  | NULL       | wangwu@163.com           |

    +------+----------+--------+------------+--------------------------+

默认情况下:当一张表被创建之后,没有指定约束的话,可以为NULL,并且没有指定任何默认值的话,默认值即使NULL,这里默认值NULL表示:若插入数据时没有给该字段指定任何数据,默认插入NULL值。

 

    我们可以再向no,gender,birth字段插入值吗?

    mysql> INSERT INTO t_student(no,gender,birth)VALUES(3,'m','1990-11-12');

    mysql> select * from t_student;

    +------+----------+--------+------------+--------------------------+

    | no   | name     | gender | birth      | email                    |

    +------+----------+--------+------------+--------------------------+

    |    1 | zhangsan | m      | 1970-10-11 | zhangsan@bjpowernode.com |

    |    2 | lisi     | f     | 1971-10-11 | lisi@bjpowernode.com    |

    |    3 | NULL     | NULL  | NULL       | wangwu@163.com           |

    |    3 | NULL     | m     | 1990-11-12 | NULL                    |

    +------+----------+--------+------------+--------------------------+

    以上执行insert语句只能导致底层数据可表中新增一条记录。

    若希望NULL变成其他数据,需要使用UPDATE语句进行更新操作。

 

8.6 INSERT 语句中字段的名字可以省略吗?

   INSERT INTO t_student() VALUES(4,'zhaoliu','m','1970-11-13','zhaoliu@163.com');

  mysql>select * from t_student;

  +------+----------+--------+------------+--------------------------+

   | no   | name     | gender | birth      | email                    |

   +------+----------+--------+------------+--------------------------+

    |    1 | zhangsan |m      | 1970-10-11 |zhangsan@bjpowernode.com |

    |    2 | lisi     | f     | 1971-10-11 | lisi@bjpowernode.com    |

    |    3 | NULL     | NULL  | NULL       | wangwu@163.com           |

    |    3 | NULL     | m     | 1990-11-12 | NULL                    |

    |    4 | zhaoliu  | m     | 1970-11-13 | zhaoliu@163.com         |

    +------+----------+--------+------------+--------------------------+

    mysql> INSERT INTO t_student() VALUES(5,'zhouba','f','1970-11-13');

    ERROR 1136 (21S01): Column count doesn't match value count at row 1

 

结论:建议不要讲前面的字段名省略,若省略就表示将表中所有的字段全部加上。省略后程序不健壮,无法修改表结构,修改表结构可能导致insert语句执行失败。

 

       8.7 插入中文试试?

            INSERT INTO t_student(no,name) VALUES(6,'王五');

            上述代码在DOS窗口中会报错,原因是DOS窗口是GBK的编码方式,但是数据库表只能接受utf8。

            使用MYSQL Front工具插入数据【MYSQL的客户端软件,在实际开发中使用较多】

            但是使用MYSQL Front工具插入数据成功后,在DOS窗口中使用select语句查询的时候会出现乱码,这时需要修改查询结果集的显示编码方式,这里修改的不是DOS窗口:set character_set_results = ‘GBK’; 【只对当前会话有效,重启软件和失效】

            查看MYSQL的相关字符编码方式: show variables like'%char%';

            +--------------------------+---------------------------------------------------------+

            | Variable_name            |Value                                                  |

            +--------------------------+---------------------------------------------------------+

            | character_set_client     |utf8                                                   |

            | character_set_connection | utf8                                                   |

            | character_set_database   |utf8                                                   |

            | character_set_filesystem | binary                                                 |

            | character_set_results    |utf8                                                   |

            | character_set_server     |utf8                                                   |

            | character_set_system     |utf8                                                   |

            | character_sets_dir       |D:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |

            +--------------------------+---------------------------------------------------------+

            但是在5.7版本中,不会报错也不会乱码

            INSERT INTO t_student(no,name) VALUES(6,'王五');

            mysql> select * from t_student;

            +------+----------+--------+------------+--------------------------+

            | no   | name     | gender | birth      | email                    |

            +------+----------+--------+------------+--------------------------+

            |    1 | zhangsan | m      | 1970-10-11 | zhangsan@bjpowernode.com |

            |    2 | lisi     | f     | 1971-10-11 | lisi@bjpowernode.com    |

            |    3 | NULL     | NULL  | NULL       | wangwu@163.com           |

            |    3 | NULL     | m     | 1990-11-12 | NULL                    |

            |    4 | zhaoliu  | m     | 1970-11-13 | zhaoliu@163.com         |

            |    6 | 王五     | NULL  | NULL       | NULL                     |

            +------+----------+--------+------------+--------------------------+

 

    9、关于创建表格的时候给字段添加默认值【default】

           droptable if exists t_student;

           createtable t_student(

                  noint(10),

                  namevarchar(32),

                  sexchar(1) default 'm'

             );

            insert into t_student(no,name) values(1, 'jack');

            insert intot_student(no,name) values(2, 'lucy');

           mysql>select * from t_student;

            +------+------+------+

            | no   | name | sex  |

            +------+------+------+

            |    1 | jack | m    |

            |    2 | lucy | m    |

            +------+------+------+

 

            mysql> desc t_student;

            +-------+-------------+------+-----+---------+-------+

            | Field | Type        |Null | Key | Default | Extra |

            +-------+-------------+------+-----+---------+-------+

            | no    | int(10)     | YES |     | NULL    |      |

            | name  | varchar(32) |YES  |    | NULL    |       |

            | sex   | char(1)     | YES |     | m       |      |

            +-------+-------------+------+-----+---------+-------+

 

       关于SQL脚本:

                  你是怎么看SQL脚本的额?

                        -   该文件是一个普通的文本文件,后缀名.sql,被称为SQL脚本

                        -   在SQL脚本有大量的SQL语句,想批量的执行SQL语句,可以将这些SQL语句写入SQL脚本文件中,直接使用source执行这个脚本,可以执行大量的SQL语句。

                             mysql> source C:\Users\nijie\Desktop\student_class.sql

                            +-----+------------+

                             | cno | cname      |

                            +-----+------------+

                            | 100 | 高三1班    |

                            | 200 | 高三2班    |

                            | 300 | 高三3班    |

                            +-----+------------+

                            +-----+----------+---------+

                            | sno | sname    |classno |

                            +-----+----------+---------+

                            |   1 | jack     |    100 |

                            |   2 | lucy     |    100 |

                            |   3 | zhangsan |     100 |

                            |   4 | king     |    200 |

                            |   5 | ford     |    200 |

                            |   6 | allen    |    300 |

                            |   7 | lisi     |    300 |

                            +-----+----------+---------+

                        -   若项目中期就职,可能数据库表,以及表中的记录都已经准备好了,可能Team Leader会直接给程序员一个sql脚本将底层数据库中的数据完成初始化,就可以开发了。【64MB 可以使用Sublime Text打开】

 

10、获取系统当前时间

       使用now()函数

           mysql>selectnow();

            +---------------------+

            | now()               |

            +---------------------+

            | 2018-02-22 13:13:42 |

          

    创建表:机构表

           createtable t_organization(

                     codechar(10),

                     namevarchar(32),

                     createTimedate

           );

           insertinto t_organization(code,name,createTime) values('111111', '国家外汇局',now());

           insertinto t_organization(code,name,createTime) values('111112', '河北省外汇局',now());

           insertinto t_organization(code,name,createTime) values('111113', '河南省外汇局',now());

           insertinto t_organization(code,name,createTime) values('111114', '山东省外汇局',now());

           mysql>select * from t_organization;

            +--------+--------------------+------------+

            | code   | name               | createTime |

            +--------+--------------------+------------+

            | 111111 | 国家外汇局         | 2018-02-22 |

            | 111112 | 河北省外汇局       | 2018-02-22 |

            | 111113 | 河南省外汇局       | 2018-02-22 |

            | 111114 | 山东省外汇局       | 2018-02-22 |

            +--------+--------------------+------------+

 

    11、表的复制【快速创建表】

       语法结构:

              CREATETABLE tablename AS SELECT columnname,... FROM TABLENAME;

              将查询结果当做一张表创建

               createtable emp1 as select * from emp;

               select* from emp;

               select* from emp1;

               createtable emp2 as select empno,ename,sal from emp;

               select* from emp2;

 

    12、将查询结果插入到某张表中

       select* from emp2;【14条】

       insert into emp2 select * from emp2 wheresal = 3000;

       select * from emp2;【14 +2 = 16条】

 

        create tableemp_bak as select * from emp;

        select * fromemp_bak;

        insert intoemp_bak select * from emp;【14 + 14 = 28条】

 

    13、增/删/改 表结构【DDL】

       droptable if exists t_student;

       createtable t_student(

              noint(10),

              namevarchar(32)

       );

        mysql> desc t_student;

        +-------+-------------+------+-----+---------+-------+

        | Field | Type        |Null | Key | Default | Extra |

        +-------+-------------+------+-----+---------+-------+

        | no    | int(10)     | YES |     | NULL    |      |

        | name  | varchar(32) |YES  |    | NULL    |       |

        +-------+-------------+------+-----+---------+-------+

      

       【增】给t_student表格添加一个联系电话字段

       ALTERTABLE t_student ADD tel VARCHAR(10);

        mysql> desc t_student;

        +-------+-------------+------+-----+---------+-------+

        | Field | Type        |Null | Key | Default | Extra |

        +-------+-------------+------+-----+---------+-------+

        | no    | int(10)     | YES |     | NULL    |      |

        | name  | varchar(32) |YES  |    | NULL    |       |

        | tel   | varchar(10) |YES  |    | NULL    |       |

        +-------+-------------+------+-----+---------+-------+

 

       【改】将t_student表格中的tel字段长度扩展到20个字段长度

       ALTERTABLE t_student MODIFY tel VARCHAR(20);

        mysql> desc t_student;

        +-------+-------------+------+-----+---------+-------+

        | Field | Type        |Null | Key | Default | Extra |

        +-------+-------------+------+-----+---------+-------+

        | no    | int(10)     | YES |     | NULL    |      |

        | name  | varchar(32) |YES  |    | NULL    |       |

        | tel  | varchar(20) |YES  |    | NULL    |       |

        +-------+-------------+------+-----+---------+-------+

 

       【删】将t_student表格中的tel字段删除

       ALTERTABLE t_student DROP tel;

        mysql> desc t_student;

        +-------+-------------+------+-----+---------+-------+

        | Field | Type        |Null | Key | Default | Extra |

        +-------+-------------+------+-----+---------+-------+

        | no    | int(10)     | YES |     | NULL    |      |

        | name  | varchar(32) |YES  |    | NULL    |       |

        +-------+-------------+------+-----+---------+-------+

 

    14、增/删/改 表中的数据【DML】

        14.1 update

       UPDATE语句的语法格式:

              UPDATE tablename SET 字段名=字段值,字段名=字段值,字段名=字段值 WHERE 条件;

       注意:update语句没有限制时,会将一张表中所有的数据全部更新。

        mysql> alter table t_student add emailvarchar(128);

        mysql> insert into t_student(no) values(1);

        mysql> insert into t_student(no) values(2);

        mysql> insert into t_student(no) values(3);

     

        mysql> select * from t_student;

        +------+------+-------+

        | no   |name | email |

        +------+------+-------+

        |    1 |NULL | NULL  |

        |    2 |NULL | NULL  |

        |    3 |NULL | NULL  |

        +------+------+-------+

          案例:将no=3的记录的name修改为zhangsan,email修改为zhangsan@bjpowernode.com

           updatet_student set name = 'zhangsan', email = 'zhangsan@bjpowernode.com' where no =3;

        mysql> select * from t_student;

        +------+----------+--------------------------+

        | no   | name     | email                    |

        +------+----------+--------------------------+

        |    1 | NULL     | NULL                     |

        |    2 | NULL     | NULL                     |

        |    3 | zhangsan |zhangsan@bjpowernode.com |

        +------+----------+--------------------------+

          案例:将所有的name都修改为lisi

        update t_student set name = 'lisi';

        mysql> select * from t_student;

        +------+------+--------------------------+

        | no   | name | email                    |

        +------+------+--------------------------+

        |    1 | lisi | NULL                     |

        |    2 | lisi | NULL                     |

        |    3 | lisi |zhangsan@bjpowernode.com |

        +------+------+--------------------------+

 

       案例:将emp_bak表中的所有名字中含有o的员工名改为zhangsan

       updateset emp_bak ename = 'zhangsan' where ename like '%0%';

 

       案例:将emp_bak表中的所有工作岗位是manager和salesman的员工工资上调10%

       updateset emp_bak sal = sal * 1.1 where jon in ('manager', 'salesman');

       updateset emp_bak sal = sal * 1.1 where jon = 'manager' or job = 'salesman';

 

    14.2 delete

           delete语句的语法格式:

                  DELETEFROM tablename WHERE 条件

           注意:若没有条件限制,会将这张表中的左右记录全部删除

 

           案例:删除学号=3的学生

           deletefrom t_student where no = 3;

            mysql> select * from t_student;

            +------+------+-------+

            | no   | name | email |

            +------+------+-------+

            |    1 | lisi | NULL  |

            |    2 | lisi | NULL  |

            mysql> delete from t_student;

            Query OK, 2 rows affected (0.01 sec)

 

            mysql> select * from t_student;

            Empty set (0.00 sec)

 

           案例:将20部门的manager删除

           deletefrom emp_bak where job = 'manager' and deptno = 20;


DEPTNODNAMELOC
10ACCOUNTINGNEW YORK
20RESEARCHINGDALLAS
30SALESCHICAGO
40OPERATIONSBOSTON
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
7369SMITHCLERK79021980/12/17800NULL20
7499ALLENSALESMAN76981981/2/20160030030
7521WARDSALESMAN76981981/2/22125050030
7566JONESMANAGER78391981/4/22975NULL20
7654MARTINSALESMAN76981981/9/281250140030
7698BLAKEMANAGER78391981/5/12850NULL30
7782CLARKMANAGER78391981/6/92450NULL10
7788SCOTTANALYST75661987/4/193000NULL20
7839KINGPERSIDENTNULL1981/11/175000NULL10
7844TURNERSALESMAN76981981/9/81500NULL30
7876ADAMSCLERK77881987/5/231100NULL20
7900JAMESCLERK76981981/12/3950NULL30
7902FORDANALYST75661981/12/33000NULL20
7934MILLERCLERK77821982/1/231300NULL10
GRADELOSALHISAL
17001200
212011400
314012000
420013000
530019999

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值