One_MySQL mysql的基础知识
一、MySQL简述
1.1、sql,DB,DBMS分别是什么,有什么关系?
DB:BataBase (数据库,数据库实际上在硬盘上以文件的形式存在)
DBMS: BateBase Management System(数据库管理系统,常见的有:MySQL,Oracle,DB2,Sybase,SqlServer)
sql: 结构化查询语言,是一门标准通用的语言。sql语句在执行的时候,实际上内部也会先进行编译,然后在执行sql(sql语句的编译有DBMS完成)
关系:DBMS负责执行SQL语句,来操作DB当中的数据。
1.2、什么是表?
表:table是数据库的基本组成单位。包括:行和列
行:被称为数据(一行一条数据 data)
列:被称为字段(column)
1.3 、SQL的分类
DQL(数据查询语言):select语句
DML(数据操作语言):delete insert update 对表数据进行操作
DDL(数据定义语言): create drop alter 对表结构进行操作
TCL(事物控制语言): commit 提交事物,rollback回滚事务。
DCL(数据控制语言):grant授权,revoke 撤销权限等
二、创建数据库
2.1 步骤
第一步:打开cdm 输入 mysql -uroot -p 回车 输入密码,进入mysql
第二步:show databases;查看有哪些数据库
第三步:创建自己的数据库 create database 数据库名
第四步:use 数据库名;使用数据库
第五步:show tables;查看有哪些表
第六步:使用 source + xxx .sql文件所在路径,把文件导入数据库
2.2 查看表的结构
desc 表名;
三、常用命令
3.1
select database();查看当前使用的数据库
\c :终止当前语句
select version (); 查看当前数据库版本
\q,exit:退出mysql
3.2查看创建表的语句
show create table 表名;
四、简单的查询语句(DQL)
语法格式:
select 字段名1 as 重命名 ,字段名2,....from 表名
sql语句不区分大小写,以“;”结尾,“as + 名字” 表示重命名(名字如果是中文要用单引号引起来)
注意:
-
as 可以省略;
-
mysql可以用双引号,但是只能在mysql中用,不通用,最好使用单引号;
-
select * from dept; *号尽量不使用,效率低
五、条件查询
语法格式:
select 字段名,字段名...
from 表名
where 条件;
执行顺序:from-->where-->select
eg1:找出工资不等于三千的员工?
select ename,sal from emp where sal<>3000; (或者 !=)
eg2:找出工资在1100到3000的员工?
mysql> select ename,sal from emp where sal between 1100 and 3000;
或者mysql> select ename,sal from emp where sal<=3000 and sal>=1100;
注意:
between...and....是闭区间,但是必须左小右大【1100,3000】不可以【3000,1100】。
and与or and的优先级较高
模糊查询like:
两个特殊符号:%,_
%:代表任意符号;_:代表一个符号
eg1:找出第二个字符是A的
mysql> select ename from emp where ename like '_a%';
eg2:找出名字里带有下划线的
select ename from emp where ename like '%\_%'; 转义
六、排序
asc:升序,desc:降序
6.1 按照工资进行排序
mysql> select ename, sal from emp order by sal ;默认升序排列
6.2 按照工资的降序排列,工资相同按名字升序排列
mysql> select ename, sal from emp order by sal desc,ename asc;
注意:多字段排序,从前往后进行,如上面的先sal,再ename,用逗号隔开
6.3 mysql> select ename, sal from emp order by 2 desc;
按照第二列(sal)降序排列 ,在写程序时不可以这样写,程序不健壮。
6.4 找出工作岗位是salesmen的员工,按照工资降序排列
mysql> select ename,sal,job from emp where job='salesman'order by sal desc;
注意:执行顺序:from-->where-->select-->order by
七、分组函数
一共五个,另一个名字:多行处理函数,
特点:一次处理多行记录,最终输出一行
count 计数
sum 求和
avg 取平均
max 最大值
min 最小值
分组函数自动忽略null
1、 select avg(sal) from emp; 员工工资平均值
2、select max(sal) from emp; 最高工资
3、select min(sal) from emp; 最低工资
4、 select count(empno) from emp; 员工人数
5、 select sum(sal) from emp; 工资总数
7.1分组函数不能使用在where中
原因:group by是在where后面才执行,分组函数必须在分完组后才可以执行也就是在group by之后执行。也就是说分组函数不能在where 里
select ename ,sal from emp where sal>avg(sal);//Invalid use of group function 分组函数无效使用
正确写法: select ename ,sal from emp where sal>(select avg(sal) from emp); 利用嵌套子查询
7.2 count(*)与count(某个字段)
count(*):统计总记录条数。
count(某个字段):这个字段不为null的数据条数。
7.3分组函数也可以组合使用
select count(*),sum(ename),avg(sal),max(sal),min(sal) from emp;
7.4对执行顺序的概述
select 5
..
from 1
..
where 2
..
group by 3
...
having 4
...
order by 6
...
八、单行处理函数
输入一行,输出一行
重点:所有数据库都是这样规定的,只要有null参与的运算结果一定是null
select ename ,(sal+comm)*12 from emp;计算年薪,但是comm可能为null,与sal运算的时候会出现null。
怎么办?
select ename ,(sal+ifnull(comm,0))*12 from emp;
8.1使用空处理函数 ifnull(可能为null的数据,被当作什么处理)
eg1: select ename,if(comm,0) from emp; 把津贴comm为null的都变为0
注:select sum(comm) from emp; comm有的为null,但是不需要ifnull()函数处理,因为分组函数自动忽略null。
groud by:按照某个字段或某些字段进行分组
having:是对分组之后的数据进行再次过滤
分组函数一般都和groud by连用,分组函数都是在group by 后面执行完后执行
eg:查找每种工作岗位的最高工资?
select job, max(sal) from emp group by job;
select ename,job,max(sal) from emp group by job;//这条语句在mysql中不会报错,但是执行结果无意义,在Oracle中直接报错。
结论:在有group by的语句里,只能查询被分组字段,与分组函数,其他一律不可出现。
9.1多字段联合分组
eg:找出不同部门不同工作岗位的最高薪资?
select deptno,job,max(sal) from emp group by deptno,job;
9.2 having与where
eg:查找每个部门的最高工资,显示工资大于2900的数据
第一种方式:select max(sal),deptno from emp group by job having max(sal)>2900;
这种方式效率较低,建议采用第二种方式
第二种方式: select max(sal),deptno from emp where sal>2900 group by deptno;
但是当下面这种情况,就必须使用having
eg:查找每个部门的平均工资,显示工资大于2900的数据
select avg(sal),deptno from emp group by deptno having avg(sal)>2900;
浙公网安备 33010602011771号