MySQL语句汇总

MySQL语句汇总

文章目录

    • MySQL语句汇总
    • 第一章:数据库基础知识:
      • 一、对数据库的操作
      • 二、数据表的基本操作:
      • 三、表的约束
      • 四、设置表的字段值自动增加
    • 第二章:索引
      • 1、创建表的时候创建索引
        • 1> 创建普通索引
        • 2> 创建唯一性索引
        • 3> 创建全文索引
        • 4> 创建单列索引
        • 5> 创建多列索引
        • 6> 创建空间索引
      • 2、在已存在的表上创建索引,使用CREATE INDEX 语句
        • 1> 创建普通索引
        • 2> 创建唯一性索引
        • 3> 创建单列索引
        • 4> 创建多列索引
        • 5> 创建全文索引
        • 6> 创建空间索引
      • 1. 使用alter table在已存在的表上创建索引
        • 1> 创建普通索引
        • 2> 创建唯一性索引
        • 3> 创建单列索引
        • 4> 创建多列索引
        • 5> 创建全文索引
        • 6> 创建空间索引
      • 3、删除索引
        • 1. 使用alter table删除索引
        • 2. 使用drop index 删除索引
    • 第三章:添加、更新与删除数据
      • 一、添加数据
        • 1. insert语句中指定所有字段名
        • 2. insert语句中不指定字段名
        • 3. 为表的指定字段添加数据
        • 4. insert语句其他写法
      • 二、更新数据
        • 1.更新部分数据
        • 2.更新全部数据
      • 三、删除数据
        • 1.删除部分数据
        • 2.删除全部数据
        • 3.使用关键字truncate删除表中的数据
    • 第四章:单表查询
      • 一、简单查询
        • 1.select语句
        • 2.查询所有字段
        • 3. 查询指定字段
      • 二、按条件查询
        • 1、带关系运算符的查询
        • 2、带in关键字的查询
        • 3、带between and 关键字的查询
        • 4、空值查询
        • 5、带distinct关键字的查询
        • 6、带like关键字的查询
        • 7、带and关键字的查询
        • 8、带or关键字的多条件查询
        • 9、or和and关键字可以一起使用的情况
      • 三、高级查询
        • 1、聚合函数
        • 2、对查询的结果排序
        • 3、分组查询
        • 4、为表和字段取别名
    • 第五章:多表查询
      • 一、外键
        • 1、什么外键:
        • 2、为表添加外键约束
        • 3、添加外键约束的参数说明
        • 4、删除外键约束
      • 二、操作关联表
        • 1、关联关系:
        • 2、添加数据:
        • 3、删除数据
      • 三、连接查询
        • 1、交叉连接
        • 2、内连接
        • 3、外连接
          • 1、 左连接(LIFT JOIN)
          • 2、 右连接(right join)
      • 4、 复合连接查询
      • 四、子查询
        • 1、 带in关键字的子查询
        • 2、 带exists关键字的子查询
        • 3、 带any关键字的子查询
        • 4、 带all关键字的子查询
        • 5、带比较运算符的子查询
    • 其他
      • SQL CHECK 约束
      • SQL CHECK 约束
      • SQL PRIMARY KEY 约束
      • SQL PRIMARY KEY 约束
      • SQL DEFAULT 约束
      • mysql如何把一个表直接拷贝到一个新的表
        • 一:在新表已经建立好的情况下
        • 二:在新表还没有建的情况下
        • 三:我们也可以操作其它的数据库中的表
        • 四:我们也可以在新建表时改名字
      • 如何修改mysql表的存储引擎

第一章:数据库基础知识:

一、对数据库的操作

创建数据库:

create database //数据库名称;

数据库名称是唯一的不可重复出现

查看所有数据库:

show databases;		

查看某一个数据库属性:

show create database 数据库名称; 

修改数据库:

alter database 数据库名称 default character set 编码方式 collate 编码方式_bin;

“数据库名称”指的是要修改的数据库,“编码方式”指的是要修改的数据库编码;

删除数据库:

drop database 数据库名称;

数据类型:
1、 整数型:tinyint、smallint、mediumint、int、bigint。
2、 浮点数类型和定点数类型:float、double、decimal。
3、 日期和时间类型:year、date、time、datetime、timestamp。
4、 字符串和二进制类型:char、varchar、binary、varbinary、bolb、text、enum、set、bit。

二、数据表的基本操作:

创建数据表

create table 表名 (
字段名1,数据类型[完整性约数条件],
字段名2,数据类型[完整性约数条件],
字段名3,数据类型[完整性约数条件],
字段名4,数据类型[完整性约数条件],
					……
);

查看数据表字段的属性:

