一;Mysql
1,DDL(数据定义语言)
creat/drop 表
alter table 表名 +rename/change/modify/add/drop
2,DML(数据库操纵语言)
insert into 表名 values
update 表名 set
delete from 表名
select * from 表名
3,DQL( 数据库查询语言)
select distinct 列名 from 表名
select * from 表名 where name like '_ or %'
select * from 表名 order by 列名1,列名2 desc;
select count/sum /max/min/avg from table
分组查询
select ...from ...( where ...)/(group by... having ... )+ order by
5,DCL(数据库控制语言)
二,
1,数据库的备份和恢复
备份与备份的都是数据库中的每一个表,如果该数据不存在需要先建立数据库
备份:在登录之前,该语句后不需要分号
mysqldump -u用户名 -p密码 数据库名>目标文件(绝对路径,文件后缀名为.sql)
恢复:在登录之前,该语句不需要分号
mysqldump -u用户名 -p密码 数据库<目标文件
登录之后的恢复语句:
source 备份文件路径
一次性备份和恢复所有数据库,无需登录
备份:mysqldump -uroot -p --all-databases>sqlfile.sql (无分号)
恢复:source 文件路径; (有分号)
2,主键约束
主键约束的列特点:a 非空:列中的值不能为null
b 唯一:这一列中的值不能重复
c 被引用:可以通过主键的方式,引用改行的数据(主键代表这一行)
添加主键的两种方式:
create table 表名(列名1 列类型1 primary key ,列名2 列类型2 );
create table 表名(列名1 列类型1 ,列名2 列类型2,primary key(列名1));
删除主键:
alter table 表名 drop primary key ;
创表后,为某一列设置主键约束
alter table 表名 add primary key (列名)
注:主键在一张表中最多存在一个,但是可以将多个列一起设为主键,所以说主键并不一定就
表示一列。
设置多个列为主键
alter table 表名 add primary key (列名 1,列名2 ,列名3);
但是如果已经设置过主键,再设置主键的话就会报错提示主键重复定义
如果建表的时候主键没有设置自增长,在建表后,想要将主键设置为自增长:
alter table 表名 modify column 列名 int(11) not null auto_increment
2,主键自增长约束 auto_increment
注:关键字auto_increment不能单独使用,必须与主键一同使用
若不指定主键的值,自增长会生效
若删去了id为3的这一行数据,再添加数据时,id会从4开始,不会再使用3
若id已经使用到4了,这时候添加一个数据,指定id为7,再次添加数据id为null时,id会从8开始使用
3,非空约束 not null
create table 表名 (id int primary key auto_increment, name char(50) not null);
4,唯一约束 union
create table 表名(id int primary key,name char(50)unique);
注:即使设置某一列为非空,唯一,也不能在其他表中将该表作为外键引用
二,外键约束
1,多对一或一对多关系 (多的为从表,一的为主表)
当表1与表2有关联时,如果表1是从表,表2是主表,可以通过外键约束,在表1中引用表2的主键
当表1引用表2的主键时,表1该列下的数据必须是表2主键列中已存在的数据
注:表1引用表2添加约束时的列名与表2的主键列名不是一定要一致
指定外键的两种方式:
如果表1想指定表2的主键为外键,需先存在表2
create table 表2(表2id int primary key auto_increment,表2 name varchar(50));
方式一:在创表时指定外键
fk_表2id是约束的名字,fk表示:foreign key 也是外键
create table 表名(id int primary key auto_increment,name varchar(50),dd int,
constraint fk_表2id foreign key(dd) references 表2(表2id));
方式二:在创建表以后,通过修改ddl语句来添加外键约束
alter table 表名 add constraint fk_表2id foreign key(dd) references 表2(表2id);
2,一对一关系
给表1的主键,加上表2的约束。这样表1的主键(一般为id)与表2的主键(一般为id)就会被约束,结果就是表1中有的id在表2中一定有,表2中没有的id,是不能添加进表1中的
3,多对多关系
多对多关系需要使用到中间表,有几张表,就要在中间表建立几个外键
三,多表查询
1,合并结果集
结果集,就是通过select....from...查询出来的数据,查出来的数据实际也是一张表,
所以结果集就是一张表。
两个select语句中间可以通过关键字:union连接即可
select a,b from 表1 union (all:如果在这里加上all就不会去重) select c,d from
表2;
2,连接查询
在多表查询的时候,都会去掉笛卡尔积。去除方法就是在多表查询时加上一个条件:
从表.外键列=主表.主键列
1)内连接:
mysql的方言:select * from 表名1 别名1 , 表名2 别名2 where 别名1.xx=别名2.yy;
如果表1为从表,则xx为外键约束的列名,yy为主键列名
mysql标准写法:select * from 表1名 别名1 inner join 表2名 别名2 om 别名1.xx=别名2.yy
自然连接:自然连接会自动找到两表中列名相同的比较(也就是说外键列名一定要与主键列名一样了),一般很少用 ,可读性比较低。
select * from 表名1 别名1 natural join 表名2 别名2;
注:内连接不会取出不符合条件的数据,比如表1中某一行外键约束下的内容为null的话,则该行不会满足条件,内连接就不会取出它,如果想取出,请使用外链接。
2)外连接:分为左外和右外
左外,就是不管左面表的数据是否满足条件(就是on后面的条件),都查出来
右外,同理
左外:select * from 表名1 别名1 left outer join 表名2 别名2 on 别名1.xx=别名2.yy
右外:select * from 表名1 别名1 right outer join 表名2 别名2 om 别名1.xx=别名2.yy
如果左右都想要,可以将上面的两个语句用union连接,合并结果集的方式实现
3)子查询
在一条SQL语句中有多个select的就是子查询,子查询的本质就是,先查询出一个表(结果集),再在这张表上进行后续的查询操作
标准中的写法有两种:
写在from后面(当成目标表来查询)
写在where后面(当成判断条件来查询)
如果查询出来的是单行单列的结果集,那么可以直接把该结果集作为判断条件。如id=1会确定一行数据,age确定一列,所以查出来的是单行单列的数据,可以用这种方式作为where后面的判断条件
select * from 表名1 where 列名1>(select age from 表名1 where id =1);
如果查询出来的结果是多行多列的结果集,那么就可以将该结果集当成目标表来查询
select * from (select name ,age from 表名2);
如果查询的是多行多列的结果集,那么可以将该结果集看成集合,
这时候需要用到关键字all:表示大于集合中所有的数据
select * from 表名1 where age >=all(select age from 表名1);
in表示在集合存在即可
如果查询出来的结果是单行多列的结果集,那么可以将该结果集看成一个对象(仅仅是看成
,可以看成一个对象的多个属性)。如:子查询可以查询名字为张三这一行的列1,列2的数
据,然后查询表名1中所有列1列2数据与张三的结果集相同的数据
select * from 表名1 where (列1,列2) in (select 列1,列2 from 表名1 where name
='zhangSan');
1,DDL(数据定义语言)
creat/drop 表
alter table 表名 +rename/change/modify/add/drop
2,DML(数据库操纵语言)
insert into 表名 values
update 表名 set
delete from 表名
select * from 表名
3,DQL( 数据库查询语言)
select distinct 列名 from 表名
select * from 表名 where name like '_ or %'
select * from 表名 order by 列名1,列名2 desc;
select count/sum /max/min/avg from table
分组查询
select ...from ...( where ...)/(group by... having ... )+ order by
5,DCL(数据库控制语言)
二,
1,数据库的备份和恢复
备份与备份的都是数据库中的每一个表,如果该数据不存在需要先建立数据库
备份:在登录之前,该语句后不需要分号
mysqldump -u用户名 -p密码 数据库名>目标文件(绝对路径,文件后缀名为.sql)
恢复:在登录之前,该语句不需要分号
mysqldump -u用户名 -p密码 数据库<目标文件
登录之后的恢复语句:
source 备份文件路径
一次性备份和恢复所有数据库,无需登录
备份:mysqldump -uroot -p --all-databases>sqlfile.sql (无分号)
恢复:source 文件路径; (有分号)
2,主键约束
主键约束的列特点:a 非空:列中的值不能为null
b 唯一:这一列中的值不能重复
c 被引用:可以通过主键的方式,引用改行的数据(主键代表这一行)
添加主键的两种方式:
create table 表名(列名1 列类型1 primary key ,列名2 列类型2 );
create table 表名(列名1 列类型1 ,列名2 列类型2,primary key(列名1));
删除主键:
alter table 表名 drop primary key ;
创表后,为某一列设置主键约束
alter table 表名 add primary key (列名)
注:主键在一张表中最多存在一个,但是可以将多个列一起设为主键,所以说主键并不一定就
表示一列。
设置多个列为主键
alter table 表名 add primary key (列名 1,列名2 ,列名3);
但是如果已经设置过主键,再设置主键的话就会报错提示主键重复定义
如果建表的时候主键没有设置自增长,在建表后,想要将主键设置为自增长:
alter table 表名 modify column 列名 int(11) not null auto_increment
2,主键自增长约束 auto_increment
注:关键字auto_increment不能单独使用,必须与主键一同使用
若不指定主键的值,自增长会生效
若删去了id为3的这一行数据,再添加数据时,id会从4开始,不会再使用3
若id已经使用到4了,这时候添加一个数据,指定id为7,再次添加数据id为null时,id会从8开始使用
3,非空约束 not null
create table 表名 (id int primary key auto_increment, name char(50) not null);
4,唯一约束 union
create table 表名(id int primary key,name char(50)unique);
注:即使设置某一列为非空,唯一,也不能在其他表中将该表作为外键引用
二,外键约束
1,多对一或一对多关系 (多的为从表,一的为主表)
当表1与表2有关联时,如果表1是从表,表2是主表,可以通过外键约束,在表1中引用表2的主键
当表1引用表2的主键时,表1该列下的数据必须是表2主键列中已存在的数据
注:表1引用表2添加约束时的列名与表2的主键列名不是一定要一致
指定外键的两种方式:
如果表1想指定表2的主键为外键,需先存在表2
create table 表2(表2id int primary key auto_increment,表2 name varchar(50));
方式一:在创表时指定外键
fk_表2id是约束的名字,fk表示:foreign key 也是外键
create table 表名(id int primary key auto_increment,name varchar(50),dd int,
constraint fk_表2id foreign key(dd) references 表2(表2id));
方式二:在创建表以后,通过修改ddl语句来添加外键约束
alter table 表名 add constraint fk_表2id foreign key(dd) references 表2(表2id);
2,一对一关系
给表1的主键,加上表2的约束。这样表1的主键(一般为id)与表2的主键(一般为id)就会被约束,结果就是表1中有的id在表2中一定有,表2中没有的id,是不能添加进表1中的
3,多对多关系
多对多关系需要使用到中间表,有几张表,就要在中间表建立几个外键
三,多表查询
1,合并结果集
结果集,就是通过select....from...查询出来的数据,查出来的数据实际也是一张表,
所以结果集就是一张表。
两个select语句中间可以通过关键字:union连接即可
select a,b from 表1 union (all:如果在这里加上all就不会去重) select c,d from
表2;
2,连接查询
在多表查询的时候,都会去掉笛卡尔积。去除方法就是在多表查询时加上一个条件:
从表.外键列=主表.主键列
1)内连接:
mysql的方言:select * from 表名1 别名1 , 表名2 别名2 where 别名1.xx=别名2.yy;
如果表1为从表,则xx为外键约束的列名,yy为主键列名
mysql标准写法:select * from 表1名 别名1 inner join 表2名 别名2 om 别名1.xx=别名2.yy
自然连接:自然连接会自动找到两表中列名相同的比较(也就是说外键列名一定要与主键列名一样了),一般很少用 ,可读性比较低。
select * from 表名1 别名1 natural join 表名2 别名2;
注:内连接不会取出不符合条件的数据,比如表1中某一行外键约束下的内容为null的话,则该行不会满足条件,内连接就不会取出它,如果想取出,请使用外链接。
2)外连接:分为左外和右外
左外,就是不管左面表的数据是否满足条件(就是on后面的条件),都查出来
右外,同理
左外:select * from 表名1 别名1 left outer join 表名2 别名2 on 别名1.xx=别名2.yy
右外:select * from 表名1 别名1 right outer join 表名2 别名2 om 别名1.xx=别名2.yy
如果左右都想要,可以将上面的两个语句用union连接,合并结果集的方式实现
3)子查询
在一条SQL语句中有多个select的就是子查询,子查询的本质就是,先查询出一个表(结果集),再在这张表上进行后续的查询操作
标准中的写法有两种:
写在from后面(当成目标表来查询)
写在where后面(当成判断条件来查询)
如果查询出来的是单行单列的结果集,那么可以直接把该结果集作为判断条件。如id=1会确定一行数据,age确定一列,所以查出来的是单行单列的数据,可以用这种方式作为where后面的判断条件
select * from 表名1 where 列名1>(select age from 表名1 where id =1);
如果查询出来的结果是多行多列的结果集,那么就可以将该结果集当成目标表来查询
select * from (select name ,age from 表名2);
如果查询的是多行多列的结果集,那么可以将该结果集看成集合,
这时候需要用到关键字all:表示大于集合中所有的数据
select * from 表名1 where age >=all(select age from 表名1);
in表示在集合存在即可
如果查询出来的结果是单行多列的结果集,那么可以将该结果集看成一个对象(仅仅是看成
,可以看成一个对象的多个属性)。如:子查询可以查询名字为张三这一行的列1,列2的数
据,然后查询表名1中所有列1列2数据与张三的结果集相同的数据
select * from 表名1 where (列1,列2) in (select 列1,列2 from 表名1 where name
='zhangSan');