15.聚集函数
AVG(columnName)不会统计该列值为NULL的列
14.数学函数
13.使用Date取出datetime中的date
当然,Time(order_time)能取出时间
类似的方法有:Year(datetime),Month(datetime),Day(datetime),Hour(datetime),Minute(datetime),Second(datetime),()
DayofWeek(datetime)返回星期几,DateDiff(datetime1,datetime2)计算两个日期之差 = Day(datetime1)-Day(datetime2);
12.算式 AS alias
① 使用加减乘除算术符号:
② 一些现成方法,如now(),curdate(),curtime()。
Trim(" abc ")方法:
但是,并不是太推荐使用数据库内置函数,这样的移植性不是那么强。
11.AS别名(alias):
但是注意,只能给一个列或者Concat拼接的结果起别名,不能给两个列的select起别名:
11.Concat拼接结果:
10.where中使用正则表达式
9.like
① 结合通配符百分号“%”——任意字符出现任意次:
但是注意:
② 结合通配符下划线“_”——任意字符出现1次:
可以看到,“_om%”要求的是om前面只有一个字母,所以Tom可以匹配上,但是aaaTom匹配不上。
这本资料是基于MySQL 5的,有这么一句:
即city like "Shanghai"是不会返回city刚好为“Shanghai”的记录,而至少我使用的MySQL 8是可以的:
③ 正则和Like的一个注意点:
关于通配符,要注意:
8.where字句
① 之前说过的,database或table或column的排序规则会影响到等于和大于小于的结果
② 不等于可以使用“<>”或者“!=”
③ 使用where city IS NULL选出NULL值记录(不是使用 = NULL)
因为NULL记录利用Like是取不到的:
④ IN子句:
实现OR的功能:
包含sql子查询:
⑤ NOT
NOT可以和where后面任何条件连用,表示取反,特别和IN,BETWEEN,EXIST连用,很简洁。
7.主键默认值不能为NULL
MySQL强烈建议为每一张表设置一份主键。当然也可以不设置,这样非常不安全。
当然,设置为主键只代表数据库保证表中的值唯一,如insert或update一条与已有id相同的记录时,会报错。
但是不代表数据库会自动添加increment属性,这个需要自己手动加上的。这样update就不能改动id,insert一条已有id时并不会报错,因为MySQL会忽略,其实对于id的任何指定值都会忽略,数据库会自己在当前最大的id后面追加一条记录,id++。
6.每个数据库内部的表名是唯一的
实际上,由于MySQL不区分大小写,user表和USer表是一样,新建一张已经存在的表将会报错。
8.order by + limit获得TopK/BottomK数据:
5.DESC的单列作用 + 'A'和'a'是一样的。
和distinct相反,desc只对本列起作用,如果需要对两行都进行反序,则需要单独指定:
原因在本来就能够实现,每一列可以拍自己的,如果本列有重复值,右边的列可以在内部再排。
MySQL不区分大小写,在排序是默认A和a也是一样的,换句话说,如果表中有若干个相间的A和a,对于他们的order的结果将是不确定的:
但是通过改变数据库的排序规则来改变它,简而言之:在新建database或table或column时,来选择排序方式:
其中,_ci结尾的排序时都是不区分大小的。以_bin和_cs结尾的排序时都是区分大小写的。
不过要注意,如果选了区分大小写的排序规则,则也会影响到where子句中等号,大于等于,小于等于的判断:
将name的排序规则改为:
原始数据和where name =>< "tOm"结果:
可以看到,此时MySQL认为 Tom < TOM 没有数据!
(并不是ASCII码顺序:A < a)
4.distinct的多列作用
原来的表:
不加任何限制:
对name使用distinct:
对name,id同时使用distinct:
即,只要name,city不是全部一样,则都返回。将name列+city列作为是否distinct的标识。
原因如果只指定一个,则如上图有两个shishi,到底取哪一个呢,取哪个都不科学。甚至对name和city分别加distinct,返回结果该是什么呢?
3.从启动数据库(服务端)到看到行信息(记录):
客户端登录:cmd——mysql -u root -p root ;
看数据库:show databases;
进入某个数据库:use dbName;
看这个数据库有哪些表:show tables;
看某个表的域:show columns from tableName;
或者 describe tableName;
看数据库定义信息:show create database dbName;(MySQL 8)
看表定义信息:show create table tableName;(MySQL 8)
2.MySQL语句每一行最后需要加分号——";"