show create table 表名;
describe 表名;
简写为 desc 表名;

修改数据表:

1.修改表名:

alter table 旧表名 rename [to] 新表名;

PS:[ ]里内容可以省略

2.修改字段名:

alter table 表名 change 旧字段名 新字段名 新字段数据类型;

3.修改字段的数据类型:

alter table 表名 modify 字段名 数据类型;

4.添加字段

alter table 表名 add 新字段名 数据类型 [约束条件] [first|after 已存在字段名];

5.删除字段:

alter table 表名 drop 字段名;

6.修改字段的排列位置:

alter table 表名 modify 字段1 数据类型 first|after 字段2;

删除数据表

drop table 表名;

三、表的约束

主键约束:

1. 单字段主键:字段名 数据类型 primary key
例如:

create table example01(id int primary key,name varchar(20),grade float);

2. 多字段主键:primary key (字段名1,字段名2,…,字段名n)
例如:

create table example01(id int primary key,name varchar(20),grade float,primary key(id,name));

3.非空约束
字段名 数据类型 not null;
例如:

create table example01(id int primary key,name varchar(20) not null,grade float);

4.唯一约束
字段名 数据类型 unique;
例如:

create table example01(id int primary key,name varchar(20) not null,grade float unique);

5.默认约束
字段名 数据类型 default 默认值;
例如:

create table example01(id int primary key,name varchar(20) not null,grade float default 0);

已有test表,表中有个case_status字段,现在给该字段设置默认值为A:

ALTER TABLE test ALTER COLUMN case_status SET DEFAULT 'A';

四、设置表的字段值自动增加

字段名 数据类型 auto_increment;
例如:

create table example01(id int primary key auto_increment,name varchar(20) not null,grade float);

第二章:索引

包括:普通索引、唯一性索引、全文索引、单列索引、多列索引、空间索引。

1、创建表的时候创建索引

create table 表名(字段名 数据类型[完整性约束条件],
字段名 数据类型[完整性约束条件],
……
字段名 数据类型[unique|fulltext|spatial] index|key
[别名](字段名1 [长度]) [asc|desc])
);
(1)	unique:可选参数,表示唯一索引。
(2)	fulltext:可选参数,表示全文索引。
(3)	spatial:可选参数,表示空间索引。
(4)	index和key:用来表示字段的索引,二者选一即可。
(5)	别名:可选参数,表示创建索引的名称。
(6)	字段名1:指定索引对应字段的名称。
(7)	长度:可选参数,用于表示索引的长度。
(8)	asc和desc:可选参数,其中,asc表示升序排序,desc表示降序排序。

1> 创建普通索引

例如:在t1中id字段上建立索引

create table t1 (id int not null,
name varchar(11),
score float,
index(id)
);

执行后使用show create table 语句查看表的结构

show create table t1\g;

2> 创建唯一性索引

例如:创建一个表名为t2的表在表中id字段上建立索引名为unique_id的唯一性索引,并按照升序排列
create table t2 (id int not null,
score float,
unique index unique_id(id asc)
);

3> 创建全文索引

例如:创建一个表名为t3的表在表中name字段上建立索引名为fulltext_name的全文索引

create table t1 (id int not null,
name varchar(11) not null,
score float,
fulltext index fulltext_name(id)
)engine=myisam;

4> 创建单列索引

例如:创建一个表名为t4的表在表中name字段上建立索引名为single_name的单列索引

create table t4 (id int not null,
name varchar(11),
score float,
index single_name(name(20))
);

5> 创建多列索引

例如:创建一个表名为t5的表在表中id和name字段上建立索引名为multi的多列索引

create table t5 (id int not null,
name varchar(11),
score float,
index multi(id,name(20))
);

6> 创建空间索引

例如:创建一个表名为t6的表,在空间类型为GEOMETRY的字段上创建空间索引

create table t6 (id INT,
space GEOMETRY NOT NULL,
SPATIAL INDEX sp(space)
) ENGINE=MYISAM;

2、在已存在的表上创建索引,使用CREATE INDEX 语句

create [unique|fulltext|spatial] index 索引名 on 表名(字段名[(长度)] [asc|desc]);

create table book(
bookid int not null,
bookname varchar[255] not null ,
authors varchar[255] null,
info varchar[255] null,
comment varchar[255] null,
publicyear year not null
);

1> 创建普通索引

例如:在book表中的bookid字段上建立一个名称为index_id的普通索引

create index index_id on book(bookid);

2> 创建唯一性索引

例如:在book表中的bookid字段上建立一个名称为uniqueidx的唯一性索引,

create unique index uniqueidx on book(bookid);

3> 创建单列索引

