文章目录
声明
这里只是举例说明常见用法,如果进阶的话,还得需要自己去看MySQL手册,进行自我提升,加油
sql,DB,DBMS分别是什么,他们之间的关系?
DB:
DataBase(数据库,数据库实际上在硬盘上以文件的形式存在)
DBMS:
DataBase Management System
(数据库管理系统,常见的Oracle,Mysql,SQL Server,DB2,Sybase,informix,interbase,PostgreSql……)
SQL:
结构化查询语言,是一门标准通用语言。标准的sql适合所有的数据库产品
SQL属于高级语言,SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql(sql的语句由DBMS完成)
DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据
DBMS–>(执行)---->SQL—(操作)—>DB
认识数据库表
表 是一种结构化的文件,可以用来存储特定类型的数据,如:学生信息,课程信息,都可以放到表中,另外表部有特定的名称,而且不能重复。表中有几个概念:列,行,主键。
列叫做字段,行叫做表中的记录,每一个字段都有:字段名称/字段数据类型/字段约束/字段长度
学号 | 姓名 | 性别 | 年龄 |
---|---|---|---|
17071401 | 张三 | 男 | 20 |
17071402 | 李四 | 女 | 18 |
17071403 | 王五 | 男 | 21 |
17071404 | 赵六 | 女 | 19 |
每个表都是由若干行和列组成的,在数据库中表中的行被称为记录,表中的列被称为这些记录的字段
记录也被称为一行数据,是表里的一行。在关系型数据库里,一行数据是指一条完整的记录。
字段是表里的一列,用于保存每条记录的特定信息
创建第一个表
CREATE TABLE students2(
sno INT(6),
NAME VARCHAR(6),
sex CHAR(1),
enterdate DATE,
classname VARCHAR(8),
email VARCHAR(20)
)
创建一个表名为students2
的表,
注意点:
- 字段是小括号,而不是大括号。
- 不区分大小写
- 最后一个字段不跟逗号
显示当前数据库下有哪些表
SHOW TABLES;
查看students2表的结构
DESC students2;
查看建表语句
show create table students2
赋值粘贴出来后代码为:
CREATE TABLE `students2` (
`sno` int(6) DEFAULT NULL,
`name` varchar(6) DEFAULT NULL,
`sex` char(1) DEFAULT NULL,
`enterdate` date DEFAULT NULL,
`classname` varchar(8) DEFAULT NULL,
`email` varchar(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
数据库表列类型
整数类型
MYSQL支持在选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示(可以自身突破括号内所指定整数值的显式宽度)
主键自增:不使用序列,通过auto_increment,要求是整数类型,
浮点数类型
浮点数类型 | 大小 | 作用 |
---|---|---|
FLOAT | 4字节 | 单精度浮点数值 |
DOUBLE | 8字节 | 双精度浮点数值 |
需要注意的是与整数类型不一样的是,浮点数类型的宽度不会自动扩充,
double(4,1)
指的是 总的(小数+整数)宽度为4,小数宽度为1
字符串类型
VARCHAR括号内只需要指明最大长度即可,它是变长字符串,如果大小超过了65535的话:两个选择,如果是字符的话,使用TEXT,如果是照片或者视频这些的话,那么选择BLOB。
如果需要使用以字节为单位的话,那么直接使用BINARY(M)
,VARBINARY(M)
即可
CHAR和VARCHAR类型相似,均用于存于较短的字符串,主要的不同之处在于存储方式,CHAR类型长度固定,VARCHAR类型的长度可变。
因为VARCHAR类型能够根据字符串的实际长度来动态改变所占字节的大小,所以在不能明确该字段具体需要多少字符时推荐使用VARCHAR类型,这样可以大大地节约磁盘空间,提高存储效率
CHAR和VARCHAR表示的是字符的个数,而不是字节的个数
日期和时间类型
TIMESTEMP
类型的数据指定方式与DATETIME
基本相同,两者不同之处在于以下几点:
- 数据的取值范围不同,
TIMESTEMP
类型的取值范围更小; - 如果我们对
TIMESTAMP
类型的字符安没有明确赋值,或是被赋予了NULL值,MySQL会自动将该字段赋值为系统当前时间 TIMESTEMP
类型 还可以使用CURRENT_TIMESTAMP
来获取系统当前时间TIMESTEMP
类型有一个很大的特点,那就是时间根据时区来显示的。例如,在东八区插入的TIMESTEMP数据为2017-7- 11 16:43:25,在东七区显示时,时间部分就变成了15:43:25,在东九区显示时,实践部分就变成了17:43:25
注意:查看MYSQL支持的列类型
mysql > help data types
DML语句
查询表的数据
SELECT * FROM students2;
添加数据insert
INSERT INTO students2 VALUES(1,"张三丰","男","1200-12-12","武当一班","[email protected]");
报错了,因为email太长了,超过了20个字符,减少一下。
INSERT INTO students2 VALUES(1,"张三丰","男","1200-12-12","武当一班","[email protected]");
成功了
INSERT INTO students2 VALUES(2,"张翠山","男","1256/05/12","武当二班","[email protected]");
我们再把上述语句再次执行一遍,那么观察一下是否能再次加入?
现实情况中不被允许的,因为主键不能一样(这里之所以能加入进去,是因为缺少约束)
而且这里性别也是可以任意的。。
如果我们少赋值一个变量,让它空着,它是否能通过呢?
INSERT INTO students2 VALUES(2,"张翠山","男","1256/05/12","武当二班");
报错了,列的数量不匹配值的数量。那么我们把列规定一下,别用上全部的列再次尝试:
INSERT INTO students2(sno,NAME,sex,classname) VALUES(3,"张无忌","男","武当三班");
如果enterdate(时间)需要时刚刚加入,那么我们应该怎么表示呢?
INSERT INTO students2(sno,NAME,sex,enterdate,classname) VALUES(4,"张小忌","男",SYSDATE(),"武当三班");
加入时间为:2021-3-16
另外一种insert方式:
INSERT INTO students2 SET sno=5,NAME="宋青书",classname="已退学";
修改数据update
update students2 set enterdate="1300-12-12",classname="武当实验班",email="[email protected]" where sno=3:
那能不能修改为null呢?我们来试试
删除数据delete
delete students2 where sno>=4;
嗯哼?报错了?出现了SQL语法错误,这里切记,MySQL的delete后面跟from
总结:
- CHAR VARCHAR是字符的个数,不是字节的个数,可以使用binary,varbinary表示定长和不定长的字节个数
- int 宽度是显示宽度,如果超过,可以自动增大宽度,int底层都是4个字节
- 如果写入当前的时间,now(),sysdate(),CURRENT_DATE()
- 时间的方式多样 “1256-12-13” “1256/12/13” “1256.12.13”
- 字符串不区分单引号和双引号
- delete语句中from不可少
过程代码
CREATE TABLE students2(
sno INT(6),
NAME VARCHAR(6),
sex CHAR(1),
enterdate DATE,
classname VARCHAR(8),
email VARCHAR(20)
)
SELECT * FROM students2;
INSERT INTO students2 VALUES(1,"张三丰","男","1200-12-12","武当一班","[email protected]");
INSERT INTO students2 VALUES(2,"张翠山","男","1256/05/12","武当二班","[email protected]");
INSERT INTO students2 VALUES(2,"张翠山","男","1256/05/12","武当二班","[email protected]");
INSERT INTO students2(sno,NAME,sex,enterdate,classname) VALUES(4,"张小忌","男",SYSDATE(),"武当三班");
INSERT INTO students2 SET sno=5,NAME="宋青书",classname="已退学";
UPDATE students2 SET enterdate="1300-12-12",classname="武当实验班",email="[email protected]" WHERE sno=3;
UPDATE students2 SET enterdate=NULL,classname=NULL WHERE sno=4;
DELETE FROM students2 WHERE sno>=4;
DDL语句
create alter drop
修改一个表
增加一列
alter table students2 add
增加一列实现代码(不写位置时默认加在最后一列):
ALTER TABLE students2 ADD score DOUBLE(4,1);
然后再次执行如下代码时:
update students2 set score=1234.5 where sno=1;
UPDATE students2 SET score=1234 WHERE sno=1;
表示越界了,当改成如下时,
UPDATE students2 SET score=234.1 WHERE sno=1;
成功了,这也就是体现了DOUBLE(4,1)
的
增加一列实现代码(加在第一列):
ALTER TABLE students2 ADD score DOUBLE(4,1) first;
加在某一列的前列(某一列的前列可以转化为某一列的后面)
ALTER TABLE students2 ADD score DOUBLE(4,1) AFTER classname;
它直接用了一个after
,那可不可以用before
呢?这得看文档
观察后,找到了first
,找到了after
,但是没有before
,那么就不能用喽
修改一列
修改的话,有change
和modify
,区别的是:
- modify只修改列的元素类型,并不修改名字
- change可以同时修改列的名字,还可以同时修改列的元素类型
alter table students2 modefy
alter table students2 change
change
alter table students2 change score credit double(4,1)
执行前
执行后
score是原来的列名,credit是新的列名,double(4,1)是列的新类型
modify
alter table students2 modify credit int(4)
执行前:
执行后:
删除一列
alter table students2 drop
drop
alter table students2 drop column credit;
column
是可选项,可填可不填。
执行前
执行后
删除表
drop table students2;
删除成功
过程代码
ALTER TABLE students2 ADD score DOUBLE(4,1);
SELECT * FROM students2;
UPDATE students2 SET score=234.1 WHERE sno=1;
ALTER TABLE students2 DROP credit;
ALTER TABLE students2 ADD score DOUBLE(4,1) AFTER classname;
ALTER TABLE students2 ADD score DOUBLE(4,1) FIRST;
ALTER TABLE students2 CHANGE score credit DOUBLE(4,1);
DESC students2;
ALTER TABLE students2 MODIFY credit INT(4);
ALTER TABLE students2 DROP COLUMN credit;
DROP TABLE students2;
表的完整性约束
简介
为防止不符合规范的数据存入数据库,在用户对数据进行插入,修改,删除等操作时,MySQL提供了一种进制来检查数据库中的数据是否满足规定的条件,以保证数据库中的数据的准确性和一致性,这种机制就是完整性约束
MySQL中主要支持六种完整性约束,如下表所示,其中check
约束是MySQL8
中提供的支持
约束条件 | 约束描述 |
---|---|
PRIMARY | 主键约束,约束字段的值可唯一地标识对应的记录 |
NOT NULL | 非空约束,约束的字段的值不能为空 |
UNIQUE | 唯一约束,约束的字段是唯一的 |
CHECK | 检查约束,限制某个字段的取值范围 |
DEFAULT | 默认值约束,约束字段的默认值 |
AUTO_INCREMENT | 自动增加约束,约束字段的值自动增加 |
FOREIGN KEY | 外外键约束,约束表与表之间的关系 |
一般我们不会把DEFAULT
和AUTO_INCREMENT
视为约束,而是看做一种自身特征
带有约束的建表语句:
CREATE TABLE students2(
sno INT(6) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(6) NOT NULL,
sex CHAR(1) CHECK(sex='男' || sex='女'),
age INT(3) CHECK(age<=80 AND age>=6),
enterdate DATE,
classname VARCHAR(10),
email VARCHAR(20) UNIQUE
)
本来想在 sex CHAR(1) CHECK(sex='男' || sex='女')
后加一个default ‘男’ ,却报错了。没法改,我只能去掉。
语法报错,版本不合??
执行下方语句代码时:
INSERT INTO students2 VALUE(NULL,NULL,NULL,100,'1999-12-23','Java001','[email protected]');
报错,Column 'NAME' cannot be null
,约束起了作用
emmmm......
不好意思,我的MYSQL版本有点低,不支持check。。所以示范不出来。。等我换个MySQL。。
换成MYSQL8.0以上试验后:
INSERT INTO students2 VALUES(NULL,'小','小',100,'1999-12-23','Java001','zhangsan@sxt');
执行上方语句居然成功了很明显,因为,不同于SQL,在MYSQL
中,CHECK只是一段可调用但无意义的子句。MySQL会直接忽略。CHECK
语句在声明中并未起到作用。跟MySQL
版本无关。
注意:
CHECK
子句会被分析,但是会被忽略。
请参见“CREATE TABLE语法”:接受这些子句但又忽略子句的原因是为了提高兼容性,以便更容易地从其它SQL服务器中导入代码,并运行应用程序,创建带参考数据的表。(那么check约束就直接放弃了),那么我们可以采用其它功能语句来尝试替换check。
check替换 小范围(1)
sex CHAR(1) CHECK(sex='男' || sex='女'),
替换语句如下:
sex ENUM('男','女'),
即创建表格代码如下:
CREATE TABLE students2(
sno INT(6) PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(6) NOT NULL,
sex ENUM('男','女'),
age INT(3) CHECK (age<80 AND age>6),
enterdate DATE,
classname VARCHAR(10),
email VARCHAR(20) UNIQUE
)
然后执行下方语句后:
INSERT INTO students2 VALUES(NULL,'小','小',100,'1999-12-23','Java001','zhangsan@sxt');
报错了,哈哈,成功替换