一、常用命令
查看当前所有的数据库:show databases;
打开指定的库:use 库名;
查看当前库的所有表:show tables;
查看其他库的所有表:show tables from 库名;
创建表:create table 表名( 列名 列类型, 列名 列类型, ...... );
查看表结构:desc 表名;
查看服务器版本
方式一:登录到mysql服务端:select version();
方式二:没有登录到mysql服务端:mysql --version;或mysql --V;
二、DQL语言
1. 基础查询
- ==语法==:select 查询列表 from 表名
- ==特点==:查询结果可以是:表中的字段、常量值、表达式、函数查询的结果是一个虚拟的表格
1.查询单个字段:select XXX from XXX;
2.查询多个字段:select XXX,XXX,XXX from XXX ;可以双击左侧的字段就直接导入到命令行中,F12格式化格式。
3.查询所有字段:select * from XXX;
4.当查询的内容名称和关键字冲突时,可以用着重号区分,`XXX`
5.起别名:select XXX as X;
6.去重:当查询的结果中有重复的结果时,只希望显示共有哪几种:select distinct XXX from XXX
7.+号的作用:不能拼接字符,只有运算符的功能
8.concat(XXX,XXX,XXX)拼接操作,如果其中某一个为null,结果一定是null
9.ifnull(a,b)判断a是否为null,若是则返回b,否则返回本身。
2. 条件查询
==语法==:select 查询列表 from 表名 where 筛选条件
条件表达式查询:>,<,>=,<=,!=,=。
逻辑表达式查询:&&,||,!。(and,or,not)
模糊查询表达式查询:
①like:一般和通配符搭配使用,%表示任意多个字符,包含0个字符, _ 表示任意单个字符,如:查询包含e的元素,like %e%;如查询第三个字符为e,第五个字符为a: like '__e_a%',当下划线或者%需要使用时,可以通过转义符使用,\_ \%,或者 __%_ escape %,就表示把%当做一个转义符 ②between and:between 100 and 120(包含临界值,等价于大于等于左边小于等于右边) ③in\not in:其中之一。示例: select job from employee where job in("doctor","teacher",...),in列表的值类型必须兼容,列表值里面不能用通配符 ④is null:= 号运算符不能判断null值,所以用is null。is not null,非null。 ⑤<=>:安全等于,判断是否等于,既可以判断数值,又可以判断null值。 ⑥any\some 和子查询返回的某一个值比较,只要和其中一个比较满足条件,就看做满足条件,如15>any(10,20,30),满足条件 ⑦all 和子查询返回的所有值比较,要满足和所有值比较,才看做满足条件
3. 排序查询
==语法:==
select 查询列表 from 表名 where 筛选条件 order by 排序列表 asc\desc(升序\降序)如果不写默认升序
按表达式排序,可以用 order by 别名,length(XXX)返回长度。
多重排序条件:select * from employee oder by salary desc,age asc,先按salary降序,再按age升序,又先后顺序
4. 常见函数
- ==语法==:select 函数名(实参列表) [from 表]
4.1 单行函数
/*字符函数*/
1.length(param)获取参数值的字节个数;
2.concat()拼接字符串;
3.upper\lower(),变大写\小写;
4.substring\substr(str1,int strat,int b)截取字符,从start开始,长度为b;如果不加b就是截取至末尾。mysql中索引从1开始
5.instr(str1,str2)返回子串str2第一次出现在str1的索引,如果找不到返回0
6.trim(str1,str2)去掉str2前后的str1字符串。如果不加str1,就是去掉空格。
7.lpad(str1,int length , str2)用指定字符str2实现左边填充str1,填充后总长度为length
8.rpad(str1,int length , str2)用指定字符str2实现右边填充str1,填充后总长度为length
9.replace(str,str1,str2),用str2代替str中的str1
/*数学函数*/
1.round()四舍五入,round(x,n)四舍五入保留小数点后n位
2.ceil()向上取整
3.floor()向下取整
4.truncate(x,y),截断,小数点后保留几位(不进位,直接截断)
5.mod(x,y),x%y
/*日期函数*/
1.now()返回当前系统日期+时间
2.curdate()返回当前系统日期,不包含时间
3.curtime()返回当前时间,不包含日期
4.str_to_date(str,format)将字符转换为日期格式 str_to_date('4-3 1997','%m-%d %Y');
5.date_format()将日期转换为字符
6.datediff(time1,time2)返回time1-time2的天数
/*其它函数*/
1.version()
2.databases()
3.user()
/*流程控制函数*/
1.if(条件表达式,结果1,结果2),类似于三元运算符 expression?resutl1:result2
2.case的使用一 (相当于switch...case)如果都不满足,返回null
①
case 要判断的字段或表达式或变量
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
......
else 要显示的值n或语句n;
end;
case的使用二,如果都不满足,返回null
②
case
when 条件1 then 要显示的值1或语句1;
when 条件2 then 要显示的值2或语句2;
......
else 要显示的值n或语句n;
end;
4.2 分组函数
- 用作统计使用
- max\min\count可以处理任何类型,sum\avg一般处理数值型==,max,min,count不能出现在where后面==
5. 分组查询
==语法==
select 分组函数,列(要求出现在group by的后面) from 表 [where 筛选条件] group by 分组的列表 [having 分组条件] [order by 字句] select max(salary),job_id from employees group by job_id;/*查询每个工种的最高工资*/ select count(*),department_id from employees group by department_id having count(*)>2;查询员工个数大于2的部门。用having追加筛选。
==注意事项:==
- 分组前筛选:原始表,放在group by前面
- 分组后筛选:分组后的结果集,放在group by后面
- 分组函数做条件,肯定是放在group by后面,having...
- 能用分组前筛选的尽量用分组前筛选
- group by子句支持单个字段分组(多个字段之间用逗号隔开,没有顺序要求)
6. 连接查询
6.1 内连接
select 查询列表 from 表1 【别名】 inner join 表2 【别名】on 连接条件(等值连接、非等值连接、自连接)【where 筛选条件】【group by 分组】【having 条件】【order by 排序列表】
6.2 外连接
==特点==:外连接的查询结果为主表中的所有记录,如果从表中有和它匹配的,则显示匹配的值,反之显示null,外连接查询结果=内连接结果+主表中有而从表中没有的记录
左外:left join左边是主表右外:right join右边是主表
7. 子查询
- 含义:出现在其他语句中的select语句,称为子查询或内查询。出现在外部的select查询语句,称为外查询或主查询。
- ==select 查询出来的是一张表,所以即使只有一个数据,如果要判断数据是否在其中要用in而不是= 或!===
/*找到表中money不是最大值的其余项*/
SELECT * FROM account WHERE money NOT IN (SELECT MIN(money) FROM account)
8. 分页查询
应用场景:当要显示的数据,一页没法全部显示时,需要分页提交sql请求,使多页显示。(如1-10,11-20....)
==语法==
select 查询列表 from 表【join type】 join 表2 on 连接条件 【where 筛选条件】【group by 分组字段】【having 分组后筛选】【order by 排序字段】 limit offset,size; offset:要显示的条目的起始索引(索引从0开始) size:要显示的条目个数(不是结束索引,而是个数) limit语句放在最后
9. 联合查询
==语法==:
查询语句1 union 查询语句2 union.... 查询语句n
注意事项
- ==union会自动去重==。如果不想去重,使用关键字==union all==
- 每个子句使用了==oder by,union==联合多个子句,要求==多个子句必须加上括号==,但这样仍然无法==得到每个子句排序后再叠加到一起的效果==,因此还必须==指定每个子句一个limit==。才能达到效果。参考
(SELECT * FROM sc sc1 WHERE sc1.`C` = '01' ORDER BY sc1.`score` DESC LIMIT 10 ) UNION ALL (SELECT * FROM sc sc2 WHERE sc2.`C` = '02' ORDER BY sc2.`score` DESC LIMIT 10 ) UNION ALL (SELECT * FROM sc sc3 WHERE sc3.`C` = '03' ORDER BY sc3.`score` DESC LIMIT 10 )