例如:在book表中的comment字段上建立一个名称为singleidx的单列索引

create index singleidx on book(comment);

4> 创建多列索引

例如:在book表中的authors和info字段上建立一个名称为mulitidx的多列索引

create index mulitidx on book(authors(20),info(20));

5> 创建全文索引

例如:在book表中的info字段上创建名为fulltextidx全文索引

create fulltext index fulltextidx on book(info);

6> 创建空间索引

例如:创建表t7,在表中的g字段上创建名称为spatidx的空间索引,
首先创建数据表t7

create table t7(g ceometry not null)engine=myisam;

在g字段上添加spatidx的空间索引

create spatial index spatidx on t7(g);

1. 使用alter table在已存在的表上创建索引

格式:alter table 表名 add [unique|fulltext|spatial] index 索引名(字段名[(长度)] [asc|desc]);

1> 创建普通索引

例如:在book表中的bookid字段上建立一个名称为index_id的普通索引

alter table book add index index_id(bookid); 

2> 创建唯一性索引

例如:在book表中的bookid字段上建立一个名称为uniqueidx的唯一性索引

alter table book add unique uniqueidx(bookid);

3> 创建单列索引

例如:在book表中的comment字段上建立一个名称为singleidx的单列索引

alter table book add index singleidx (comment(50)); 

4> 创建多列索引

例如:在book表中的authors和info字段上建立一个名称为mulitidx的多列索引

alter table book add index mulitidx(authors(20),info(20));

5> 创建全文索引

例如:在book表中的info字段上创建名为fulltextidx全文索引

alter table book add  fulltext index fulltextidx (info);  

6> 创建空间索引

例如:创建表t8,在表中的space字段上创建名称为spatidx的空间索引
首先创建数据表t8

create table t8(space ceometry not null)engine=myisam;

在space字段上添加spatidx的空间索引

alter table t8 add spatial index spatidx(space);

3、删除索引

1. 使用alter table删除索引

格式:alter table 表名drop index 索引名;
例如:删除表book名称为fulltextid的全文索引

alter table book drop index fulltextid;

2. 使用drop index 删除索引

格式:drop index 索引名 on 表名;
例如:删除表t8中名称为spatidx的空间索引

drop index spatidx on t8;

第三章:添加、更新与删除数据

一、添加数据

1. insert语句中指定所有字段名

格式:insert into 表名 (字段名1,字段名2,……)
values(值1,值2,……);
ps:“字段名1,字段名2,……”表示数据表中的字段名称,此处必须列出表中所有字段的名称;“值1,值2,……”表示每个字段的值,每个值的顺序,类型必须与对应的字段相匹配。

2. insert语句中不指定字段名

格式:insert into 表名 values(值1,值2……
);
Ps:由于insert语句没有指定字段名,添加的值的顺序必须和字段在表中定义的顺序相同。

3. 为表的指定字段添加数据

insert into 表名 (字段名1,字段名2,……)
values(值1,值2,……);

4. insert语句其他写法

insert into 表名 set 字段名1=1,字段名2=2,……;

可以为表中指定字段或者全部字段添加数据

二、更新数据

update 表名 set 字段名1=1[,字段2=2……]
						[where 条件表达式]

1.更新部分数据

update 表名 set 字段名1=1,字段2=2……
						where 条件表达式

2.更新全部数据

   update 表名 set 字段名1=1,字段2=2……;

三、删除数据

delete from 表名 [where 条件表达式]

1.删除部分数据

delete from 表名 where 条件表达式;

2.删除全部数据

delete from 表名;

3.使用关键字truncate删除表中的数据

truncate [table] 表名;
这种方式只可以删除表中所有数据。

PS:使用delete语句时,每删除一条记录都会在日志中记录,而使用truncate语句时,不会在日志中记录删除的内容,因此truncate语句的执行效率比delete语句高。

第四章:单表查询

一、简单查询

1.select语句

select [distinct] * [字段名1,字段名2……]
from 表名
[where 条件表达式1]
[group by 字段名 [having 条件表达式2]]
[order by 字段名 [asc|desc]]
[like [offset] 记录数]

Ps:asc升序desc降序

2.查询所有字段

1>.select 字段一,字段2,字段3…… from 表名;
2>在select语句中使用星号(“*”)通配符代替所有字段
Select * from 表名;

3. 查询指定字段

select 字段名1,字段名2,…… from 表名;

二、按条件查询

1、带关系运算符的查询

select 字段名1,字段名2,…… from 表名 where 条件表达式;

关系运算符:
关系运算符 说明 关系运算符 说明
= 等于 <= 小于等于

<> 不等于 > 大于
!= 不等于 >= 大于等于
< 小于

