数据定义语言(DataDefineLanguage)
数据操作语言(DataManipulationLanguage)
数据控制语言(DataControlLanguage)
表的创建
CREATETABLE表名
(列名数据类型完整性约束);
表的删除与更新
DROPTABLE表名;--删除表
ALTERTABLE表名ADD列名数据类型;--增加列名
ALTERTABLE表名DROP列名;--删除列名
ALTERTABLE表名MODIFY旧列名数据类型;--修改列名
ALTERTABLE表名CHANGE新列名数据类型;--修改列名
ALTERTABLE表名ALTER列名DROPDEFAULT;--删除默认
ALTERTABLE表名RENAMETO新表名;--修改表名
ALTERTABLE表名MODIFY列名数据类型COMMENT'';--添加备注
ALTERTABLEtbl_nameADDPRIMARYKEY(column_list):该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTERTABLEtbl_nameADDUNIQUEindex_name(column_list):这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTERTABLEtbl_nameADDINDEXindex_name(column_list):添加普通索引,索引值可出现多次。
ALTERTABLEtbl_nameADDFULLTEXTindex_name(column_list):该语句指定了索引为FULLTEXT,用于全文索引。
数据的插入
INSERT语句
INSERTINTO<表名>(列1,列2,列3,……)VALUES(值1,值2,值3,……);
数据的删除
保留数据表,仅删除全部数据行的DELETE语句
DELETEFROM<表名>;
TRUNCATE<表名>;
删除部分数据行的搜索型DELETE
DELETEFROM<表名>WHERE<条件>;
数据的更新
改变表中数据的UPDATE语句
UPDATE<表名>SET<列名>=<表达式>WHERE<条件>;
数据的查询
查询标准语句格式:
SELECT<列名>FROM<表名>;
查询所有列:*代表所有
SELECT*FROM<表名>;
为列设定别名:AS(设定汉语别名时需要必须用双引号(")括起来)
SELECTproduct_idASid,product_nameASnameFROMproduct;
从结果中去掉重复行:DISTINCT(关键字只能用在第一个列名之前)
SELECTDISTINCTproduct_typeASp_type,product_nameFROMproduct;
聚合函数中使用DISTINCT
SELECTCOUNT(DISTINCTproduct_type)FROMProduct;
常数的查询:(NULL也被视为一类数据)
表达式:SELECT<常数值>AS<显示字段名>FROMproduct;
SELECT'商品'ASstring,38ASnumber,'2009-02-24'ASdate,
product_id,product_name
FROMproduct;
根据WHERE语句来选择记录:
SELECT<列名>FROM<表名>WHERE<条件>
注释的书写方法:
1行注释
书写在“--”之后,只能写在同一行。
多行注释
书写在“/*”和“*/”之间,可以跨多行。
算数运算符
+-*/(加减乘除)
注意:所有包含NULL的计算,结果肯定是NULL
SQL语句中也可以使用运算表达式:
SELECTproduct_name,sale_price,sale_price*2AS"sale_price_x2"FROMProduct;
比较运算符(使用比较运算符时一定要注意不等号和等号的位置。)
=相等<>不等于
>=大于等于<=小于等于
>大于<小于
字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
逻辑运算符
NOT、AND、OR
多个查询条件进行组合时,需要使用AND运算符或者OR运算符。
AND运算符的优先级高于OR运算符。想要优先执行OR运算符时可以使用括号。
GROUPBY:(对表进行分组)
使用聚合函数和GROUPBY子句时需要注意以下4点。
①只能写在SELECT子句之中
②GROUPBY子句中不能使用SELECT子句中列的别名
③GROUPBY子句的聚合结果是无序的
④WHERE子句中不能使用聚合函数(SELECT子句和HAVING子句以及ORDERBY子句可以)
当聚合键中包含NULL时,也会将NULL作为一组特定的数据
GROUPBY和WHERE并用时SELECT语句的执行顺序
FROM→WHERE→GROUPBY→SELECT
GROUPBY表达式
SELECT<列名1>,<列名2>,<列名3>,……
FROM<表名>
WHERE<条件>
GROUPBY<列名1>,<列名2>,<列名3>,……;
HAVING子句(HAVING子句必须写在GROUPBY子句之后)
WHERE子句=指定行所对应的条件
HAVING子句=指定组所对应的条件
GROUPBY<列名1>,<列名2>,<列名3>,……
HAVING<分组结果对应的条件>
例子:
SELECTproduct_type,AVG(sale_price)
FROMProduct
GROUPBYproduct_type
HAVINGAVG(sale_price)>=2500;
ORDERBY子句(默认升序,DESC降序,ASC升序)(可以使用SELECT子句中定义别名)
ORDERBY<排序基准列1>,<排序基准列2>,……
子句的书写顺序
1.SELECT子句→2.FROM子句→3.WHERE子句→4.GROUPBY子句→
5.HAVING子句→6.ORDERBY子句
LIMIT1,3
函数
函数大致可以分为以下几种:
●聚合函数(用来进行数据聚合的函数)
COUNT:计算表中的记录数(行数)
SELECTCOUNT(列名)FROMProduct;(下列函数表达式相同)
SUM:计算表中数值列中数据的合计值
AVG:计算表中数值列中数据的平均值
MAX:求出表中任意列中数据的最大值
MIN:求出表中任意列中数据的最小值
●算术函数(用来进行数值计算的函数)
ABS绝对值函数:ABS(数值)
SELECTm,ABS(m)ASabs_colFROMSampleMath;
MOD求余函数:MOD(被除数,除数)
ROUND四舍五入函数:ROUND(对象数值,保留小数的位数)
●字符串函数(用来进行字符串操作的函数)
||拼接字符串函数:字符串1||字符串2
(MYSQL中使用:CONCAT(str1,str2))
LENGTH字符串长度函数:LENGTH(str)
MySQL中的LENGTH这样以字节为单位的函数进行计算时
●日期函数(用来进行日期操作的函数)
CURRENT_DATE当前日期函数:CURRENT_DATE
SELECTCURRENT_DATE;
●转换函数(用来转换数据类型和值的函数)
LOWER小写转换函数:LOWER(字符串)
REPLACE字符串的替换函数:REPLACE(对象字符串,替换前的字符串,替换后的字符串)
SUBSTRING字符串的截取函数:SUBSTRING(对象字符串FROM截取的起始位置FOR截取的字符数)
UPPER大写转换函数:UPPER(字符串)
CAST类型转换函数:CAST(转换前的值AS想要转换的数据类型)
COALESCE将NULL转换为其他值函数:COALESCE(数据1,数据2,数据3……)
谓词
谓词包括以下:
●LIKE(模糊匹配)
SELECT*FROMproductLIKE‘%s’;(后面匹配)s%’(前面匹配)‘%s%’(中间匹配)
‘_s_’(三位且中间是s的)‘_s’(两位且结尾是s的)‘s_’(两位且开头是s的)
●BETWEEN(范围查询)
SELECT*FROMproductWHEREsale_priceBETWEEN100AND1000;
●ISNULL、ISNOTNULL(判断是否为NULL)
SELECTproduct_name,purchase_priceFROMProductWHEREpurchase_priceISNULL;
●IN、NOTIN(OR的简便用法)
SELECTproduct_name,purchase_priceFROMProductWHEREpurchase_priceIN(320,500,5000);
●EXISTS
CASE表达式
--不写默认为NULL,尽量写上
--END不能省略
SELECTproduct_name,
CASEWHENproduct_type='衣服'
THEN'A:'||product_type
WHENproduct_type='办公用品'
THEN'B:'||product_type
WHENproduct_type='厨房用具'
THEN'C:'||product_type
ELSENULL
ENDASabc_product_type
FROMProduct;
SELECTSUM(CASEWHENproduct_type='衣服'
THENsale_priceELSE0END)ASsum_price_clothes,
SUM(CASEWHENproduct_type='厨房用具'
THENsale_priceELSE0END)ASsum_price_kitchen,
SUM(CASEWHENproduct_type='办公用品'
THENsale_priceELSE0END)ASsum_price_office
集合运算
表的加法——UNION(并集)
SELECTproduct_id,product_name,sale_priceFROMProduct
UNION
SELECTproduct_id,product_name,sale_priceFROMProduct2
ORDERBYsale_price;
注意事项①——作为运算对象的记录的列数必须相同
注意事项②——作为运算对象的记录中列的类型必须一致
注意事项③——可以使用任何SELECT语句,但ORDERBY子句只能在最后使用一次
选取表中公共部分——INTERSECT(交集)
INTERSECT
包含重复行的集合运算——ALL选项
SELECTproduct_id,product_nameFROMProduct
UNIONALL
SELECTproduct_id,product_nameFROMProduct2;
记录的减法——EXCEPT
EXCEPT
SELECTproduct_id,product_nameFROMProduct2
ORDERBYproduct_id;
联结
联结(JOIN)就是将其他表中的列添加过来,进行“添加列”的集合运算。
UNION是以行(纵向)为单位进行操作,而联结则是以列(横向)为单位
进行的。
将两张表进行内联结
SELECTSP.shop_id,SP.shop_name,SP.product_id,P.product_name,
P.sale_price
FROMShopProductASSP
JOINProductASPONSP.product_id=P.product_id;
内联结要点①——FROM子句
第一点要注意的是,之前的FROM子句中只有一张表,而这次我们同时使用了ShopProduct和Product两张表。
FROMShopProductASSPINNERJOINProductASP
使用关键字INNERJOIN就可以将两张表联结在一起了。SP和P
分别是这两张表的别名,但别名并不是必需的。在SELECT子句中直接使用ShopProduct和product_id这样的表的原名也没有关系,但由于表名太长会影响SQL语句的可读性,因此还是希望大家能够习惯使用别名。
内联结要点②——ON子句
第二点要注意的是ON后面的联结条件。
进行内联结时必须使用ON子句,并且要书写在FROM和WHERE之间。
内联结要点③——SELECT子句
第三点要注意的是,在SELECT子句中指定的列。
使用联结时SELECT子句中的列需要按照“<表的别名>.<列名>”的格式进行书写。
外联结——OUTERJOIN
SELECTSP.shop_id,SP.shop_name,SP.product_id,P.product_name,P.sale_price
FROMShopProductASSPRIGHTOUTERJOINProductASP
ONSP.product_id=P.product_id;
外联结中使用LEFT、RIGHT来指定主表。使用二者所得到的结果完全相同。
交叉联结——CROSSJOIN
SELECTSP.shop_id,SP.shop_name,SP.product_id,P.product_name
FROMShopProductASSPCROSSJOINProductASP;
事务
事务就是需要在同一个处理单元中执行的一系列更新处理的集合
事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
要点:
1.在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务。
2.事务处理可以用来维护数据库的完整性,保证SQL语句要么全部执行,要么全部不执行。
3.事务用来管理insert,update,delete语句
事务控制语句:
BEGIN或STARTTRANSACTION;显式地开启一个事务;
COMMIT;也可以使用COMMITWORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改成为永久性的;
ROLLBACK;有可以使用ROLLBACKWORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
SAVEPOINTidentifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
RELEASESAVEPOINTidentifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
ROLLBACKTOidentifier;把事务回滚到标记点;
SETTRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READUNCOMMITTED、READCOMMITTED、REPEATABLEREAD和SERIALIZABLE。
MYSQL事务处理主要有两种方法:
1、用BEGIN,ROLLBACK,COMMIT来实现
BEGIN开始一个事务
ROLLBACK事务回滚
COMMIT事务确认
2、直接用SET来改变MySQL的自动提交模式:
SETAUTOCOMMIT=0禁止自动提交
SETAUTOCOMMIT=1开启自动提交
MYSQL事务
BEGIN;
UPDATEscSETGrade=81WHEREGrade=80;
DELETEFROMstudentWHERESname='陈冬';
INSERTINTOstudentVALUE(9521105,'陈冬','男',19,'数学系');
UPDATEstudentSETSage=20WHERESname='陈冬';
COMMIT;
复杂查询
视图(将经常使用的SELECT语句做成视图。)
创建视图的CREATEVIEW语句
CREATEVIEW视图名称(<视图列名1>,<视图列名2>,……)
AS
删除视图
DROPVIEW视图名称
CREATEVIEWProductSum(product_type,cnt_product)
SELECTproduct_type,COUNT(*)
GROUPBYproduct_type;
子查询
子查询作为内层查询会首先执行。
SELECTproduct_type,cnt_product
FROM(SELECTproduct_type,COUNT(*)AScnt_product
FROMProductGROUPBYproduct_type)--先执行FROM子句中的SELECT子句
ASProductSum;
标量子查询就是返回单一值的子查询,绝对不能返回多行结果。
能够使用常数或者列名的地方,无论是SELECT子句、GROUPBY子句、HAVING子句,还是ORDERBY子句,只要使用单一值的几乎所有的地方都可以使用。
SELECTproduct_id,product_name,sale_price,
(SELECTAVG(sale_price)FROMProduct)--标量子查询作为列名
ASavg_price
关联子查询在细分的组内进行比较时,需要使用关联子查询。