SQL语法详解

声明

这里只是举例说明常见用法,如果进阶的话,还得需要自己去看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的表,
注意点:

  1. 字段是小括号,而不是大括号。
  2. 不区分大小写
  3. 最后一个字段不跟逗号

在这里插入图片描述

显示当前数据库下有哪些表

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基本相同,两者不同之处在于以下几点:

  1. 数据的取值范围不同,TIMESTEMP类型的取值范围更小;
  2. 如果我们对TIMESTAMP类型的字符安没有明确赋值,或是被赋予了NULL值,MySQL会自动将该字段赋值为系统当前时间
  3. TIMESTEMP类型 还可以使用CURRENT_TIMESTAMP来获取系统当前时间
  4. 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
在这里插入图片描述
在这里插入图片描述

总结:

  1. CHAR VARCHAR是字符的个数,不是字节的个数,可以使用binary,varbinary表示定长和不定长的字节个数
  2. int 宽度是显示宽度,如果超过,可以自动增大宽度,int底层都是4个字节
  3. 如果写入当前的时间,now(),sysdate(),CURRENT_DATE()
  4. 时间的方式多样 “1256-12-13” “1256/12/13” “1256.12.13”
  5. 字符串不区分单引号和双引号
  6. 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,那么就不能用喽

修改一列

在这里插入图片描述
修改的话,有changemodify,区别的是:

  1. modify只修改列的元素类型,并不修改名字
  2. 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 外外键约束,约束表与表之间的关系

一般我们不会把DEFAULTAUTO_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');

报错了,哈哈,成功替换
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CSNN2019/article/details/114856541