mysql约束_Mysql之SQL语句、约束

Mysql之SQL使用

简介

什么是 SQL?

SQL 指结构化查询语言

SQL 使我们有能力访问数据库

SQL 是一种 ANSI 的标准计算机语言

备注:ANSI,美国国家标准化组织

一、SQL语句、语法

1、查:SELECT 语句用于从表中选取数据。结果被存储在一个结果表中(称为结果集)。

sql select 语法

select 列 from table_name;

select * from table_name;

2、插:INSERT INTO 语句用于向表格中插入新的行。

sql insert 语法

insert into table_name values (值1,值2,...);

insert into table_name (列1,列2,...) values (值1,值2,...);

3、改:Update 语句用于修改表中的数据。

sql update 语法

update table_name set 列1 = 新值 where 列2 = 某值 # 列2指定谁修改,列1指定修改的内容

4、删:DELETE 语句用于删除表中的行。

sql delete 语法

delete from table_name where 列 = 值; # 删除某一行

delete from table_name; 或 delete * from table_name; #删除所有行(表的结构、属性和索引都是完整的)

sql truncate table 语法

truncate table table_name; # 与delete一样删除表中所有行,效率更快

5、top:TOP 子句用于规定要返回的记录的数目。

列(s) = *

sql top 语法

select top number|precent 列(s) from table_name; # 列(s) 表示 所有的列名称

top number例:select top 2 * from table_name; 或 select * from table_name limit 2;

top precent例:select top 50 precent * from table_name; # 选取表中50%的记录

6、like:LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式

sql like 语法

select 列(s) from table_name where 列 like pattern;

例:select * from table_name where 列 like 'A%'(在表中搜寻以A开头的)|'%B'(以B结尾的)|'%AB%'(包含AB的);

7、in:IN 操作符允许我们在 WHERE 子句中规定多个值

sql in 语法

select * from table_name where 列 in(值1,值2,...);

8、between:操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。

sql between 语法

select * from table_name where 列 between 值1 and 值2; # 范围取头不取尾

9、alias:为列名称和表名称指定别名(Alias)。

sql alias 语法

表:select * from table_name as alias_name;

表别名例:select p.列1,p.列2,p.列3 from table_name1 as p,table_name2 as po where p.列1='值1' and p.列2='值2';

列:select 列 as alias_name from table_name;

列别名例:select 列1 as alias_name1,列2 as alias_name2 from table_name;

10、join:用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

sql join 语法

select tb1.列1,tb1.列2,tb2.列 from tb1 inner join tb2 on tb1.列3=tb2.列3 order by tb1.列1;

select tb1.列1,tb1.列2,tb2.列 from tb1,tb2 where tb1.列3=tb2.列3;

备注:不同的 SQL JOIN

除了在上面的例子中使用的 INNER JOIN(内连接),还可以使用其他几种连接。

下面列出了可以使用的 JOIN 类型,以及它们之间的差异。

JOIN: 如果表中有至少一个匹配,则返回行

LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

FULL JOIN: 只要其中一个表中存在匹配,就返回行

inner join 关键字语法:在表中存在至少一个匹配时,INNER JOIN 关键字返回行。

select * from tb1 inner join tb2 on tb1.列=tb2.列; # inner join 与join是相同的

left join 关键字语法:LEFT JOIN 关键字会从左表(tb1)那里返回所有的行,即使在右表(tb2)中没有匹配的行。

select * from tb1 left join tb2 on tb1.列=tb2.列;

right join 关键字语法:RIGHT JOIN 关键字会右表(tb2)那里返回所有的行,即使在左表(tb1)中没有匹配的行。

select * from tb1 right join tb2 on tb1.列=tb2.列;

full join 关键字语法:只要其中某个表存在匹配,FULL JOIN 关键字就会返回行

select * from tb1 full join tb2 on tb1.列=tb2.列;

11、union:用于合并两个或多个 SELECT 语句的结果集(UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同)

sql union 与 union all 语法

select * from table_name1 union select * from table_name2;

select * from table_name1 union all select * from table_name2;

备注:默认地,union 选取不同的值,如果允许重复的值,就使用 union all(列出所有的值)

12、select into:从一个表中选取数据,然后把数据插入另一个表中。常用于创建表的备份复件或者用于对记录进行存档。

sql select into 语法

select * into new_table_name [in externaldatabase] from old_table_name; # 所有列插入新表

select 列 into new_table_name [in externaldatabase] from old_table_name; # 某一列插入新表

例:备份某张表 select * into tb1_backup from tb1;

向另一个数据库中拷贝表 select * into tb1 in 'backup.mdb' from tb1;

多表查询存入到新表 select tb1.列1,tb2.列2 into new_table_name from tb1 inner join tb2 on tb1.列3=tb2.列3;

13、create database:用于创建数据库

sql create database 语法

create database database_name;

14、create table:用于创建数据库中的表

sql create table 语法

create table table_name(列1 数据类型,列2 数据类型,...)