2、带in关键字的查询

In关键字用于判断某个字段是否在指定的集合中,如果字段的值在集合中,测满足条件,该字段所在的记录将被查询出来;

select * |字段1,字段2,字段3…… from 表名 where 字段名 [not] in (元素1,元素2,元素3,……);

3、带between and 关键字的查询

between and 用于判断某个字段的值是否在指定范围内

select * |字段1,字段2,字段3…… from 表名 where 字段名 [not] between1 and2;

4、空值查询

在数据表中,某些列的值可能为空值(null),空值不等同于0,也不等同于空字符串,在mysql中使用is null关键字来判断字段的值是否为空值;

select * | 字段1,字段2,字段3…… from 表名 where 字段名 is [not] null;

5、带distinct关键字的查询

distinct关键字作用过滤重复的字段;
select distinct 字段名 from 表名;

Ps:distinct关键字可以作用于多个字段

select distinct 字段名1,字段名2,字段名3 from 表名;

语法:select dictinct 字段名1,字段名2,…… from表名;

6、带like关键字的查询

LIKE关键字可以判断两个字符串是否相匹配
	语法:select * | {字段名1,字段名2,……}
			from 表名
			where 字段名 [NOT] like ‘匹配字符串’;

“匹配的字符串”指定用来匹配的字符串,其值可以是一个普通字符串,也可以是包含百分号(%)和下划线(_)的通配字符串。百分号和下划线统称为通配符。

1> 百分号(%)通配符
匹配任意长度的字符串,包括空格

例如:查找student表中name字段值以字符“s”开头的学生id:

select id,name from student where name like ‘s%;

在通配字符串中可以出现多个百分号通配符,例如: “%f%”;

2> 下划线(_)通配符
下划线通配符只匹配单个字符,如果要匹配多个字符,需要使用多个下划线通配符。
例如:查询student表中name 字段以wo开头以ong结束,并且两个字符符串之间只有一个字符的记录。语句如下:

select id,name from student where name like ‘wo_ong’; 

3> 使用百分号和下划线通配符进行查询操作
因为%是通配符的缘故不能直接写“%”,需要在“%”前面加上一个右斜线进行转义例如“%”,下划线也等同“_”从而转换为字面值。
例如:查询student表中name字段值包括“%”的记录

select * from student where name like%\%%;

从上面执行的语句中可以看出,在通配符字符串“%%%”中”%”是字面值,第一个和第三个百分号匹配任意个数的字符。

7、带and关键字的查询

and关键字可以连接两个或者多个查询语句,只有满足所有条件的记录才会被返回。
语法:

select * |{字段名1,字段名2……} from 表名
		where 条件表达式1 and 条件表达式2 and 条件表达式3 ……;

8、带or关键字的多条件查询

使用or关键字时只要满足任意一条就会被查询出来。
语法:

select * |{字段名1,字段名2……} from 表名 where 条件表达式1 or 条件表达式2 or 条件表达式3 ……;

9、or和and关键字可以一起使用的情况

or和and关键字一起使用时要注意and的优先级高于or,因此两者一起使用时先运算and两边的条件表达式再运算or两边的条件表达式。
例如:查询student表中gender字段值为“女”或者gender值为“男”,并且grade字段值为100的学生姓名;

select * from student where gender=’女’or gender=’男’and grade=100;

三、高级查询

1、聚合函数

函数名称 作用 函数名称 作用
count() 返回某列的行数 max() 返回某列的最大值
sun() 返回某列值的和 min() 返回某列的最大值
avg 返回某列的平均值

1> count()函数
语法:

select count(*) from 表名;

2> sum()函数
语法:

select sum(字段名) from 表名;

3> avg()函数
语法:

select avg(字段名) from 表名;

4> max()函数
语法:

select max(字段名) from 表名;

5> min()函数
语法:

select min(字段名) from 表名;

2、对查询的结果排序

语法:

select 字段1,字段2,…… from 表名 order by 字段名1[asc|desc],字段名2[asc|desc]……;

order by 默认为升序排列
asc升序
desc降序

如果某条记录的字段为null则升序排列时会在第一条显示,因为null值可以被认为是最小值。

3、分组查询

语法:

select 字段名1,字段名2,…… from 表名 group by 字段1,字段2,…[having 条件表达式];

1>单独使用group by分组
单独使用group by关键字,查询的是每个分组中的一条记录

2>group by 和聚合函数一起使用
group by和聚合函数一起使用,可以统计出某个或者某些字段在一个分组中的最大值、最小值、平均值等。
例如:将student表按照gender字段值进行分组查询,计算出每个分组中各有多少学生:

