数据库语句
查看MySQL中有哪些数据库: show databases;
怎么选择使用某个数据库呢?: use ………;
怎样创建数据库: create database ……;
怎样查看数据库中有哪些表:要先 use… ; 然后 show tables;
查看当前使用的是哪个数据库?: select database();
约束:约束也有很多,其中一个叫做唯一性约束,
这种约束添加之后,该字段中的数据不能重复。
DQL:数据查询语言(凡是带select都是查询语言)
DML:
数据操作语言(凡是对表当中的数据进行增删改的都是DML)
Insert(增) delete (删)update(改)
DDL:
数据定义语言
凡是带有create、drop、alter的都是DDL。
DDL主要操作的是表的结构。不是表中的数据。
create:新建,等同于增
drop:删除
alter:修改
这个增删改和DML不同,这个主要是对表结构进行操作。
TCL:
不是王牌电视。
是事务控制语言
包括:
事务提交:commit;
事务回滚:rollback;
导入提前准备好的数据:MySQL> source D:\course\03-MySQL\document\bjpowernode.sql(这个直接拖就行)
查看表中的数据: select * from dept.. salgrade...emp;
不看表中数据,只看表中的结构:desc emp;
查询一个字段:select 字段 from 表名;
查询多个字段:中间用逗号隔开 例如: select ename,job from emp;
怎样给字段起别名:select dname as dn from emp; 注意!! 只是显示不同,并不会更改
在所有数据库中,所有的字符串用单引号括起来!!!;
字段可以使用数学表达式: select ename,sal*12 from emp;
条件查询:select 字段1,字段2,字段3 from 表名 where 条件;
条件有: =(等于) <>或!=(不等于) >(大于) <(小于) <=(小于等于) >=(大于等于)
between … and …. 两个值之间, 等同于 >= and <=
例如:select ename,sal from emp where sal between 2100 and 3500;
使用between and的时候,必须遵循左小右大。
between and是闭区间,包括两端的值。
Is not null(不能为空)
例如:select ename,sal,comm from emp where comm is not null;
在数据库中 null 不能用 = 来运算; 应该为 is null 或者 is not null
And (并且)
例如: select ename,sal,job from emp where sal>1000 and job=’manager’; 注意!! 字符串用单引号括起来!!!
Or ( 或者)
Select ename,job,sal from emp where sal=3600 or sal=4500;
Or和and同时出现的话,and的优先级比较高,如果不确定 就加个小括号
In 包含 相当于多个or
例如: select empno,job,ename from emp where job in(‘MANAGER’,‘SALESMAN’);
/c 表示一条指令的结束;
Like 称为模糊查询:支持% 和 下划线 匹配
找出名字中含 O的:select ename from emp where ename like ‘%O%’; 注意 要有单引号!!!
找出名字中最后一个字母为T的: select ename from emp where ename like ‘%T’;
找出第二个字母为A的:select ename from emp where ename like ‘%_A%;
排序:select ename,sal from emp order by sal;(默认为升序)
select ename,sal from emp order by sal desc;(加上desc为 降序)
可以两个字段排序吗?或者说按照多个字段排序?
查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话,
再按照名字升序排列。
select
ename,sal
from
emp
order by
sal asc, ename asc; // sal在前,起主导,只有sal相等的时候,才会考虑启用ename排序。
综合一点的案例:
找出工资在1250到3000之间的员工信息,要求按照薪资降序排列。
答:select ename,sal from emp where sal between 1250 and 3000 order by sal desc;
以上语句的执行顺序必须掌握:
第一步:from
第二步:where
第三步:select
第四步:order by(排序总是在最后执行!)
Lower(字段) 转换小写…
Upper(字段) 转换大写…
concat函数进行字符串的拼接
length 取长度 例如:select length(ename) from emp;
trim 去空格
str_to_date 将字符串转换成日期
date_format 格式化日期
format 设置千分位
case..when..then..when..then..else..end
当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是SALESMAN的时候,工资上调50%,其它正常。
(注意:不修改数据库,只是将查询结果显示为工资上调)
select
ename,
job,
sal as oldsal,
(case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal
from
emp;
select round(1236.567, 1) as result from emp; //保留1个小数
select round(1236.567, 2) as result from emp; //保留2个小数
select round(1236.567, -1) as result from emp; // 保留到十位。
rand() 生成随机数
MySQL> select round(rand()*100,0) from emp; // 100以内的随机数
上面的100 表示范围;
在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL。
所以利用 ifnull
例如:select ename,(sal+ifnull(comm,0))*12 as yearsal from emp order by yearsal;
分组函数:
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
、什么是分组查询?
在实际的应用中,可能有这样的需求,需要先进行分组,然后对每一组的数据进行操作。
这个时候我们需要使用分组查询,怎么进行分组查询呢?
select
...
from
...
group by
...
计算每个部门的工资和?
计算每个工作岗位的平均薪资?
找出每个工作岗位的最高薪资?
....
19.2、将之前的关键字全部组合在一起,来看一下他们的执行顺序?
select
...
from
...
where
...
group by
...
order by
...
以上关键字的顺序不能颠倒,需要记忆。
执行顺序是什么?
1. from
2. where
3. group by
4. select
5. order by
为什么分组函数不能直接使用在where后面?
select ename,sal from emp where sal > min(sal);//报错。
因为分组函数在使用的时候必须先分组之后才能使用。
where执行的时候,还没有分组。所以where后面不能出现分组函数。
select sum(sal) from emp;
这个没有分组,为啥sum()函数可以用呢?
因为select在group by之后执行。
找出每个工作岗位的工资和?实现思路:按照工作岗位分组,然后对工资求和。
select
job,sum(sal)
from
emp
group by
job;
重点结论:
在一条select语句当中,如果有group by语句的话,
select后面只能跟:参加分组的字段,以及分组函数。
其它的一律不能跟。
使用having可以对分完组之后的数据进一步过滤。
having必须和group by联合使用。
找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除MANAGER岗位之外,mysql> select ename,avg(sal) as avgsal from emp where job<>'MANAGER' group by job having avgsal>1500 order by avgsal desc;
、把查询结果去除重复记录【distinct】
注意:原表数据不会被修改,只是查询结果去重。
去重需要使用一个关键字:distinct
distinct只能出现在所有字段的最前方
distinct出现在job,deptno两个字段之前,表示两个字段联合起来去重。
MySQL> select distinct job,deptno from emp;
统计一下工作岗位的数量?
select count(distinct job) from emp;
根据表连接的方式分类:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接(左连接)
右外连接(右连接)
全连接(不讲)
当两张表进行连接查询时,没有任何条件的限制会发生什么现象?答:笛卡尔积现象
怎么避免笛卡尔积现象?连接时加条件,满足这个条件的记录被筛选出来
SQL99语法:
select
...
from
a
join
b
on
a和b的连接条件
where
筛选条件
内连接中的:自连接,技巧:一张表看做两张表
right代表什么:表示将join关键字右边的这张表看成主表,主要是为了将
这张表的数据全部查询出来,捎带着关联查询左边的表。
在外连接当中,两张表连接,产生了主次关系。
、三张表,四张表怎么连接?
语法:
select
...
from
a
join
b
on
a和b的连接条件
join
c
on
a和c的连接条件
right join
d
on
a和d的连接条件
一条SQL中内连接和外连接可以混合。都可以出现!
什么是子查询?
select语句中嵌套select语句,被嵌套的select语句称为子查询。
子查询都可以出现在哪里呢?
select
..(select).
from
..(select).
where
..(select).
union合并查询结果集
union在进行结果集合并的时候,要求两个结果集的列数相同。
5、limit(非常重要)
5.1、limit作用:将查询结果集的一部分取出来。通常使用在分页查询当中。
百度默认:一页显示10条记录。
分页的作用是为了提高用户的体验,因为一次全部都查出来,用户体验差。
可以一页一页翻页看。
5.2、limit怎么用呢?
完整用法:limit startIndex, length
startIndex是起始下标,length是长度。
起始下标从0开始。
缺省用法:limit 5; 这是取前5.
按照薪资降序,取出排名在前5名的员工?
select
ename,sal
from
emp
order by
sal desc
limit 5; //取前5
注意:MySQL当中limit在order by之后执行!!!!!!
取出工资排名在[3-5]名的员工?
select
ename,sal
from
emp
order by
sal desc
limit
2, 3;
执行顺序?
1.from
2.where
3.group by
4.having
5.select
6.order by
7.limit..
建表的语法格式:create table 表名(字段名1 数据类型, 字段名2 数据类型, 字段名3 数据类型);
数据类型: Varchar(动态分配空间,缺点是速度慢)
Char (静态分配空间,速度快,空间固定,缺点是使用不当造成空间浪费)
Varchar 和Char的用法:一般性别的空间是固定的 所以用Char,但是大家的名字长度各有不同,所以不能用固定的Char,用动态分配的Varchar;
Int
Bigint
Float
Double
Data(短日期类型)
Datatime(长日期类型)
clob
字符大对象
最多可以存储4G的字符串。
比如:存储一篇文章,存储一个说明。
blob
二进制大对象
Binary Large OBject
专门用来存储图片、声音、视频等流媒体数据。
往BLOB类型的字段上插入数据的时候,例如插入一个图片、视频等,
你需要使用IO流才行。
t_movie 电影表(专门存储电影信息的)
删除表:drop table t_student; // 当这张表不存在的时候会报错!
插入数据insert (DML)语法格式:
insert into 表名(字段名1,字段名2,字段名3...) values(值1,值2,值3);
注意:字段名和值要一一对应。什么是一一对应?
数量要对应。数据类型要对应。
insert into t_student(no,name,sex,age,email) values(1,'zhangsan','m',20,'zhangsan@123.com');
insert into t_student(email,name,sex,age,no) values('lisi@123.com','lisi','f',20,2);
insert into t_student(no) values(3);
alter database 你的数据库名字 character set utf8;