备注:常用数据类型有 int(size)-整数、decimal(size,d)-带小数数字、char(size)-固定长度字符串、varchar(size)-可变长字符串

数据类型后续会继续补充

15、create index:用于在表中创建索引。在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据。

注释:更新一个包含索引的表需要比更新一个没有索引的表更多的时间,这是由于索引本身也需要更新。因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

sql create index 语法

create index index_name on table_name(列); # 简单的索引,允许使用重复的值

create index index_name on table_name(列1 desc,列2); # 默认是升序,希望降序在列名称后添加保留字 desc,索引不止一个列可以逗号隔开

sql create unique index 语法 # 唯一的索引

create unique index index_name on table_name(列); # 唯一的索引意味着两个行不能拥有相同的索引值

16、DROP:删除索引、表以及数据库

sql drop 语法

删除索引:drop index index_name on table_name;

删除表:drop table table_name;

删除库:drop database database_name;

17、alter table : 语句用于在已有的表中添加、修改或删除列。

sql alter table 语法

添加列:alter table table_name add 列 数据类型;

删除列:alter table table_name drop column 列;

改变列中数据类型:alter table table_name modify column 列 需要修改的类型;

只修改列的数据类型的方法:

通常可以写成 alter table 表名 modify column 列名 新的列的类型

例如:student表中列sname的类型是char(20),现在要修改为varchar(20),SQL语句如下

alter table student modify column sname varchar(20);

同时修改列名和列的数据类型的方法:

通常可以写成 alter table 表名 change column 旧列名 新列名 新的列类型

例如:student表中列sname的类型是char(20),现在要修改为stuname varchar(20),SQL语句如下

alter table student change column sname stuname varchar(20);

alter table table_name add [约束条件][FLRST(添加列到表的最前面)|AFTER(指定列后面) ]; # 添加列

alter table table_name ; # 修改列名

alter table table_name modify ; # 修改列的数据类型

alter table table_name modify FLRST|AFTER ; # 修改列的位置

alter table table_name drop ; # 删除列

alter table rename to ; # 修改表名

18、auto increment:会在新记录插入表中时生成一个唯一的数字

通常希望在每次插入新记录时,自动地创建主键字段的值。可以在表中创建一个 auto-increment 字段。

sql auto-increment 语法

create table table_name(id int not null auto_increment,name varchar(255) not null,PRIMARY key(id)); #id定义为auto_increment主键

19、view(视图): 视图是可视化的表。视图包含行和列,就像一个真实的表

注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。

sql create view 语法

create view view_name as select 列(s) from table_name where 条件;

注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。

更新视图:create or replace view view_name as select 列(*) from table_name where 条件;

删除视图:drop view view_name;

二、SQL 约束(constraints)

sql约束:约束用于限制加入表的数据的类型。是一种限制,它通过对表的行或列的数据做出限制,来确保表数据的完整性、唯一性

可以在创建表时规定约束(通过 CREATE TABLE 语句),或者在表创建之后也可以(通过 ALTER TABLE 语句)。

1、not null 约束:强制列不接受 NULL 值,强制字段始终包含值。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

例:create table table_name(id int not null,name varchar(255) not null); # 强制id和name不能为空

2、unique 约束:唯一标识数据库表中的每条记录,确保表中的一列数据没有相同的值

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY 拥有自动定义的 UNIQUE 约束。

每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束

例:create table时在id列创建unique约束

create table table_name(id int not null,name varchar(255) not null, unique (id));

例2:为多个列定义unique

create table table_name(id int not null,name varchar(255) not null, constraint uc_personID unique (id,name))

例3:表已创建情况下,创建unique约束

alter table table_name add unique(id);

多个:alter table table_name add constraint uc_personid unique(id,name);

例4:撤销unique

alter table table_name drop index uc_personid;

3、PRIMARY KEY 约束:PRIMARY KEY 约束唯一标识数据库表中的每条记录。

主键必须包含唯一的值。

主键列不能包含 NULL 值。

每个表都应该有一个主键,并且每个表只能有一个主键。 primary key = unique + not null

例:create table时在id列创建PRIMARY KEY约束

create table table_name(id int not null,name varchar(255) not null, PRIMARY KEY(id));

例2:为多个列定义PRIMARY KEY

create table table_name(id int not null,name varchar(255) not null, constraint pk_personID PRIMARY KEY (id,name))

例3:表已创建情况下,创建PRIMARY KEY约束

alter table table_name add PRIMARY KEY(id);

多个:alter table table_name add constraint pk_personid PRIMARY KEY(id,name);

例4:撤销PRIMARY KEY

alter table table_name drop index uc_personid;

4、FOREIGN KEY 约束:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY

外键

外键用来在两个表数据之间建立链接,它可以是一列或多列。一个表可以有一个或多个外键

外键对应得是参照完整性,一个表得外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键得某个值。

FOREIGN KEY 约束用于预防破坏表之间连接的动作。