select count(*),gender from student group by gender;

3>group by 和 having 关键字一起使用
having 关键字和where关键字作用相同,都用于设置条件表达式的查询结果进行过滤,两者区别在于having关键字后可以跟聚合函数,而where关键字不能。通常情况下having关键字都和group by一起使用,用于对分组后的结果进行过滤。
例如:将表student表按照gender字段进行分组查询,查询出gender字段值之和小于300的分组;

select sum(gender) from student group by gender having sum(grader)<300;

4> 使用limit限制查询结果的数量
语法:

select 字段名1,字段名2,… from 表名 limit[offset,]记录数;

offset为偏移量:偏移量为0时从第一条记录开始查询,
偏移量为2时从第3条记录开始查询.offset默认值为0。
例如查询student表中的前四条记录;

select * from student limit 4;

例如查询student表中grade字段值从5位到8位的学生(从高到低):

select * from student order by grade desc limit 4,4;

Ps:第二个参数为返回四条纪录

5> 函数(列表)
数学函数

函数名称	作用
ABS(x)		返回x的绝对值
SQRT(x)		返回x的非负2次方根
MOD(x,y)	返回x被y除后的余数
CEILING(x)	返回不小于x的最小整数
FLOOR(x)	返回不大于x的最大整数
ROUND(x,y)	对x进行四舍五入操作,小数点后保留y位
TRUNCATE(x,y)	舍去x中小数点y位后面的数
SIGN(x)		返回x的符号,-10或者1

字符串函数

函数名称	作用
LEBGTH(str)			返回字符串str长度
CONCAT(s1,s2,)		返回一个或者多个字符串连接产生的新的字符串
TRIM(str)			删除字符串两侧的空格
 REPLACE(str,s1,s2)	使用字符串s2替换字符串str中所有的字符串s1
SUBSTRING(sre,n,len)	返回字符串str的字串,起始位置为n,长度为len
REVERSE(str)		返回字符串反转后的结果
LOCATE(s1,str)		返回子串s1在字符串str中的起始位置日期和时间函数

CURDATE()	获取系统当前日期	
ADDDATE()	执行日期的加运算
CURTIME()	获取系统当前时间	
SBUDATE()	执行日期的减运算
SYSDATE()	获取当前系统日期和时间	
DATE_FORMATE()	格式化输入的日期和时间值
TEME_TO_SEC()	返回将将时间换成秒的结果	条件判断函数	

IF(expr,v1,v2)	如果expr表达式为true返回v1,否则返回v2
IFNULL(v1,v2)	如果v1不为null返回v1,否则返回v2
CASE expr WHEN v1 THEN r1[WHEN v2 THEN r2…]  [ELSE rn]END	如果expr值等于v1、v2等,则返回对应位置then后面的结果,否则返回ELSE后的结果rn

加密函数

MD5(str)			对字符串str进行MD5加密
ENCODE(str,pwd,str)	使用pwd作为密码加密字符串str
DECODE(str,pwd,str)	使用pwd作为密码解密字符串str

例如:查询表student中所有记录,经每个字段值使用下划线“—”连接起来:

select concat(id,’_’, name,’_’, gender) from student;

例如:查询表student中id和gender字段值,如果gender字段值为“男”则返回1否则返回2:

select id,if(gender=’男’,1,0) from student;

4、为表和字段取别名

别名可以代替其指定的表和字段,当表名或字段名太长时可以为他们取一个别名以便于查询。
1> 为表取别名
语法:

select * from 表名 [as] 别名; 

2> 为字段取别名
语法:

select 字段名 [as] 别名[,字段名 [as] 别名] from 表名;

第五章:多表查询

一、外键

1、什么外键:

外键是指引用另一个一列或多列,被引用的列应该具有主键约束或唯一性的约束。外键用于建立和加强连个表数据之间的连接。

2、为表添加外键约束

语法:

alter table 表名 add constraint FK_ID foreign key(外键字段名) REFERENCES 外表表名(主键字段);

例如:为表student添加外键约束:
首先创建两个表:

create table grade(id int(4) not null primary key,name varchar(36));

create table student(sid int(4) not null primary key,sname varchar(36),gid int(4) not null);

为student添加主键:

alter table student add constraint FK_ID foreign key(gid) REFERENCES grade(id);

FK_ID为外键名;
可以利用语句show create table student;查看是否创建成功。由此我们可以得出gid为student表的外键,并且gid外键依赖于grade表中的id主键,这样两个表就联系起来了。

3、添加外键约束的参数说明

