当前位置: 首页 > 科技观察

20分钟MySQL基础介绍

时间:2023-03-12 22:13:43 科技观察

开始使用MySQL作为关系数据库(RelationalDatabaseManagementSystem),一个关系数据库由一个或几个表组成,如图:Header:每个列名;列(行):具有相同数据类型的数据的集合;row(col):每一行用来描述一个人/事物的具体信息;value(值):该行的具体信息,每个值必须与该列的数据类型相同;登录MySQLmysql-h127.0.0.1-u用户名-pmysql-D选择数据库名-h主机名-u用户名-pmysql>exit#exitmysql>quit#exit创建数据库对表的操作需要enterthelibraryuselibrarynamefirst;--创建一个名为samp_db的数据库,并指定数据库字符代码为gbkcreatedatabasesamp_dbcharactersetgbk;dropdatabasesamp_db;--删除名为samp_db的库showdatabases;--显示数据库列表。usesamp_db;--选择创建的数据库samp_dbshowtablename;--显示samp_db下的所有表名describetablename;--显示数据表的结构deletefromtablename;--清除表中的记录创建数据库表使用createtable语句完成表的创建,createtable的常见形式:语法:createtable表名(列声明);CREATETABLE`user_accounts`(`id`int(100)unsignedNOTNULLAUTO_INCREMENTprimarykey,`password`varchar(32)NOTNULLDEFAULT''COMMENT'用户密码',`reset_password`tinyint(32)NOTNULLDEFAULT0COMMENT'用户类型:0-无需重置密码;1-需要重置密码',`mobile`varchar(20)NOTNULLDEFAULT''COMMENT'手机',`create_at`timestamp(6)NOTNULLDEFAULTCURRENT_TIMESTAMP(6),`update_at`timestamp(6)NOTNULLDEFAULTCURRENT_TIMESTAMP(6)ONUPDATECURRENT_TIMESTAMP(6),--创建唯一索引,不允许重复UNIQUEINDEXidx_user_mobile(`mobile`))ENGINE=UserInnoDBDEFAULTCHARSET=utf8COMMENT='';数据类型属性说明NULL:数据列可以包含NULL值;NOTNULL:数据列不允许包含NULL值;DEFAULT:默认值;PRIMARY:KEY主键;AUTO_INCREMENT:自增,适用于整型;UNSIGNED:是索引值类型只能是正数;CHARACTERSETname:指定一个字符集;COMMENT:解释表或字段;添加、删除、修改和检查SELECTSELECT语句用于从表中选择数据。语法:SELECTcolumnnameFROMtablename语法:SELECT*FROMtablename--tableabc两个idtableabc不包含字段a=b查询,只显示idSELECTs.idfromstationsWHEREidin(13,14)anduser_idnotin(4);--从表Persons中选择LastName列的数据SELECTLastNameFROMPersons--结果集会自动去重数据SELECTDISTINCTCompanyFROMOrdersUPDATEUpdate语句用于修改表中的数据。语法:UPDATE表名SET列名=新值WHERE列名=某个值--update语句将字段值设置为取自另一个结果的字段updateusersetname=(selectnamefromuser1whereuser1.id=1)whereid=(selectidfromuser2whereuser2.name='smallSu')INSERTIINSERTINTO语句用于向表中插入新行。语法:INSERTINTO表名VALUES(值1,值2,...)语法:INSERTINTO表名(列1,列2,...)VALUES(值1,值2,...)--插入一个字段LastName=WilsonfieldAddress=shanghaiINSERTINTOPersons(LastName,Address)VALUES('JSLite','shanghai');INSERTINTOMeetingSETa=1,b=2;DELETEDELETE语句用于删除表中的行到表Persons.语法:DELETEFROMtablenameWHEREcolumnname=value--删除所有行而不删除table_name表,清空表。DELETEFROMtable_name--或DELETE*FROMtable_name--删除Person表字段LastName='Wilson'DELETEFROMPersonWHERELastName='Wilson'--删除meetingid为2和3的两条数据DELETEfrommeetingwhereidin(2,3);--表Persons字段Id_P等于Orders字段Id_P的值,--结果集显示Persons表的LastName和FirstName字段,Orders表的OrderNo字段SELECTp.LastName,p.FirstName,o.OrderNoFROMPersonsp,OrdersoWHEREp.Id_P=o.Id_PWHEREWHERE子句用于指定选择标准。语法:SELECTcolumnnameFROMtablenameWHEREcolumnoperatorvalue--从表Persons中选择Year字段大于1965的数据SELECT*FROMPersonsWHEREYear>1965ANDandORAND-如果第一个条件和第二个条件都为真;OR-如果第一个条件和第二个条件中只有一个为真;AND--删除会议表字段--id=2anduser_id=5dataand--id=3anduser_id=6dataDELETEfrommeetingwhereidin(2,3)anduser_idin(5,6);--用AND显示所有的人lastnameis"Carter"andwhonameis"Thomas":SELECT*FROMPersonsWHEREFirstName='Thomas'ANDLastName='Carter';OR--用OR显示Allpersonswhichlastnameis"Carter"orwhichfirstnameis"Thomas"":SELECT*FROMPersonsWHEREfirstname='Thomas'ORlastname='Carter'ORDERBY语句默认按升序对记录进行排序。ORDERBY-语句用于根据指定的列对结果集进行排序。DESC-按降序排列记录。ASC-按顺序对记录进行排序。--Company是Orders表中的一个字母,公司名会按字母顺序显示SELECTCompany,OrderNumberFROMOrdersORDERBYCompany--后面接DESC会降序显示SELECTCompany,OrderNumberFROMOrdersORDERBYCompanyDESC--Company会按降序显示公司名,OrderNumber将按顺序显示SELECTCompany,OrderNumberFROMOrdersORDERBYCompanyDESC,OrderNumberASCININ-运算符允许我们在WHERE子句中指定多个值。IN-运算符用于指定范围,匹配范围内的每一项。IN值规则,以逗号分隔,全部放在括号中。Syntax:SELECT"fieldname"FROM"tablename"WHERE"fieldname"IN('valueone','valuetwo',...);--从Persons表中选择字段LastName等于Adams,CarterSELECT*FROMPersonsWHERELastNameIN('Adams','Carter')NOTNOT-运算符在过滤之前始终与其他运算符一起使用。SELECTvend_id,prod_nameFROMProductsWHERENOTvend_id='DLL01'ORDERBYprod_name;ASas——可以理解为:used,as,as;别名通常是重命名的列名或表名。语法:selectcolumn_1ascolumn1,column_2ascolumn2fromtableastableSELECT*FROMEmployeeASemp--这句话的意思是找到Employee表中的所有数据,并将Employee表命名为emp。--命名表时,可以用emp代替Employee--例如SELECT*FROMemp.SELECTMAX(OrderPrice)ASLargestOrderPriceFROMOrders--列出表中Orders字段的最大值,--结果集列不显示OrderPriceDisplayLargestOrderPrice--显示表users_profile中name列SELECTt.namefrom(SELECT*fromusers_profilea)ASt;--表user_accounts命名别名ua,表users_profile命名别名up--满足条件表user_accounts字段id等于表users_profile字段user_id--Result集合只显示mobile和name两列SELECTua.mobile,up.nameFROMuser_accountsasuaINNERJOINusers_profileasupONua.id=up.user_id;JION用于根据这些表中列之间的关系从两个或多个表中查询数据。JOIN:如果表中至少有一个匹配项,则返回行INNERJOIN:INNERJOIN关键字在表中至少有一个匹配项时返回行。LEFTJOIN:即使右表没有匹配,也从左表返回所有行RIGHTJOIN:即使左表没有匹配,也从右表返回所有行FULLJOIN:只要有就返回行SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFOROMPersonsINNERJOINOrdersONPersons.Id_P=Orders.Id_PORDERBYPersons.LastName;SQL函数COUNTCOUNT允许我们计算表中有多少条记录被选中。Syntax:SELECTCOUNT("Fieldname")FROM"Tablename";--表Store_Information有几条store_name列不为空的数据。--“ISNOTNULL”表示“该字段不为空”。SELECTCOUNT(Store_Name)FROMStore_InformationWHEREStore_NameISNOTNULL;--获取Persons表的总人数SELECTCOUNT(1)AStotalsFOMPersons;--获取相同站点字段user_id的总人数selectuser_id,count(*)astotalsfromstationgroupbyuser_id;MAXMAX函数返回a中的最大值柱子。NULL值不计入计算。语法:SELECTMAX("fieldname")FROM"tablename"--列出表中Orders字段OrderPrice列的最大值,--结果集列不显示OrderPrice而显示LargestOrderPriceSELECTMAX(OrderPrice)ASLargestOrderPriceFROMOrdersAddindex普通索引(INDEX)语法:ALTERTABLE表名ADDINDEX索引名(字段名)--直接创建索引CREATEINDEXindex_userONuser(title)--修改表结构添加索引ALTERTABLEtable_nameADDINDEXindex_nameON(column(length))--添加常用名字段tousertableIndex(INDEX)ALTERTABLE`table`ADDINDEXindex_name(name)--建表时同时创建索引`time`int(10)NULLDEFAULTNULL,PRIMARYKEY(`id`),INDEXindex_name(title(length))))-----删除索引DROPINDEXindex_nameONtable主键索引(PRIMARYkey)语法:ALTERTABLE表名ADDPRIMARYKEY(字段名)--在用户表的id字段上增加一个主键索引(PRIMARYkey)(PRIMARYkey)ALTERTABLE`user`ADDPRIMARYkey(id);唯一索引(UNIQUE)语法:ALTERTABLE表名ADDUNIQUE(字段名)--添加到用户表中的creattime字段唯一索引(UNIQUE)ALTERTABLE`user`ADDUNIQUE(创作时间);全文索引(FULLTEXT)语法:ALTERTABLE表名ADDFULLTEXT(字段名)--在用户表的描述字段中添加全文索引(FULLTEXT)ALTERTABLE`user`ADDFULLTEXT(description);添加多-columnindex语法:ALTERTABLEtable_nameADDINDEXindex_name(column1,column2,column3)--在用户表(INDEX)的name、city、age字段中添加一个名为name_city_age的公共索引ALTERTABLEuserADDINDEXname_city_age(name(10),city,年龄);建立索引的时机WHERE和JOIN中出现的列需要建立索引,但事实并非如此:MySQL只对<,<=,=,>,>=,BETWEEN,IN使用索引,有时LIKE也会使用它索引当LIKE以通配符%和_开头进行查询时,MySQL不使用索引。--此时,需要对城市和年龄进行索引。--由于mytable表的userame也出现在JOIN子句中,所以也需要对其进行索引。SELECTt.NameFROMmytabletLEFTJOINmytablemONt.Name=m.usernameWHEREm.age=20ANDm.city='Shanghai';SELECT*FROMmytableWHEREusernamelike'admin%';--下一句不会用到:SELECT*FROMmytableWHEREtNamelike'%admin';--因此,使用LIKE时要注意以上区别。索引注意事项索引不会包含具有NULL值的列。使用短索引,不要对列进行操作。索引将失效。创建后修改表。添加列语法:altertable表名add列名columndatatype[afterinsertposition];示例:--在学生表末尾添加一列地址:altertablestudentsaddaddresschar(60);--在名为age的列之后插入一列birthday:altertablestudentsaddbirthdaydateafterage;修改列语法:altertable表名changecolumnnamecolumnnewnamenewdatatype;--将表中的tel列重命名为telphone:altertablestudentschangetelphonechar(13)default"-";--改变name列的数据类型到char(16):altertablestudentschangenamenamechar(16)notnull;deletethecolumnSyntax:altertabletablenamedropColumnname;--删除学生表中的生日列:altertablestudentsdropbirthday;重命名表语法:altertabletablenamerenamenewtablename;--renamestudentstabletoworkmates:altertablestudentsrenameworkmates;空表数据语法:deletefromtablename;--为workmates中的数据清空表,不删除表。deletefromworkmates;删除整个表语法:droptable表名;--删除workmates表:droptableworkmates;删除整个数据库语法:dropdatabase数据库名;--删除samp_db数据库:dropdatabasesamp_db;设置MySQLroot密码MySQLInstallMySQL数据类型