一:结构化查询语句分类 :
名称 解释 命令
DDL 定义和管理数据对象,如数据库,数据表等 create drop alter
(数据定义语言)
DML 用于操作数据库对象中所包含的数据 insert update delete
(数据操作语言)
DQL 用于查询数据库数据 select
(数据查询语言)
DCL 用来管理数据库的语言,包括管理权限及数据更改 grant commit rollback
(数据控制语言)
二:创建数据表语句
属于DDL的一种
语法:
CREATE TABLE [IF NOT EXISTS] 表名 (
`字段名1` 列类型 [属性] [索引] [注释] ,
`字段名2` 列类型 [属性] [索引] [注释] ,
... ...
`字段名n` 列类型 [属性] [索引] [注释]
) [表类型] [表字符集] [注释] ;
``反引号:反引号用于区别MySQL保留字与普通字符而引入的.
//查看当前所在的数据库
select database();
//创建表
CREATE TABLE IF NOT EXISTS t1(
username VARCHAR(16),
age TINYINT UNSIGNED,
salary FLOAT(7,2)
);
//查看刚刚创建的表的sql语句
show create table t1;
//查看表结构
desc t1;
±---------±--------------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±--------------------±-----±----±--------±------+
| username | varchar(16) | YES | | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
| salary | float(7,2) | YES | | NULL | |
±---------±--------------------±-----±----±--------±------+
//创建学科表
±------------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±------------±------------±-----±----±--------±---------------+
| SubjectNo | int(11) | NO | PRI | NULL | auto_increment |
| SubjectName | varchar(50) | YES | | NULL | |
| ClassHour | int(4) | YES | | NULL | |
| GradeID | int(4) | YES | | NULL | |
±------------±------------±-----±----±--------±---------------+
CREATE TABLE IF NOT EXISTS subject(
SubjectNo INT(11) PRIMARY KEY AUTO_INCREMENT,
SubjectName VARCHAR(50) COMMENT '学科名称',
ClassHour INT(4) COMMENT '学时',
GradeID INT(4) COMMENT '年级ID'
)ENGINE=INNODB DEFAULT CHARSET=UTF8 COMMENT '课程表';
//系统生成的sql
CREATE TABLE `subject` (
`SubjectNo` int(11) NOT NULL AUTO_INCREMENT,
`SubjectName` varchar(50) DEFAULT NULL COMMENT '学科名称',
`ClassHour` int(4) DEFAULT NULL COMMENT '学时',
`GradeID` int(4) DEFAULT NULL COMMENT '年级ID',
PRIMARY KEY (`SubjectNo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='课程表'
三:列类型分类
NULL值
理解为"没有值"或"未知值"
不要用NULL进行算术运算,结果仍为NULL
MySQL中,0或NULL都意味着为假,1为真
UNSIGNED
无符号的
声明该数据列不允许负数
ZEROFILL
0填充的
不足位数的用0来填充,如 int(3),5则为005
AUTO_INCREMENT
自动增长的,每添加一条数据,自动在上一个记录数上加1
通常用于设置主键,且为整数类型
可定义起始值和步长
DEFAULT
默认的
±------±-----------------------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±------±-----------------------------±-----±----±--------±---------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(16) | NO | | NULL | |
| age | tinyint(3) unsigned zerofill | YES | | NULL | |
| sex | enum('1','2','3') | YES | | 3 | |
±------±-----------------------------±-----±----±--------±---------------+
CREATE TABLE IF NOT EXISTS t2(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(16) NOT NULL,
age TINYINT ZEROFILL,
sex ENUM('1','2','3') DEFAULT '3'
);
//设置中文为GBK
SET NAMES GBK;
//插入模拟数据
INSERT INTO t2(id,`name`,age) VALUES(NULL,'张三',4);
四:数据表的类型
MySQL的数据表的类型:
MyISAM、InnoDB 、HEAP、BOB、CSV等
常见的MyISAM与InnoDB类型
名称 MyISAM InnoDB
事务处理 不支持 支持
数据行锁定 不支持 支持
外键约束 不支持 支持
全文索引 支持 不支持
表空间大小 较小 较大约两倍
适用场合:
使用MyISAM: 节约空间及相应速度
使用InnoDB: 安全性,事务处理及多用户操作数据表
五:MySQL数据表以文件方式存放在磁盘中
包括表文件、数据文件以及数据库的选项文件
位置:MySQL安装目录\data下存放数据表。目录名对应数据库名,该目录下文件名对应数据表
C:\ProgramData\MySQL\MySQL Server 5.5\data
//创建模拟数据表
mysql> CREATE TABLE t3(
-> id SMALLINT PRIMARY KEY AUTO_INCREMENT,
-> name varchar(16)
-> )ENGINE=MyISAM;
Query OK, 0 rows affected (0.18 sec)
mysql> CREATE TABLE t4(
-> id SMALLINT PRIMARY KEY AUTO_INCREMENT,
-> `name` varchar(16)
-> )ENGINE=InnoDB;
Query OK, 0 rows affected (0.21 sec)
InnoDB类型数据表只有一个*.frm文件,以及上一级目录的ibdata1文件
MyISAM类型数据表对应三个文件:
*.frm -- 表结构定义文件
*.MYD -- 数据文件
*.MYI -- 索引文件
六:设置数据库的字符集
可为数据库、数据表、数据列设定不同的字符集
设定方法:
1)创建时通过命令来设置
CREATE TABLE 表名(
#省略一些代码
)CHARSET=utf8;
2)如无设定,则根据MySQL数据库配置文件my.ini
(Windows系统)中的参数设定
如:character-set-sever = utf8
七:修改表(ALTER TABLE)
修改表名
ALTER TABLE 旧表名 RENAME AS 新表名
//将subject表名修改为subject2
ALTER TABLE subject RENAME AS subject2;
添加字段
//查看原表结构,添加Remark字段类型varchar(255)
mysql> DESCRIBE subject2;
±------------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±------------±------------±-----±----±--------±---------------+
| SubjectNo | int(11) | NO | PRI | NULL | auto_increment |
| SubjectName | varchar(50) | YES | | NULL | |
| ClassHour | int(4) | YES | | NULL | |
| GradeID | int(4) | YES | | NULL | |
±------------±------------±-----±----±--------±---------------+
ALTER TABLE subject2 ADD Remark VARCHAR(255);
mysql> SHOW COLUMNS FROM `subject2`;
±------------±-------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±------------±-------------±-----±----±--------±---------------+
| SubjectNo | int(11) | NO | PRI | NULL | auto_increment |
| SubjectName | varchar(50) | YES | | NULL | |
| ClassHour | int(4) | YES | | NULL | |
| GradeID | int(4) | YES | | NULL | |
| Remark | varchar(255) | YES | | NULL | |
±------------±-------------±-----±----±--------±---------------+
修改字段
//将Remark字段类型改为:varchar(64)
ALTER TABLE subject2 MODIFY Remark VARCHAR(64);
//将Remark字段,修改为Remark2类型改为:varchar(255)
ALTER TABLE subject2 CHANGE Remark Remark2 VARCHAR(255);
删除字段
//将Remark字段删除
ALTER TABLE subject2 DROP Remark2;
八:删除表
DROP TABLE [IF EXISTS] 表名
DROP TABLE t1;
九:其他命令
//跨数据库查询有多少表
SHOW TABLES FROM 其他数据库名;
十:课堂练习
student表:
±-------------±-------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±-------------±-------------±-----±----±--------±---------------+
| StudentNo | int(4) | NO | PRI | NULL | auto_increment |
| LoginPwd | varchar(20) | YES | | NULL | |
| StudentName | varchar(20) | YES | | NULL | |
| Sex | tinyint(1) | YES | | NULL | |
| GradeId | int(11) | YES | | NULL | |
| Phone | varchar(50) | NO | | NULL | |
| Address | varchar(255) | NO | | NULL | |
| BornDate | datetime | YES | | NULL | |
| Email | varchar(50) | YES | | NULL | |
| IdentityCard | varchar(18) | YES | | NULL | |
±-------------±-------------±-----±----±--------±---------------+
mysql> CREATE TABLE IF NOT EXISTS student(
-> StudentNo INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
-> LoginPwd VARCHAR(20),
-> StudentName VARCHAR(20) COMMENT '学生姓名',
-> Sex TINYINT(1) COMMENT '0或1',
-> GradeId INT(11) COMMENT '年级编号',
-> Phone VARCHAR(50) NOT NULL COMMENT '联系电话',
-> Address VARCHAR(255) NOT NULL COMMENT '地址',
-> BornDate DATETIME COMMENT '出生日期',
-> Email VARCHAR(50) COMMENT '邮箱',
-> IdentityCard VARCHAR(18) COMMENT '身份证号'
-> )ENGINE=InnoDB DEFAULT CHARSET=UTF8 COMMENT '学生信息表';
Query OK, 0 rows affected (0.22 sec)
成绩表:
±--------------±---------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±--------------±---------±-----±----±--------±---------------+
| StudentNo | int(4) | NO | PRI | NULL | auto_increment |
| SubjectNo | int(4) | NO | | NULL | |
| ExamDate | datetime | NO | | NULL | |
| StudentResult | int(4) | NO | | NULL | |
±--------------±---------±-----±----±--------±---------------+
mysql> CREATE TABLE IF NOT EXISTS result(
-> StudentNo INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号',
-> SubjectNo INT(4) NOT NULL COMMENT '课程编号',
-> ExamDate DATETIME NOT NULL COMMENT '考试日期',
-> StudentResult INT(4) NOT NULL COMMENT '考试成绩'
-> )ENGINE=InnoDB DEFAULT CHARSET=UTF8 COMMENT '成绩表';
Query OK, 0 rows affected (0.22 sec)