zhangbinmy 发表于 2018-10-22 11:57:52

Linux运维 第四阶段 (三) MySQL的SQL语句

  Linux运维 第四阶段 (三) MySQL的SQL语句
  SQL语句:
  1、库
  #manmysql
  #mysql-uroot -p-e‘CREATE DATABASEtestdb;’
  >HELPCREATE DATABASE(创建库)
  >CREATEDATABASE|SCHEMAdb_name ;
  例:>CREATE DATABASEIFNOT EXISTSstudents;(IF NOT EXISTS要创建的数据库不存在则创建,防止报错信息出现)
  #cat/mydata/data/students/db.opt(此文件记录有字符集及排序规则,查看字符集>SHOW CHARACTER SET;查看排序规则>SHOW COLLATION;)

  >HELP >  >HELPDROP DATABASE
  >DROPDATABASE db_name; (删除数据库)
  注:一般不会给数据库重命名,如果要改名,把服务down,直接将对应的数据库目录改名。
  2、表
  >HELPCREATE TABLE(创建表)
  >CREATETABLE ta_name(col_name col_defination,....CONSTRAINT) ;
  例:>CREATE TABLEtb1(          (方法一:直接定义一张空表)
  idINT UNSIGNEDNOT NULLAUTO_INCREMENTPRIMARY KEY,
  nameCHAR(20) NOTNULL,
  ageTINYINT NOTNULL)ENGINE=MyISAM;
  >SHOWTABLE STATUSLIKE‘tb1’\G (查看表的存储引擎)
  >SHOWINDEXES FROMtb1;(查看表索引)
  >CREATETABLE ta_nameselect-statement;(方法二:从其它表中查询出数据,并以之创建新表,仅创建查询出的数据,字段属性不复制)
  例:>CREATE TABLEtb2SELECT *FROMcourses WHERECIDDESCtestcourses; (此方法创建的新表,字段属性将不存在)
  >CREATETABLE ta_nameLIKEold_ta_name; (方法三:使用旧表中的字段属性创建一张新表)
  例:>CREATE TABLEtb3LIKE courses;
  >DROPTABLE tb1;(删除表)

  >HELP >  例:>ALTER TABLEtestADD UNIQUEKEY(course);(给字段添加唯一键)
  >ALTERTABLE testCHANGEcourse couVARCHA(50)NOT NULL;(更改字段名)
  >ALTERTABLE testADDstartdate datedefault‘2015-08-10’ FIRST;(添加字段并赋予默认值,并置于第一个字段)
  >ALTERTABLE testADDTname CHAR(10)NOTNULLAFTERstartdate; (添加字段并置于某一字段后)
  >ALTERTABLE testRENAMETO testcourse;(改表名)
  >RENAMETABLE testcourseTOtest;(改表名)
  >ALTERTABLE stuADDFOREIGN KEY(CID)REFERENCESCourses(CID); (添加外键约束,之后往表stu里插入数据时字段CID一定要在表Courses(CID)有效范围内,否则会报错)
  注:外键约束可防止误删数据,但消耗系统资源,一般不用。
  >ALTERTABLE stuENGINES=InnoDB;(改表的存储引擎)
  >SHOWTABLE STATUS\G(查看表的存储引擎等相关详细信息)
  >SHOWCREATE TABLEstu;(查看创建表时的详细语句,如查询添加的外键名称)
  >ALTERTABLE stuDROPFOREIGN KEYforeign_name;(删除外键约束)
  >HELPCREATE INDEX(创建索引)
  >CREATEINDEX index_nameONtb_name(index_column_name);
  例:>CREATE INDEXname_on_stuUSING BTREEONstu(Name);
  >CREATEINDEX name_on_stuUSINGBTREE ONstu(Name(5)DESC);(创建索引,Name字段的所有数据内容按前5个字符降序排列)
  >SHOWINDEXES FROMstu;(查看表的索引)
  注:索引只能创建、删除不能修改,如要修改则先删除再重新创建。
  >HELPDROP INDEX(删除索引)
  例:>DROPINDEX name_on_stuONstu;
  3、DML(SELECT/INSERT INTO/UPDATE/DELETE)
  >INSERTINTO tb_name(col1,col2,...)VALUES (val1,val2,....) [,(val1,val2,...)];
  例:>INSERT INTOstu(Tname,Age) VALUES(‘jowin’,25);(方式一:仅插入一行数据)
  >INSERTINTO stuVALUES(1,’chai’,25,’M’),(2,’jowin’,25,’M’),(3,’xiang’,23,’F’);(方式二:可一次添加多条记录,在有些场景下,批量插入可提高性能)
  >SELECTLAST_INSERT_ID();(查看自动增长型数据的状态)
  注:例如表中有10条记录,把表内容全删除,下次添加时会自动从11开始添加,若要从头开始计数,则删除数据时使用>TRUNCATEtb_name;
  >INSERTINTO tutors(Tname,Gender,Age)SELECT Name,Gender,AgeFROMstu WHEREAge>20;(方式三:从查询结果中添加)
  >HELPREPLACE (使用方法同INSERT INTO)
  >UPDATEtb_name SETcol1=’value’WHERE condition;
  例:>UPDATE stuSETTname=’chai’ WHERESID=1;
  >DELETEFROM tb_nameWHEREcondition;
  例:>DELETE FROMstuWHERE Tname=’chai’;
  注:为防止误删数据,一定要加上条件。
  >TRUNCATEtb_name;(清空表,并重置计数器)
  >SELECTselect_list FROMtb_nameWHERE qualification;
  注:DISTINCT相同的值只显示一次,表示独有的。
  >SELECTfield1,field2 FROMtb_name;(投影)
  >SELECT* FROMtb_nameWHERE qualification;(选择)
  查询语句类型:单表查询、多表查询、子查询
  FROM子句:要查询的关系(表,多个表,其它的SELECT语句)
  WHERE子句:
  布尔关系表达式(真假比较操作);
  =/>/>=/SELECT *FROMstu WHEREAge>20AND Gender=’M’;
  >SELECT* FROMstuWHEREAge+1>20;
  >SELECT* FROMstuWHERENOTAge>20;
  >SELECT* FROMstuWHERENOTAge>20 ANDNOTGender=’M’;
  >SELECT* FROMstuWHERENOT(Age>20 ORNOTGender=’M’);
  >SELECT* FROMstuWHEREAge>20AND AgeSELECT *FROMstu WHEREAgeBETWEEN 20AND25;
  >SELECT *FROMstu WHERENameLIKE‘Y%’;
  >SELECT *FROMstu WHERENameLIKE‘Y___’;
  >SELECT *FROMstu WHERENameLIKE‘%Y%’;
  >SELECT *FROMstu WHERENameRLIKE‘^.*$’;
  注:用正则索引会失效
  >SELECT *FROMstu WHEREAgeIN (18,25,20);
  >SELECT *FROMstu WHERECID2IS NOTNULL;
  >SELECT *FROMstu WHERECID2IS NULL;
  注:字符型的用单引号,数值型的不能用引号。
  ORDERBY column_name(将查询的结果进行排序)
  注:descending降序,ascending升序,不写默认升序。
  例:>SELECT *FROMstu WHEREAge>20AND Gender=’M’ ORDERBYName DESC;
  AS别名
  例:>SELECT NameASstu_name FROMstu;(字段名称是Name,但查询显示的结果是stu_name)
  >SELECT2+1;(SELECT语句可直接进行算术运算)
  >SELECT2+1 ASSUM;
  LIMIT count(offset偏移量,count取多少个)
  例:>SELECT NameFROMstu LIMIT2;(不管有多少个符合条件的,只显示前两个)
  >SELECTName FROMstuLIMIT 2,3;(把前两个略过,只显示之后的连续3个)
  聚合:SUM()、MIN()、MAX()、AVG()、COUNT()
  例:>SELECT AVG(Age)FROMstu;(计算表中所有人的平均年龄)
  >SELECTCOUNT(Tname) FROMstu;(计算查询出的个数)
  GROUPBY column_nameHAVINGqualification;(分组,目的做聚合函数用,进一步筛选用HAVING,且HAVING只能与GROUPBY一起用)
  例:>SELECT Age,GenderFROMstu GROUPBYGender;
  >SELECTAVG(Age) FROMstuGROUP BYGender;
  >SELECTCOUNT(CID1) ASpersons,CID1FROM stuGROUPBY CID1HAVINGpersons>=2;
  注:查询语句顺序:FROM-->WHERE-->GROUPBY-->HAVING-->ORDERBY-->LIMIT
  多表查询(复合查询):
  连接:
  交叉连接(笛卡尔积):>SELECT *FROMstu,course;
  自然连接(两个表的某字段有等值的):
  >SELECT* FROMstu,coursesWHERE stu.CID1=courses.CID1;
  >SELECTs.name,c.cnameFROM stuASs,courses AScWHERE s.CID1=c.CID1;
  外连接:左外连接(……LEFT JOIN……ON……);右外连接(……RIGHTJOIN……ON……)
  >SELECTs.Name,c.CnameFROM stuASs LEFTJOINcourses AScON s.CID1=c.CID;
  子查询:
  >SELECTName FROMstuWHERE Age > (SELECTAVG(Age)FROM stu);
  (比较操作中使用子查询,子查询语句只能返回单个值)
  >SELECTName FROMstuWHERE AgeIN(SELECT AgeFROMtutors);
  (在IN中使用子查询)
  >SELECTName,Age FROM(SELECTName,Age FROMstu)AS tWHEREt.Age>=20;
  UNION联合查询:
  >(SELECTName,Age FROMstu)UNION (SELECTTname,AgeFROM tutors);
  视图(存储下来的SELECT语句,基于基表的查询结果):
  注:使用MySQL不建议使用视图
  >HELPCREATE VIEW
  >CREATEVIEW view_nameASselect-statement;
  例:>CREATE VIEWstuviewAS SELECTName,AgeFROM stu;
  >SHOWTABLES;
  >SELECT* FROMstuview;
  >SHOWTABLE STATUS\G
  >SHOWCREATE VIEWstuview;
  >DROPVIEW stuview;
  注:只要不违反基表中的数据规则,视图中可以插入数据,但不建议这么做。
  物化视图(mysql不支持,适用于基表更新数据不多的情况)
  本篇是学习《马哥网络视频》做的笔记。

页: [1]
查看完整版本: Linux运维 第四阶段 (三) MySQL的SQL语句