FOREIGN KEY 约束也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。

例:create table时在id列创建 FOREIGN KEY 约束

create table table_name1(id int not null,name varchar(255) not null,Id_P int, PRIMARY KEY(id),FOREIGN KEY (Id_P) REFERENCES table_name2(Id_P));

例2:为多个列定义 FOREIGN KEY

create table table_name1(id int not null,name varchar(255) not null,Id_P int, PRIMARY KEY(id) constraint fk_pertb2 FOREIGN KEY (Id_P)

REFERENCES table_name2(Id_P) )

例3:表已创建情况下,创建 FOREIGN KEY 约束

alter table table_name add ADD FOREIGN KEY (Id_P) REFERENCES table_name1(Id_P);

多个:alter table table_name add constraint pk_personid PRIMARY KEY(id,name);

例4:撤销 FOREIGN KEY

alter table table_name drop FOREIGN KEY fk_pertb2;

外键约束

mysql> create table bookcategory(

-> category_id int primary key,

-> category varchar(20),

-> parent_id int);

mysql> create table bookinfo(

-> book_id int primary key,

-> book_category_id int,

-> constraint fk_cid foreign key(book_category_id) references bookcategory(category_id));

5、CHECK 约束:用于限制列中的值的范围

如果对单个列定义 CHECK 约束,那么该列只允许特定的值。

如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

例:create table时在id列创建 CHECK 约束

create table table_name(id int not null,name varchar(255) not null,CHECK(id>0));

例2:为多个列定义 CHECK 约束

create table table_name(id int not null,name varchar(255) not null, constraint chk_tbname CHECK(id>0 and name='xxx'));

例3:表已创建情况下,创建 CHECK 约束

alter table table_name ADD constraint chk_tbname CHECK (Id_P>0 AND name='xxx');

例4:撤销 CHECK

alter table table_name drop constraint chk_tbname;

6、DEFAULT 约束:用于向列中插入默认值

如果没有规定其他的值,那么会将默认值添加到所有的新记录。

例:create table时在id列创建 DEFAULT 约束,类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值

create table table_name(id int not null,name varchar(255) not null DEFAULT 'lxq',timedate date DEFAULT GETDATE());

例2:表已创建情况下,创建 DEFAULT 约束

alter table table_name alter name set DEFAULT 'lxq2';

例3:撤销 DEFAULT

alter table table_name ALTER name DROP DEFAULT;

三、sql函数

1、date

函数及描述

NOW():返回当前的日期和时间

CURDATE():返回当前的日期

CURTIME():返回当前的时间

DATE():提取日期或日期/时间表达式的日期部分

EXTRACT():返回日期/时间按的单独部分

DATE_ADD():给日期添加指定的时间间隔

DATE_SUB():从日期减去指定的时间间隔

DATEDIFF():返回两个日期之间的天数

DATE_FORMAT():用不同的格式显示日期/时间

四、数字类型

MySQL中,有三种主要的类型:文本、数字和日期/时间类型

1、Text 类型

CHAR(size):保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。

VARCHAR(size):保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。

注释:如果值的长度大于 255,则被转换为 TEXT 类型。

TINYTEXT:存放最大长度为 255 个字符的字符串。

TEXT:存放最大长度为 65,535 个字符的字符串。

BLOB:用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。

MEDIUMTEXT:存放最大长度为 16,777,215 个字符的字符串。

MEDIUMBLOB:用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。

LONGTEXT:存放最大长度为 4,294,967,295 个字符的字符串。

LONGBLOB:用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。

ENUM(x,y,z,etc.):允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。

注释:这些值是按照你输入的顺序存储的。

可以按照此格式输入可能的值:ENUM('X','Y','Z')

SET:与 ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。

2、Number 类型

TINYINT(size):-128 到 127 常规。0 到 255 无符号*。在括号中规定最大位数。

SMALLINT(size):-32768 到 32767 常规。0 到 65535 无符号*。在括号中规定最大位数。

MEDIUMINT(size):-8388608 到 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。

INT(size):-2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。

BIGINT(size):-9223372036854775808 到 9223372036854775807 常规。0 到 18446744073709551615 无符号*。在括号中规定最大位数。

FLOAT(size,d):带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。

DOUBLE(size,d):带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。

DECIMAL(size,d):作为字符串存储的 DOUBLE 类型,允许固定的小数点。

重点:这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。

3、Date 类型

DATE():日期。格式:YYYY-MM-DD

注释:支持的范围是从 '1000-01-01' 到 '9999-12-31'

DATETIME():*日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS

注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'

TIMESTAMP():*时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的描述来存储。格式:YYYY-MM-DD HH:MM:SS

注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC

TIME():时间。格式:HH:MM:SS 注释:支持的范围是从 '-838:59:59' 到 '838:59:59'

YEAR():2 位或 4 位格式的年。

注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。

重点:即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,

TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD

你可能感兴趣的:(mysql约束)