建立外键是为了保证数据的完整和统一性,但如果主表中数据被删除或者修改,很明显,从表中对应的数据也应该被删除,否则数据库中就会存在很多垃圾数据。Mysql可以在添加外键时添加on delete或者on update子句来告诉数据库怎样避免垃圾数据的产生:

alter table 表名 add constraint FK_ID foreign key(外键字段名称) references 外表表名(主键字段名);

[on delete{cascade | set null |no action | restrict}]
[on update{cascade | set null |no action | restrict}]

添加外键约束的参数说明

参数名称		功能描述
cascade		删除包含与已删除键值有参照关系的所有记录
set null	修改包含与已删除键值有参照关系的所有记录,使用null值代替(不能用于已标记为not null的字段)
no action	不进行任何操作
restrict	拒绝主表删除或修改外键关联列。(在不定义on deleteon update子句时,这是默认设置,也是最安全的设置)

4、删除外键约束

语法:

alter table 表名 drop foreign key 外键名;

二、操作关联表

1、关联关系:

多对一(员工与部门)、多对多(学生与课程)、一对一(人与身份证);

2、添加数据:

关联两个表:

alter table student add constraint FK_ID foreign key (gid) reference grade(id);

为grade表添加数据:

Insert into grade (id,name)values((1,’软件一班’),(2,’软件二班’));

添加的主键id为1和2由于student表达外键与grade表达主键有关联,因此在为student添加数据是gid的值只能是1和2,不能使用其他值。

为student表添加数据:

insert into student (sid,sname,gid)
values((1,’王红’,1)
(2,’李强’,2)
(3,’赵四’,1)
(4,’王五’,2));

3、删除数据

例如:删除软件一班
PS:如果要删除软件一班,直接delete from grade where name=’软件一班’;是无法删除的,会报错。因为grade和student表之间有关联关系,参照列被参照的值是不能被删除的,因为需要先删除软件一班所有学生然后再删除班级。

delete from student where sname=’王红’;
delete from student where sname=’赵四’;
delete from grade where id=1;

三、连接查询

连接查询包括交叉连接查询、内连接查询、外连接查询。

1、交叉连接

交叉连接返回的结果是被连接的连个表中所有数据的行的笛卡尔积,也就是返回第一个表中符合条件的数据行数乘以第二个表中符合条件的数据行数。
语法:

select * from1 cross join2;

2、内连接

内连接又称为简单连接或自然连接,是一种常见的连接查询。内连接使用比较运算符对两个表中的数据进行比较,并列出与连接条件匹配的数据行,组合成新的记录,也就是说在内连接查询中只有满足条件的记录才能出现在查询结果中。
语法:

select 查询字段 from1 [inner] join2 on1.关系字段=2.关系字段;

Ps: inner join 用于连接两个表,on来指定连接条件,其中inner可以省略
例如:在department表和employee表之间分别使用内连接查询和where查询实现同样的功能:
内连接:

select employee.name, department.dname from department join employee on department.did=employee.did;

Ps: 其中did分别是department和employee表的字段;
where查询:

select employee.name, department.dname from employee , department where department.did=employee.did;

**通过查询我们可以得出两者查询结果相同,但需注意的是inner join 是内连接语句,where是条件判断语句,在where语句后可以直接添加其他条件,而inner join 语句不可以。
**
如果连接中涉及的两个表是同一个表,这种查询称为自连接查询。自连接是一种特殊的内连接,他是指相互连接的表在物理上为同一个表,但在逻辑上分为两个表,例如要查询王红所在的部门有哪些员工,就可以使用自连接查询。
例如:在department和employee表中使用自连接查询:
查询王红所在部门还有谁:

select p1.* from employee p1 join employee p2 on p1.did=p2.did where p2.name=’王红’;

3、外连接

外链接(outer join):则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。

外链接分为左连接和右连接。
通常我们省略outer 这个关键字。写成:LEFT/RIGHT/FULL JOIN。
语法:

select 所查字段 from1 left| right [outer] join2 on1.关系字段=2.关系字段 where 条件;
1、 左连接(LIFT JOIN)

左连接:返回包括左表中的所有记录和右表中符合条件的记录;
例如:在department和employee表之间使用左查询:

select department.did,department.dname, employee.name from department left join employee on department.did = employee.did; 

查询结果:

did	dname	name
1	网络部	王红
1	网络部	李强
2	媒体部	赵四
3	研发部	NULL
5	人事部	NULL

从上述结果可以看出,显示的5条记录,并且人事部没有did等于5的员工。

2、 右连接(right join)

右连接:返回包括右表中的所有记录和左表中符合条件的记录;
例如:在department和employee表之间使用右查询:

select department.did,department.dname, employee.name from department right join employee on department.did = employee.did; 
did	dname	name
1	网络部	王红
1	网络部	李强
2	媒体部	赵四
NULL	NULL	何娟

