创建表、表的复制、增/删/改 表结构
* 本博客涉及到的数据为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;
| DEPTNO | DNAME | LOC |
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCHING | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
| 7369 | SMITH | CLERK | 7902 | 1980/12/17 | 800 | NULL | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 1981/2/20 | 1600 | 300 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981/2/22 | 1250 | 500 | 30 |
| 7566 | JONES | MANAGER | 7839 | 1981/4/2 | 2975 | NULL | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981/9/28 | 1250 | 1400 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981/5/1 | 2850 | NULL | 30 |
| 7782 | CLARK | MANAGER | 7839 | 1981/6/9 | 2450 | NULL | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 1987/4/19 | 3000 | NULL | 20 |
| 7839 | KING | PERSIDENT | NULL | 1981/11/17 | 5000 | NULL | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 1981/9/8 | 1500 | NULL | 30 |
| 7876 | ADAMS | CLERK | 7788 | 1987/5/23 | 1100 | NULL | 20 |
| 7900 | JAMES | CLERK | 7698 | 1981/12/3 | 950 | NULL | 30 |
| 7902 | FORD | ANALYST | 7566 | 1981/12/3 | 3000 | NULL | 20 |
| 7934 | MILLER | CLERK | 7782 | 1982/1/23 | 1300 | NULL | 10 |
| GRADE | LOSAL | HISAL |
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
本文详细介绍了MySQL中创建、复制及修改表结构的操作,包括数据类型选择、字段约束、默认值设定。同时,展示了如何向表中插入数据、更新和删除记录。还探讨了字符编码问题,以及SQL脚本的使用。此外,通过实例演示了如何利用ALTER TABLE语句增加、修改和删除字段。
4万+

被折叠的 条评论
为什么被折叠?



