数据库学习笔记-1
一、SQL
SQL: 结构化查询语言,是一门标准通用的语言。标准的sql适合于所有的数据库产品。SQL语句在执行的时候,实际上内部也会先进行编译,然后再执行sql。(DBMS负责执行sql语句,通过执行sql语句来操作DB当中的数据。)
二、表
一个表包括行和列,行被称为数据/记录(data),列:被称为字段(column)
每一个字段应该包括字段名、数据类型、相关的约束。
三、SQL语句
SQL语句分类:
DQL(数据查询语言): 查询语句,凡是select语句都是DQL
DML(数据操作语言):insert delete update,对表当中的数据进行增删改
DDL(数据定义语言):create drop alter,对表结构的增删改
TCL(事务控制语言):commit提交事务,rollback回滚事务。(TCL中的T是Transaction 事务)
DCL(数据控制语言): grant授权、revoke撤销权限等
1.DQL
(1)简单查询
select 字段名1,字段名2,字段名3,.... from 表名;
一条sql语句以分号结尾
sql语句不区分大小写
字段可以参与数学运算,如
select ename, SAL*12 from emp;
重命名查询结果字段(as关键字可省略):
select ename, sal * 12 as yearsal from emp;
注意:中文名称要加引号(最好使用单引号,双引号仅MySQL支持):
select ename as '员工姓名',sal * 12 as '年薪' from emp;
*可用来查询全体,但效率太低,实际开发较少使用
(2)条件查询
select 字段,字段... from 表名 where 条件;
select ename from emp where sal = 5000;
select ename,sal from emp where sal >= 2000;
字段如果是字符串(varchar)那么条件中也要用单引号
找出工资在1100和3000之间的员工:
select ename,sal from emp where sal >= 1100 and sal <= 3000;
select ename,sal from emp where sal between 1100 and 3000;
注意between…and…是闭区间
查找值为null需要使用is null
和is not null
,不能使用= null
select ename,sal from emp where sal is null or sal = 0;
注意and
优先级高于or
,再使用复合条件时注意使用括号
in
和or
类似,以下二者等价:
select ename,job from emp where job = 'SALESMAN' or job = 'MANAGER';
select ename,job from emp where job in('SALESMAN', 'MANAGER');
not in
同理
like
模糊查询
%代表任意多个字符,_代表任意1个字符:
/*找出名字当中含有O的*/
select ename from emp where ename like '%O%';
/*找出名字中第二个字母是A的*/
select ename from emp where ename like '_A%';
/*找出名字中有下划线的(要使用\转义)*/
select name from t_user where name like '%\_%';
(3)排序
select ename,sal from emp order by sal;
默认是升序,指定升降使用asc(升序)
及desc(降序)
select ename,sal from emp order by sal asc;
select ename,sal from emp order by sal desc;
/*按照工资的降序排列,当工资相同的时候再按照名字的升序排列。*/
select ename,sal from emp order by sal desc , ename asc;
select 字段 from 表名 where 条件 order by ....
(4)单行处理函数
输入一行,输出一行
只要表达式中有NULL,最后结果就为NULL
解决方法:ifnull(可能为NULL的数据,被当做什么处理)
select ename,ifnull(comm,0) as comm from emp;
(5)分组函数
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
分组函数自动忽略NULL
分组函数不可直接使用在where子句当中,例如以下sql语句就会报错:
select ename,sal from emp where sal > avg(sal);
(6)分组查询
group by
:按照某个字段或者某些字段进行分组
having
:对分组之后的数据进行再次过滤
/*找出每个工作岗位的最高薪资*/
select max(sal),job from emp group by job;
分组函数一般都会和group by联合使用(分组函数必须分完组才能用),在group by语句执行结束之后执行。当一条sql语句没有group by的话,整张表的数据会自成一组(缺省group by)。group by是在where执行之后才会执行,所以where子句中的分组函数不能执行导致报错
解决方案:
select ename,sal from emp where sal > avg(sal);
/*修改为(子查询):*/
select ename,sal from emp where sal > (select avg(sal) from emp);
当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段,其它字段查询结果与分组查询并不匹配,无意义
多字段分组:
select deptno,job,max(sal) from emp group by deptno,job;
使用having或where过滤:
select max(sal),deptno from emp group by deptno having max(sal) > 2900;
select deptno,max(sal) from emp where sal > 2900 group by deptno;
显然此处使用where后再分组效率高,在where无法解决时(如where中的条件使用分组函数)再考虑having
(7)执行顺序
from
--> where
--> group by
--> having
--> select
--> order by
四、MySQL常用指令
1.show databases;
2.create database 数据库名;
创建数据库
3.use 数据库名;
使用对应数据库
4.show tables;
查看当前使用数据库中的表
5.mysql> source sql脚本地址
初始化数据
6.drop database 数据库名;
删除数据库
7.desc 表名;
展示表结构
8.show create table 表名;
查看创建表的语句