概述SQL的日期和时间类型比较简单日期和时间类型字节最小值最大值date41000-01-019999-12-31time3-838:59:59838:59:59year119012155datetime81000-01-0100:00:009999-12-3123:59:59timestamp4197001010800012038年的某个时刻特点\字节范围时区等的影响datetime81000-9999不受timestamp41970-2038受使用创建createtablenum.dt(d1datetime,d2timestamp,d3time)`查看结构mysql>descdt;+-------+-----------+------+-----+-------------------+-----------------------------+|Field|Type|Null|Key|Default|Extra|+-------+-----------+------+-----+-------------------+-----------------------------+|d1|datetime|YES||NULL|||d2|timestamp|NO||CURRENT_TIMESTAMP|onupdateCURRENT_TIMESTAMP||d3|time|YES||NULL||+-------+-----------+------+-----+-------------------+-----------------------------+3rowsinset(0.01sec)插入数据insertintonum.dtvalues(now(),now(),curtime());查看数据mysql>select*fromdt;+---------------------+---------------------+----------+|d1|d2|d3|+---------------------+---------------------+----------+|2020-03-0719:27:06|2020-03-0719:27:06|19:27:06|+---------------------+---------------------+----------+1rowinset(0.00sec)
数值分为两类整数小数整数类型概述SQL的整数类型有5种有符号就是正负数都可以存储,无符号只能存正数,需要unsigned修饰。Tinyint:占位1字节有符号:-128~127无符号:0~255Smallint:占位2字节有符号:-32768~32767无符号:0~65535Mediumint:占位3字节有符号:-8388608~8388607无符号:0~1677215Int:占位4字节有符号:-2147483648~2147483647无符号:0~4294967295Bigint:占位8字节有符号:-9223372036854775808~9223372036854775807无符号:0~9223372036854775807*2+1使用只用int举个例子,其他也是同理。创建表createtablet(t1int,#默认有符号t2intunsigned,#无符号不能插入负数t3int(4),/*数值代表查询结果显示的长度(不是范围,范围是intbigdata使用什么类型确定的),这样单独写是看不出效果的。*/t4int(4)unsignedzerofill/*1.需要转换成无符号添加不足长度0填充(zerofill)来显示。2.如果使用某些软件查询,查询结果可能会把填充的0去掉。*/)插入数据insertintotvalues(-1,1,1,1)查询有填充的0。mysql>select*fromt;+------+------+------+------+|t1|t2|t3|t4|+------+------+------+------+|-1|1|1|0001|+------+------+------+------+1rowinset(0.00sec)小数类型概述SQL的小数类型可以分为两大类小数型,常用于计算,浮点的运算在精度上要求不高(了解)。float(M,D):占有4字节范围:±1.75494351E-38~±3.402823466E+38double(M,D):占有8字节范围:±2.2250738585072014E-308~±1.7976931348623157E+308定点型,常用于货币的计算dec(M,D)是decimal(M,D)的缩写。dec(M,D):占有M+2个字节范围:最大取值范围与double相同,给定dec的有效取值范围由M和D决定特点M&D详解M&D的作用M:整数位数+DD:小数的位数M&D都是可以省略的小数类型省略,就不受位数限制定点数省略,将会默认dec(10,0)使用创建表createtablenum.f(f1float,#不带参数f2float(5,2),#带参数,超过范围会报错f3dec,#不带参数默认dec(10,0)f4dec(5,4)#达不到5长度,小数后0填充)查看表的结构关注表字段的Type。mysql>descf;+-------+---------------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-------+---------------+------+-----+---------+-------+|f1|float|YES||NULL|||f2|float(5,2)|YES||NULL|||f3|decimal(10,0)|YES||NULL|||f4|decimal(5,4)|YES||NULL||+-------+---------------+------+-----+---------+-------+4rowsinset(0.01sec)插入数据insertintofvalues(-1,1.56,1,1.56)查看结果dec类型填充的0,在某些软件查询会被过滤。mysql>select*fromf;+------+------+------+--------+|f1|f2|f3|f4|+------+------+------+--------+|-1|1.56|-1|1.5600|+------+------+------+--------+2rowsinset(0.00sec)
表的创建createtable表名(字段1类型1[(参数)约束],字段2类型2[(参数)约束],...字段n类型n[(参数)约束])表创建的扩展—-复制表复制表的完整结构createtable新表名like旧表名;复制表的数据和结构createtable新表名select语句;复制表的部分结构这里使用的复制的数据的思想,如果没有满足的数据那么就行了。createtablegirls.boys13selectid,boyName#部分字段fromgirls.boysbwhere1=2;#一个永远为False的条件表的修改归纳主要格式altertable表名rename|add|drop|change|modifycolumn列名[类型约束];表名的修改#格式altertable表名rename新表名;altertablebookrenamebooknames;增加列#格式altertable表名addcolumn字段名类型约束;altertablebooks.bookaddcolumnpricedouble;删除列#格式altertable表名dropcolumn列名;altertablebooks.bookdropcolumnprice;修改列可以修改旧列的名称和类型#格式altertable表名changecolumn旧列名新列名类型约束;altertablebooks.bookchangecolumnshowBookpriceint(90);修改列的类型和约束只能修改类型和约束,列名不变。#格式altertable表名modifycolumn列名类型约束;altertablebooks.bookmodifycolumnpricedouble;删除表droptable表名;
概述数据插入涉及一个关键词insert使用格式使用时注意字段的类型经典格式insertinto表名(字段1,字段2,字段3,...)values(值1,值2,值3...)另外插入方法insertinto表名set字段1=值1,字段2=值2,...使用经典格式(常用)指定字段插入values插入的数据需要与表名后的字段对应insertintogirls.boys(id,boyName,userCP)values(6,"唐三",200)省略格式当插入的数据是全部字段时,可以省略表名后的字段。insertintogirls.boysvalues(6,"唐三",200)插入多行insertintogirls.boysvalues(6,"唐三",200),(8,"小五",300),(9,"小米",400)使用子查询结果为插入值insertintogirls.boys(boyName)selectgb.namefromgirls.beautygbwheregb.id>3另一格式这种格式很直观,但很啰嗦insertintogirls.boyssetid=7,boyName="李",userCP=300;
概述SQL的数据删除有两种:删除指定数据:单表,多表清空数据表格式单表删除deletefrom表where筛选条件多表删除(不常用)delete别名1,别名2from表1别名1join表2别名2on连接条件where筛选条件清空表truncattable表名;使用删除数据单表deletefromgirls.boyswhereid=6;多表deleteb,b2fromgirls.boysbjoingirls.beautyb2onb.id=b2.boyfriend_idwhereb.id=1;清空数据表使用很简单truncatetablespark.`user`;deletefrom表名;不加筛选条件,也能实现清空表
概述联合查询的本质就是,多个SQL查询结果的虚拟表上下合并。#第一个结果==================name|salary|--------|------|Steven|24000|Neena|17000|#第二个结果==================id|salary|--|------|1|24000|2|17000|#联合之后一个字段对应一个字段的这样合并==================name|salary|--------|------|Steven|24000|Neena|17000|1|24000|2|17000|格式select语句1unionselect语句2unionselect语句3...例子select的结果字段的个数需要一样union会对结果自动去重selectgby.id,gby.namefromgirls.beautygbyunionselectgbs.id,gbs.boyNamefromgirls.boysgbs=========================id|name|--|----------|1|柳岩|2|苍老师|3|Angelababy|4|热巴|11|夏雪|12|赵敏|1|张无忌|2|鹿晗|3|黄晓明|4|段誉|
概述分页一般使用查询,在网站使用过程中,一些数据需量太大,需要翻页显示,这是就需要SQL的分页查询。格式limitindex,sizeindex:起始索引(从0开始,从0开始获取可以省略)size:条目数select字段from表1[join表2on连接表达式][where表达式][groupby字段][having表达式][limit[index,]size];使用#获取工资第一页10条工资selectfirst_name,salaryfrommyemployees.employeeswheresalaryisnotnulllimit0,10;=========================first_name|salary|----------|------|Steven|24000|Neena|17000|Lex|17000|Alexander|9000|Bruce|6000|David|4800|Valli|4800|Diana|4200|Nancy|12000|Daniel|9000|技巧页数为page,每页条目数是size。可以有一个公式:limit(page-1)*size,size;
概述连接查询又称多表查询,查询的字段来自于多个表,推荐使用SQL99语法内连接(SQL92语法不推荐使用)就是1992年推出的语法笛卡尔乘积在连接查询不加以限制时,就会产生笛卡尔乘积现象。笛卡尔乘积:A表字段3个值,B表字段4个值,最终结果3X4=12个值。selectb.name,b2.boyNamefrombeautyb,boysb2#----------------------#name|boyName|----------|-------|柳岩|张无忌|柳岩|鹿晗|柳岩|黄晓明|柳岩|段誉|Angelababy|张无忌Angelababy|鹿晗|Angelababy|黄晓明Angelababy|段誉|热巴|张无忌|热巴|鹿晗|热巴|黄晓明|热巴|段誉|等值连接对字段进行一定的限制selectb.name,b2.boyNamefrombeautyb,boysb2whereb.boyfriend_id=b2.id#--------------------------#name|boyName|----------|-------|热巴|鹿晗|Angelababy|黄晓明|非等值连接#统计不同工资的等级selecte.salaryas工资,jg.grade_levelas等级frommyemployees.employeese,myemployees.job_gradesjgwheree.salarybetweenjg.lowest_salandjg.highest_salorderby等级,工资#------------------------------------------------------#工资|等级|-----|--|2900|A|2900|A|3000|B|3000|B|3100|B|4800|B|4800|B|5800|B|6000|C|6000|C|自连接两个需要作连接条件的字段在一张表上。就是把同一张表重名为不同的名字,就可以当做两张表查询了selecte.employee_id,e.first_name,m.first_name,m.manager_idfrommyemployees.employeese,myemployees.employeesmwheree.employee_id=m.manager_id连接查询(SQL99)语法格式select字段from表1[连接格式]join表2on连接条件[连接格式]join表3on连接条件[where限定条件][groupby分组][having查询后限定条件][orderby排序]内连接内连接:查询的是两表的交集等值连接on后的连接条件是相等#每个职位的员工个数selectj.job_title职位名称,count(*)数量frommyemployees.jobsjjoinmyemployees.employeeseonj.job_id=e.job_id#相等groupby职位名称非等值连接on后的连接条件是不等的#职工的工资等级selecte.first_name名称,e.salary工资,j.grade_level等级frommyemployees.employeesejoinmyemployees.job_gradesjone.salarybetweenj.lowest_salandj.highest_sal============================名称|工资|等级|-----------|-----|--|Steven|24000|E|Neena|17000|E|Lex|17000|E|Alexander|9000|C|Bruce|6000|C|David|4800|B|Valli|4800|B|自连接连接的两张表数据来自于同一张,只要别名不同就好selecte.employee_id领导编号,e.first_name领导名称,e1.first_name职工名称,e1.manager_id职工编号frommyemployees.employeesejoinmyemployees.employeese1one.employee_id=e1.manager_id;=================================领导编号|领导名称|职工名称|职工编号|----|---------|-----------|----|100|Steven|Neena|100|100|Steven|Lex|100|102|Lex|Alexander|102|103|Alexander|Bruce|103|103|Alexander|David|103|103|Alexander|Valli|103|外连接外连接其实是:内连接的结果+主表中有而从表里没有的可以使用where、having添加条件去掉null值左外连接左外连接:from后的主表#查询女生里没有男朋友的selectgby.name,gbs.boyNamefromgirls.beautygbyleftjoingirls.boysgbsongby.boyfriend_id=gbs.id============================name|boyName|----------|-------|周芷若|张无忌|小昭|张无忌|赵敏|张无忌|热巴|鹿晗|Angelababy|黄晓明|王语嫣|段誉|柳岩||苍老师||周冬雨||岳灵珊||双儿||夏雪||右外连接结果与上面一样,但是换成了右外连接,主从表的位置也换了,现在就是join后是主表#查询女生里没有男朋友的selectgby.name,gbs.boyNamefromgirls.boysgbsrightjoingirls.beautygbyongby.boyfriend_id=gbs.id============================name|boyName|----------|-------|周芷若|张无忌|小昭|张无忌|赵敏|张无忌|热巴|鹿晗|Angelababy|黄晓明|王语嫣|段誉|柳岩||苍老师||周冬雨||岳灵珊||双儿||夏雪||交叉连接(笛卡尔乘积)注意没有on关键字selectgby.*,gbs.*fromgirls.beautygbycrossjoingirls.boysgbs=========================id|name|sex|borndate|phone|photo|boyfriend_id|id|boyName|userCP|--|----------|---|---------------------|-----------|-----|------------|--|-------|------|3|Angelababy|女|1989-02-0300:00:00.0|18209876567||3|1|张无忌|100|3|Angelababy|女|1989-02-0300:00:00.0|18209876567||3|2|鹿晗|800|3|Angelababy|女|1989-02-0300:00:00.0|18209876567||3|3|黄晓明|50|3|Angelababy|女|1989-02-0300:00:00.0|18209876567||3|4|段誉|300|4|热巴|女|1993-02-0300:00:00.0|18209876579||2|1|张无忌|100|4|热巴|女|1993-02-0300:00:00.0|18209876579||2|2|鹿晗|800|4|热巴|女|1993-02-0300:00:00.0|18209876579||2|3|黄晓明|50|4|热巴|女|1993-02-0300:00:00.0|18209876579||2|4|段誉|300|