7.Subquery
A subquery is a query in query.
(1)SELECT的返回值,作为输入或判断条件
INSERT INTO xxx SELECT * FROM yyy
WHERE xx=(SELECT xx )
(2)IN
WHERE xxx IN (SELECT xxx)
相对于(1)中只有一个属性相等,IN可以匹配多个满足()里条件的属性
(3)EXIST/NOT EXIST
和(2)的功能是差不多的,只是不需要指出满足条件的xxx属性,而是把条件都放在()中
WHERE EXIST (SELECT FROM WHERE)
其实就是有2个WHERE然后可以搜索两个table,而这个功能只需要在最开始的FROM中填2个teble便可以直接用WHERE实现该功能
8.Constraints
①NOT NULL
②UNIQUE
取值如果是非空的话,不能有相同值。但是如果是NULL的话,可以重复。
③PRIMARY KEY
PRIMARY KEY = NOT NULL + UNIQUE
④FOREIGN KEY
What:一个表中的FOREIGN KEY指向另一张表中的PRIMARY KEY , 它是两张表之间的引用关系。
Statement: FOREIGN KEY(name) REFERECES table (another name)
Effect:不能像一张表中插入一个PRIMARY KEY 条目,如果该条目没有在被引用的table中出现。
⑤ ENUM
只有有限的取值
⑥SET
只有有限的取值,但可以同时有多个值
9.Exporting/Importing
①文件/csv
SELECT * FROM XXX INTO OUTFILE '地址/文件名' ; 注:如果文件名不要后缀就是文件类型,如果txt就是文本文件,其实一样。
LOAD DATA INFILE ‘地址/文件名’ INTO TABLE XXX;
注2:MySQL里面的地址分隔符是/不是\如果用错会出错。
csv文件是以逗号隔开的文件,使用于多种应用程序的导入,比如excel就能读取这种文件。
所以在导出/导入csv文件的时候要加一句FIELD TERMINATED BY ‘,’;
SELECT * FROM XXX INTO OUTFILE ‘地址/文件名.csv’
FIELDS TERMINATED BY ',';
LOAD DATA INFILE ‘地址/文件名.csv’ INTO TABLE XXX
FIELDS TERMINATED BY ',';
注3:在导出的时候要用root才有权限,即使这样也不能随便导出,我导出到桌面就不行,导入到E盘这些就行。
②xml
$ mysql -u root -p --xml -e 'SELECT * FROM mydb.XXX' > 地址/文件名.xml
mysql> LOAD XML 地址/文件名.xml INTO TABLE XXX ;
③.sql
这个是使用mysqldump命令来完成整个数据库的备份,备份为一个sql文件。
后面用到的stored routines(可以理解为我们自定义的函数)用sql导入也很方便。
$ mysqldump -u root -p 数据库名字 > 备份文件名.sql
mysql> source 备份文件名.sql
这个mysqldump备份的文件是保存在cmd窗口的当前路径的,即一般进入时的C:\Users\Administrator下面。
它的source命令应该就是在该目录下寻找,也许你可以看看给出绝对路径看看能不能找到。
10.Joining tables
①from后面用逗号连接两个table
这种就相当于笛卡尔积,即对于table1中的每一项,在table2中选出每一项,组成M*N项元组,然后再由where选择,再由select呈现。
这个其实和②里面的 cross join是一样的。
②from后面用join来连接两个table
有关join的具体内容在这个帖子里面讲滴很明白:http://blog.youkuaiyun.com/hu330459076/article/details/6995308
我将它转载过来。
连接类型 | 定义 | |
Inner Join | 内连接是最常见的一种连接,它也被称为普通连接,只连接匹配的行(仅对满足连接条件的CROSS中的列)。它又分为等值连接(连接条件运算符为"=")和不等值连接(连接条件运算符不为"=",例如between...and)。 | |
Outer Join | Full Outer Join | 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。 |
Left Outer Join | 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行 | |
Right Outer Join | 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行 | |
Cross Join | 笛卡尔乘积(所有可能的行对),交叉连接用于对两个源表进行纯关系代数的乘运算。它不使用连接条件来限制结果集合,而是将分别来自两个数据源中的行以所有可能的方式进行组合。 | |
Appendix | Natural Join | 自然连接是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉;而等值连接不会去掉重复的属性列。 |
Self Join | 某个表和其自身连接,连接方式可以是内连接,外连接,交叉连接 |
Inner Join:
Select * from t1,t2 where t1.id=t2.c1
Select * from t1 inner join t2 ont1.id=t2.c1
Select * from t1,t2 where t1.id between 1and 4;
Full Outer Join:
Select * from t1 full outer join t2 ont1.id = t2.c1
Left Outer Join
Select * from t1 left outer join t2 ont1.id =t2.c1;
Right Outer Join
Select * from t1 right outer join t2 ont1.id =t2.c1;
Cross Join
Select * from t1 cross join t2;
Natural Join (t1和t3表都有id列并且数据类型一样)
Select * from t1 naturaljoin t3;
Self Join
Select * from t1 as t1_s, t1;
但是要注意以下几点内容。
注:(1)凡是使用join以后,表示条件就不能用where了。
可以用on或者是using(相同的属性名)。
on和where用法上是差不多的。
using(相同的属性名)会选出对应有相同属性名且取值相同的项,而且显示时会把两个表中的相同属性合并成1列,而on即使有相同属性仍旧显示2列。
(2)在MySQL中
natural join会自动匹配具有相同属性相同取值的项,但是如果没有相同属性,它就相当于是一个cross join
innner join如果没有加on或者using的条件默认也是cross join生成M*N项。
而如果在cross join后面加on的条件,默认就变成inner join了。
11.MySQL funtions
这个没什么好说的,一共有5种类型的内置函数,都是通过select 函数来调用的,这里只列出5种类型。
①Math
②Aggregate
③String
④Date&time
⑤System
注:Aggregate是统计函数的意思,比如最大,最小,平均,标准差,方差这种。
12.Views
这个内容主要是理解view是什么,我的理解是就是对于table的引用,还是通过create来生成,
来自于table的select的结果。
其作用是提高安全性。
当其对应的table消失后它也就跟着消失,当对应table update后它会不会update我还没有试验。
13.Transactions
重要的也是理解概念,它就是一个操作块,这个操作块里面有若干操作,这个操作块满足ACID性质。
作用就是对于高并发性,以及一些重要信息确保操作的安全性。
ACID
A:atomicity,操作块中的操作要么全部成功要么都不成功,称为原子性。
C:consistency,对于一条元组必须是完整的。
I:isolation,针对并发操作的对于同一数据的访问性质,分为多个级别。
D:durability,针对系统失效以后对于已提交信息的恢复能力。
两个操作,commit与roll back
commit:提交,将修改同步到数据库server,也就是说这时你的修改对于其他client才是可见的。
在非transaction的命令中,系统是默认autocommit的,自动提交。
而transaction操作块需要手动输入commit;
roll back:回滚。与提交对应,撤回修改。
在tansaction的最后要么是commit命令要么是roll back。
14 Stored routines
说穿了就是自定义的函数。分为两种:procedure和function
procedure对应于没有返回值的,相当于void f()。调用它的命令是CALL xxx
function是由返回值的。调用它的命令是SELECT xxx
一般它们的定义都是采用.sql文件,
之前有提到备份数据库也是备份为.sql文件,实际上你打开它就会知道备份的那些命令是什么了,只是那是系统生成的命令,
这里要我们自己定义。
定义好后,source 文件名.sql便导入了,然后就可以调用了。
注:虽然procedure本身不会有返回值,但是它可以有参数,我们可以讲运算结果放入某个参数,然后再手动访问它看结果,
而且,我们可以在proceduire里面调用select等一些返回参数的东西返回值。