从上述结果可以看出,显示的4条记录,并且name值为何娟的员工并没有被分配部门。

4、 复合连接查询

复合条件查询就是在连接查询的过程中,通过添加过滤条件来限制查询结果,使查询更加精确。
例如:在department和employee表之间使用内连接查询,并将查询结果按照年龄从大到小进行排序:

select employee.name employee.age department.dname from department join employee on department.did=employee.did order by age;

四、子查询

子查询是指一个查询语句嵌套在另一个查询语句内部的查询。它可以嵌套在一个select、select…into语句。Insert…into等语句中。在执行语句时,首先会执行子查询中的语句,然后将返回的结果作为外层查询的过滤条件,在子查询中通常使用in、exists、any、all操作符。

1、 带in关键字的子查询

使用in关键字进行查询时,内层查询语句仅返回一个数据列,这个数据列的值中的值将供外层查询语句进行比较操作。
例如:查询存在年龄为20岁的员工:

select * from deparment where did in(select did from employee where age=20);

例如:查询不存在年龄为20岁的员工:

select * from deparment where did not in(select did from employee where age=20);

2、 带exists关键字的子查询

Exists关键字后面的参数可以是任意一个子查询,这个子查询就相当于一个测试它不产生任何数据。只返回true或false当返回值为true时外层查询才会执行。
例如:查询employee是否存在年龄大于21的员工,如果存在,测查询department的记录:

 select * from department where exists(select did from employee where age>21);

exists关键字比in关键字的运行效率高,所以在实际开发中,特别是特别大的数据量时推荐使用exists关键字。

3、 带any关键字的子查询

any关键字表示满足其中任意一个条件,它允许创建一个表达式对子查询的返回值列表进行比较,只要满足内层查询中的任意一个比较条件,就会返回一个结果作为外层查询条件。
例如:使用any查询满足条件的部门

select * from department where did > any (select did from employee);
did	dname
2	媒体部
3	研发部
5	人事部

上述语句在执行的过程中,首先子查询会将employee表中的所有did 查询出来,分别为1、1、2、4,然后将department 表中did的值与之进行比较,只要大于employee did中的任意一个值,就是符合条件的查询结果,由于department表中的媒体部、研发部、人事部的did都大于employee表中的did(did=1),因此输出结果为媒体部、研发部和人事部。

4、 带all关键字的子查询

All关键字的子查询返回的结果需同时满足所有内层查询条件。
例如:使用all查询满足条件的部

select * from department where did > all (select did from employee);

上述语句在执行的过程中,首先子查询会将employee表中的所有did 查询出来,分别为1、1、2、4,然后将department 表中did的值与之进行比较,只要大于employee did中的所有值,才是符合条件的查询结果,由于只有人事部的did=5,,大于employee表中所有did所以最终查询的结果为人事部。

5、带比较运算符的子查询

子查询中还可以使用其他的比较运算符,如:“>”、“<”、“=”、“>=”、“<=”’、“!=”等
例如:使用比较运算符子查询,查询李四是哪个部门的员工的部门 :

select * from department where did=(select did from employee where name=’李四’);

其他

SQL CHECK 约束

• SQL Foreign Key
• SQL Default

SQL CHECK 约束

CHECK 约束用于限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列只允许特定的值。
如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。

SQL PRIMARY KEY 约束

• SQL Unique
• SQL Foreign Key

SQL PRIMARY KEY 约束

PRIMARY KEY 约束唯一标识数据库表中的每条记录。
主键必须包含唯一的值。
主键列不能包含 NULL 值。
每个表都应该有一个主键,并且每个表只能有一个主键。
SQL PRIMARY KEY Constraint on CREATE TABLE
下面的 SQL 在 “Persons” 表创建时在 “Id_P” 列创建 PRIMARYKEY 约束:

MySQL:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (Id_P)
);

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);

如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)
)

SQL PRIMARY KEY Constraint on ALTER TABLE
如果在表已存在的情况下为 “Id_P” 列创建 PRIMARY KEY 约束,请使用下面的 SQL:

MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD PRIMARY KEY (Id_P)

如果需要命名 PRIMARY KEY 约束,以及为多个列定义 PRIMARY KEY 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (Id_P,LastName)

注释:如果您使用 ALTER TABLE 语句添加主键,必须把主键列声明为不包含 NULL 值(在表首次创建时)。
撤销 PRIMARY KEY 约束
如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:
MySQL:

ALTER TABLE Persons
DROP PRIMARY KEY
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
DROP CONSTRAINT pk_PersonID

