**一.语句书写顺序**select:输出 (以列为单位)
from:获取数据
where:过滤 (一条条过滤,判断from中的信息,过滤列)
groupby:分组
having:过滤
orderby:排序
limit:限定个数
**二.语句执行顺序**from:获取数据
where:过滤
groupby:分组
select:输出
having:过滤
orderby:排序
limit:限定个数
**三.逐个分析**1.select
直接写出要输出列的名称,如果输出全部列则直接写*号,重命名列用as.> 聚合函数(放在select后面)
计数:count
count:同一分组的行数和
count(name):name的行数不去重
count(distinct name):name的行数去重
distinct只能放在第一个字段中,作用于后面的所有字段,而不只是distinct紧跟着的那个字段
求和:sum
最大值:Max
最小值:min
平均值:min
字符串集合:group...concat
2.from
获取数据的表名称
3.where
过滤from中获取的数据,保留符号条件的数据
4.groupby
对行进行分组
分组的目的是进行聚合
默认排序是升序:ASC
降序是:DESC
例:groupby classid ,按照classid进行分组,若遇到select,那么输出的是每一组的第一行数据,还可以和聚合函数放在一起。
5.having
在groupby 之后的过滤,对输出结果进行过滤,在select之后执行
6.orderby
以列为基础进行排序,可多列进行排序
7.limit
例:limit2 前两行
limit1,2 从1开始取两个
**四.创建表格的写法**1.创建数据库:createdatabase 数据库名称
2.创建表:createtable 表的名称
3.插入数据:insertinto 列的名称 values 数据
例如:insertinto(id,name,classid)values(1,'王‘,20)
4.清空数据表:truncate 表的名称
**五.聚合函数和casewhen**1.casewhen 表达式
then 输出
when 表达式
then 输出
else 输出
end2.if 表达式
输出
elif 表达式
输出
else 输出
六.join 连接.(放在from之后)
连接两个或两个以上的表用jion和jion on1.join: 将两表数据整合到一个新表中
2.joinon : on后面可以加一些限制条件
3.leftjoin :必须有on条件,会检查左边表的数据是否包含在新生成的表中。若是,则与join没区别;若否,用null与不包含的行组成新行加入新表。(作用:可查出一些为空的信息)
4.rightjoin :A leftjoin B = B rightjoin A
5.多表连接:
A join B join C join D
A join B on....join C on....join D on....(A join B joinon....)join(C join D on....)on
A leftjoin B on...leftjoin C joinon....**七.子查询**
若在where或select中时相当于子查询,先计算子查询的结果,后判断。
1.where子查询:
select name from stu
where classid =(select id from class where manager ="小蓝“)
2.select子查询:
select id,(select id from class where manager = "小蓝“)
from stu
注:=的子查询只能返回一个数字,in的子查询可以返回一列数字
3.from子查询:
select stu.name
from stu jion (select*from class where manager ="小蓝") as c on stu.classid = c.id
注:from里的子查询必须有别名
子查询可用jion替换
4.半连接
半连接:依赖于复查询的子查询
作用:找到每个classid中最大的id所对应的信息
例:
select*from stu as s1
where id =(selectmax(id)from stu as s2 where classid = s1.classid )**八、分组排序函数 Row_number(重点)**1.无分组排序
row_number()over(orderby 字段 desc)
例 row_number()over(orderby 学生成绩 desc)
表示不分班级,所有学生成绩由高到低排序
2.分组排序
row_number()over(PARTITIONby 字段1orderby 字段2desc)
例 row_number()over(PARTITIONby 班级 orderby 学生成绩 desc)
表示根据班级分组,并在每个班级内按学生成绩由高到低排序
**九 组合查询 union与unionall**
用法:将两个表纵向直接连接
语法:
select 字段 from 表名
unionselect 字段 from 表名
union 去重
unionall 不去重
**六.总结**
对数据库有修改的操作是:增删改
对数据库没有修改的操作是:查(SQL最主要的操作)
mysql 数据库基础知识
一、字符串连接
concat()用于连接两个或多个字符串
ifnull(字段名,值1):如果字段对应的值为null,则用值1代替null
isnull(字段名):判断字段的值是否为null,为null返回0,不为则返回1
二.条件筛选 where1.关系筛选:>,<等
2.逻辑筛选:andornot3.模糊筛选:like,between...and...,in,isnull,isnotnull
三、文本处理函数
1.获取字符串占用的字节长度 select
LENGTH('中国');2.连接字符串函数
CONCAT(first_name,' ', last_name)3.把字母转大写函数
UPPER(first_name)4.把字母转小写函数
LOWER(first_name)5.截取子字符串函数,第一个参数为截取的位置,从 1 开始,第二参数为待截取字符的个数,如果没有第二个参数则截取到字符串末尾。
SUBSTR('Hello world!',2);
SUBSTR('Hello world!',7,5);6.返回子字符串第一次出现的位置,没有返回 0
INSTR('Hello world!','world');7.去除字符串两边多余的空格
TRIM(' Hello world! ');
四、数值处理函数
# 四舍五入函数, 第二个参数表示小数点后保留几位SELECTROUND(1.56);SELECTROUND(1.56,1);# 向上取整SELECT CEIL(1.34);# 向下取整SELECT FLOOR(1.34);# 截断SELECTTRUNCATE(1.2345,2);# 取余, 结果 = x - x/y*ySELECTMOD(10,3);SELECTMOD(-10,3);
五、日期和时间处理函数
# 获取日期和时间SELECTNOW();# 获取日期SELECT CURDATE();# 获取时间SELECT CURTIME();# 获取指定的部分:年、月、日、小时、分钟、秒SELECTYEAR(NOW());SELECTMONTH(NOW());# 月份字符表示SELECT MONTHNAME(NOW());# 从 0 开始, 0 为星期一SELECT WEEKDAY(NOW());# 从 1 开始, 1 是星期天SELECT DAYOFWEEK(NOW());SELECTDAY(NOW());SELECTHOUR(NOW());SELECTMINUTE(NOW());SELECTSECOND(NOW());
六、DML
1.插入
# 语法一insertinto 表名[(字段列表)]values(值列表)# 语法二insertinto 表名
set 字段1= 值1,...
字段n = 值n;2.更新
# 修改单表记录,没有筛选条件则更新所有记录update 表名
set 字段1= 值1,
...
字段n = 值n
where 筛选条件;# 修改多表记录# sql92 语法update 表名1 别名1,... 表2 别名n
set 字段1= 值1,
...
字段n = 值n
where 连接条件 and 筛选条件;# sql99 语法update 表名1 别名1[inner|left|right]join 表名2 别名2on 连接条件1...join 表名n 别名n
on 连接条件n-1set 字段1= 值1,
...
字段n = 值n
where 筛选条件;3.删除
deletefrom 表名
where 筛选条件;delete 别名1,..., 别名n
from 表名1 别名1,..., 表名n 别名n
where 连接条件 and 筛选条件;delete 别名1,..., 别名n
from 表名1 别名1[inner|lefet|right]join 表名2 别名2on 连接条件1...join 表名n 别名n
on 连接条件n-1where 筛选条件;truncatetable 表名;