当前位置: 首页 > 后端技术 > Node.js

Mysql中常用sql语句汇总

时间:2023-04-03 23:04:55 Node.js

如果对NodeJs系列感兴趣,请关注微信公众号:前端S.H.I.E.L.D.或githubNodeJs系列文章TableMySQLCREATETABLEStatementByExamplesSyntaxCREATETABLE[IFNOTEXISTS]table_name(column_list)ENGINE=storage_engineIFNOTEXISTS可选,但推荐,它会先检查是否有同名表,如果没有则创建它。storage_engineMySql支持多种存储引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、ARCHIVE、CSV、FEDERATED,如果不指定,默认值是InnoDB在建表时需要给一个字段(或列名),格式如下:column_namedata_type(length)[NOTNULL][DEFAULTvalue][AUTO_INCREMENT]如果需要使用主键,可以使用如下语法:PRIMARYKEY(col1,col2,...)ExampleCREATETABLEIFNOTEXISTStasks(task_idINTAUTO_INCREMENT,titleVARCHAR(255)NOTNULL,start_dateDATE,due_dateDATE,statusTINYINTNOTNULL,priorityTINYINTNOTNULL,descriptionTEXT,PRIMARYKEY(task_id))引擎=创新数据库;数据检索(SELECT)语法SELECT[alias1.]column_1,[alias1.]column_2,...FROMtable_1[ASalias1],table_2[ASalias2][INNER|LEFT|RIGHT]JOINtable_3ONconditionsWHEREconditionsGROUPBYcolumn_1HAVINGgroup_conditionsORDERBYcolumn_1LIMIToffset,length;WHEREclauseMySQLWHEREW在SELECT中使用,也可以在UPDATE和DELETE中使用比较运算符。OperatorDescription=等于<>或!=不等于<小于>大于<=小于等于=|大于或等于AND运算符MySQLAND运算符语法WHEREboolean_expression_1ANDboolean_expression_2ANDTRUEFALSENULLTRUETRUEFALSENULLFALSEFALSEFALSEFALSENULLNULLFALSENULLOR操作符MySQLOROperatorboolean_expression_1ORboolean_expression_2ORTRUEFALSENULLTRUETRUETRUETRUEFALSETRUEFALSENULLNULLTRUENULLNULL需要注意的是AND操作符的优先级大于OR操作符BETWEENMySQLBETWEEN表示的是区间条件语法expr[NOT]BETWEENbegin_exprANDend_expr;expr在/不在区间begin_expr和end_expr之间exprThedatatypesofbegin_exprandend_exprmustbethesame.ExampleSELECTproductCode,productName,buyPriceFROMproductsWHEREbuyPriceBETWEEN90AND100;LIKEMySQLLIKEsyntaxexprLIKE'pattern'LIKEsupportsthefollowingwildcardpercentsign%:Matchanynumberofoccurrencesofanycharacter(0timesormultipletimes)underscore_:matchanycharacterINMySQLINsyntaxSELECTcolumn1,column2,...FROMtable_name1WHERE(expr|column_1)[NOT]IN('value1','value2',...);ifcolumn_1Iftheresultoftheorexpressionmatchesintheset,itwillreturn1,otherwiseitwillreturn0ExampleSELECTofficeCode,city,phone,countryFROMofficesWHEREcountryIN('USA','France');ISNULLAComprehensiveLookatMySQLISNULLOperatorSyntaxvalueIS[NOT]NULLNote:NULLmeansnovalue,itisdifferentfrom0,emptycharacter,falseGROUPBY[](http://www.mysqltutorial.org/…按一个或多个列对结果集进行分组,一般来说,GROUPBY将使用语法SELECTc1,c2,...,cn,aggregate_function具有SUM、AVG、MAX、MIN(ci)等函数FROMtableWHEREwhere_conditionsGROUPBYc1,c2,...,cn;使用GROUPBY时需要注意以下几点:GROUPBY子句可以包含任意数量的列,这样可以嵌套分组,进行更详细的数据处理GROUPBY必须在FROM和WHREE之后,并且在ORDERBY之前一般SELECT中出现的非聚合函数字段在GROUPBY语句中也应该存在,比如SELECTname,address,MAX(age)FROMtGROUPBYname;运行这条sql会报错:ERROR1055(42000):Expression#2ofSELECTlistisnotinGROUPBYclauseandcontainsnonaggregatedcolumn'mydb.t.address'whichisnotfunctionallydependentoncolumnsinGROUPBYclause;thisisincompatiblewithsql_mode=only_full_group_by为了修复这个错误,我们应该从SELECT中删除address字段或者在GROUPBY中添加addressSELECTname,address,MAX(age)FROMtGROUPBYname,address;但也有一些特殊情况,请参考MySQL对GROUPBY的处理如果分组列中包含具有NULL值的行,则NULL将作为分组返回。如果列中有多行NULL值,则将它们组合在一起。如果GROUPBY子句中有嵌套组,则数据将聚合到最后指定的组。换句话说,所有指定的列在创建分组时一起计算(因此无法从单独的列中检索数据)。GROUPBY子句中列出的每一列都必须是检索列或有效表达式(但不是聚合函数)。如果在SELECT中使用了表达式,则必须在GROUPBY子句中指定相同的表达式。不能使用别名。HAVINGMySQLHAVING与GROUPBY结合使用过滤组语法HAVING条件HAVING支持所有WHERE运算符(AND、OR、IN、BETWEEN、LIKE)tblORDERBYcolumn1[ASC|DESC],column2[ASC|DESC],...注意:先按column1排序再按column2排序,这里只有当column1中的值相同时,按column2排序,如果没有ASC或者指定DESC,默认ASCLIMITMySQLLIMIT语法SELECTcolumn1,column2,...FROMtableLIMIToffset,count;LIMIT有两个参数:offset:指定起始位置,从0开始count:代表要返回的行数。子查询MySQL子查询使用子查询的个数两种形式:useSELECTlastName,firstNameinWHEREFROMemployeesWHEREofficeCodeIN(SELECTofficeCodeFROMofficesWHEREcountry='USA');选择customerNumber、checkNumber、amountFROMpaymentsWHEREamount=(SELECTMAX(amount)FROMpayments);使用FROMSELECTMAX(items),MIN(items),FLOOR(AVG(items))FROM(SELECTorderNumber,COUNT(orderNumber)ASitemsFROMorderdetailsGROUPBYorderNumber)作为行项目;JOINMySQLJoinMadeEasyForBeginners在实际业务中,我们经常将数据存储在不同的表中,那么如何用一条SELECT语句查询多个表中的数据呢?这就需要将连接分为以下几种类型:Crossjoin、Innerjoin、Leftjoin、Rightjoin。下面用一个例子来说明它们的区别。首先我们创建两个表t1和t2CREATETABLEt1(idINTPRIMARYKEY,patternVARCHAR(50)NOTNULL);CREATETABLEt2(idVARCHAR(50)PRIMARYKEY,patternVARCHAR(50)NOTNULL);t1和t2表有一个pattern列,现在我们插入一些数据INSERTINTOt1(id,pattern)VALUES(1,'Divot'),(2,'Brick'),(3,'Grid');INSERTINTOt2(id,pattern)VALUES('A','Brick'),('B','Grid'),('C','Diamond');Crossjoin先来看看Crossjoin的用法:SELECTt1.id,t2.idFROMt1CROSSJOINt2;运行结果如下:Crossjoin采用笛卡尔积的规则,其实就是将两个表相乘得到一个组合表(3*3数据)InnerjoinSELECTt1.id,t2.idFROMt1INNERJOINt2ONt1.右表无匹配记录SELECTt1.id,t2.idFROMt1LEFTJOINt2ONt1.pattern=t2.patternORDERBYt1.id;Rightjoin与Leftjoin相反,用来获取右表中的所有记录,即使是左表也没有匹配的记录。SELECTt1.id,t2.idFROMt1RIGHTJOINt2ont1.pattern=t2.patternORDERBYt2.id;组合查询(UNION)MySQLUNION用于组合多个SELECT查询语法SELECTcolumn_listUNION[DISTINCT|ALL]选择column_listUNION[DISTINCT|ALL]SELECTcolumn_list注意:UNION必须由两个或多个SELECT语句组成,由关键字UNION分隔(因此,如果组合四个SELECT语句,则将使用三个UNION关键字)。UNION中的每个查询必须包含相同的列、表达式或聚合函数(但是,各个列不需要以相同的顺序列出)。列数据类型必须兼容:类型不必相同,但必须是可以隐式转换的类型(例如,不同的数字类型或不同的日期类型)。ORDERBY子句排序。使用UNION组合查询时,只能使用一个ORDERBY子句,并且必须位于最后一个SELECT语句之后。UNION和JOIN的区别数据插入和更新INSERT语法//插入单行数据INSERTINTOtable(c1,c2,...)VALUES(v11,v12,...);//插入多行数据INSERTINTOtable(c1,c2,...)VALUES(v11,v12,...),(v21,v22,...),...(vnn,vn2,...);注意:列和值需要一一对应UPDATEMySQLUPDATE语法UPDATE[LOW_PRIORITY][IGNORE]table_nameSETcolumn_name1=expr1,column_name2=expr2,...[WHEREcondition];UPDATE支持两个修饰符:LOW_PRIORITY:延迟更新操作直到当前表没有读操作,但只有一些存储引擎支持这个修饰符,如:MyISAM、MERGE、MEMORYIGNORE:允许Mysql在出错时继续更新操作DELETEMySQLDELETE语法DELETEFROMtable_nameWHERE条件;如果不指定WHERE条件,表中的所有记录都会被删除

最新推荐
猜你喜欢