SQL CHECK Constraint on CREATE TABLE
下面的 SQL 在 “Persons” 表创建时为 “Id_P” 列创建 CHECK 约束。CHECK 约束规定 “Id_P” 列必须只包含大于 0 的整数。
My SQL:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CHECK (Id_P>0)
)

SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL CHECK (Id_P>0),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255)
)

如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:
MySQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')
)

SQL CHECK Constraint on ALTER TABLE
如果在表已存在的情况下为 “Id_P” 列创建 CHECK 约束,请使用下面的 SQL:
MySQL / SQL Server / Oracle / MS Access:

ALTER TABLE Persons
ADD CHECK (Id_P>0)

如果需要命名 CHECK 约束,以及为多个列定义 CHECK 约束,请使用下面的 SQL 语法:

MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ADD CONSTRAINT chk_Person CHECK (Id_P>0 AND City='Sandnes')

撤销 CHECK 约束
如需撤销 CHECK 约束,请使用下面的 SQL:
SQL Server / Oracle / MS Access:

ALTER TABLE Persons
DROP CONSTRAINT chk_Person

MySQL:

ALTER TABLE Persons
DROP CHECK chk_Person

SQL DEFAULT 约束

DEFAULT 约束用于向列中插入默认值。
如果没有规定其他的值,那么会将默认值添加到所有的新记录。
SQL DEFAULT Constraint on CREATE TABLE
下面的 SQL 在 “Persons” 表创建时为 “City” 列创建 DEFAULT 约束:
My SQL / SQL Server / Oracle / MS Access:

CREATE TABLE Persons
(
Id_P int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT 'Sandnes'
)

通过使用类似 GETDATE() 这样的函数,DEFAULT 约束也可以用于插入系统值:

CREATE TABLE Orders
(
Id_O int NOT NULL,
OrderNo int NOT NULL,
Id_P int,
OrderDate date DEFAULT GETDATE()
)

SQL DEFAULT Constraint on ALTER TABLE
如果在表已存在的情况下为 “City” 列创建 DEFAULT 约束,请使用下面的 SQL:
MySQL:

ALTER TABLE Persons
ALTER City SET DEFAULT 'SANDNES'
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City SET DEFAULT 'SANDNES'

撤销 DEFAULT 约束
如需撤销 DEFAULT 约束,请使用下面的 SQL:
MySQL:

ALTER TABLE Persons
ALTER City DROP DEFAULT
SQL Server / Oracle / MS Access:
ALTER TABLE Persons
ALTER COLUMN City DROP DEFAULT

mysql如何把一个表直接拷贝到一个新的表

一:在新表已经建立好的情况下

1,拷贝所有的字段

insert into new_table select * from old_table

2,拷贝部分字段表

insert into new_table(id,name,sex) select id,name,sex from old_table

3,拷贝部分的行

insert into new_table select  *  from old_table where id="1"

4,拷贝部分的行和字段

insert into new_table(id,name,sex) select id,name,sex form old_table where id='1'

二:在新表还没有建的情况下

方案一:

create table new_table (select * from old_table)

这种方案建的话,只是拷贝的查询的结果,新表不会有主键和索引
方案二:

create table new_table LIKE old_table

该方案只能拷贝表结构到新表中,不会拷贝数据
方案三:
如果要真正的复制一个数据到新表,我们可以直接执行下面的语句

create table new_table LIKE old_table;
insert into new_table select * from old_table;

三:我们也可以操作其它的数据库中的表

create table new_table LIKE ortherdatabase.old_table;
insert into new_table select * from ortherdatabase.old_table;

ortherdatabase.old_table中的ortherdatabase是指定的数据库名

四:我们也可以在新建表时改名字

create table new_table (select id,name as username from old_table)

如何修改mysql表的存储引擎

1、修改表引擎方法
alter table table_name engine=innodb;
2、查看系统支持的存储引擎
show engines;
3、查看表使用的存储引擎
两种方法:
第一种、
show table status from db_name where name=‘table_name’;
第二种、
show create table table_name;
如果显示的格式不好看,可以用\g代替行尾分号
有人说用第二种方法不准确
我试了下,关闭掉原先默认的Innodb引擎后根本无法执行show create table table_name指令,因为之前建的是Innodb表,关掉后默认用MyISAM引擎,导致Innodb表数据无法被正确读取。

4 关闭Innodb引擎方法
关闭mysql服务:

 net stop mysql

找到mysql安装目录下的my.ini文件:
找到default-storage-engine=INNODB 改为default-storage-engine=MYISAM
找到#skip-innodb 改为skip-innodb
启动mysql服务:

 net start mysql

你可能感兴趣的:(MySQL)