MySQL
1。创建数据库:create database +数据库名;
2。删除数据库:drop database + 数据库名;
3。指定当前用的数据库:use + 数据库名;
4。终止一条SQL语句,重新输入:\c
5。导入数据到数据库:source 文件位置\文件.sql(必须在先使用数据库的时候,才能导入)
6。查询数据:显示表格:show tables;(显示所有表格)
查询表格结构:desc 表格名;(查询表格组成)
7。查询当前数据库管理系统中有多少个数据库:show databases;(数据库管理系统会自带几个数据库)
8。在进入DBMS后,查看MySQL版本:select version();
在没进入DBMS时,查看MySQL版本:MySQL --version
9。查询当前正在使用的是哪个数据库:select database();
10。退出MySQL:exit 或 快捷键:ctrl+ c 或 quit
11。在当前数据库中查看别的数据库中的表:show tables from +别的数据库名称;
12。查看当初创建这张表的时候使用的是那些语句:show create table +表的名字;
注:SQL语句不区分大小写,SQL语句后需要加分号;
查询语句
- select +需要查询的数据 + from + 需要查询的数据所在的表;
(如:select name from onetable; 为从onetable中查询name的相关信息)
多字段查询:
select +需要查询的数据1,需要查询的数据2 + from + 需要查询的数据所在的表;
(如:select name,age from onetable; 为从onetable中查询name和age的相关信息)
查询表中的所有数据:select * from onetable;(不建议使用*,最好将所有要查询的数据全部写出来)
- 可以在SQL语句中直接进行计算
select name,sal*12 from onetable; (name为员工名字,sal为员工的月薪,这个语句为从onetable中查询员工的年薪)
注:该语句只是将数据库中的数据查询出来,并不会修改数据库中的数据;
select name,sal12 as yearsal from onetable;
as yearsal作用是将显示的输出的表中sal12替换为yearsal,更清晰的表达出表的数据(as关键字可以省略不写,空格就行)(yearsal可以是中文,但是要用单引号将中文字段括起来,但不建议用中文,别给自己找麻烦)
注:同样,该语句只是将数据库中的数据查询出来,并不会修改数据库中的数据;
条件查询
-
select name,sal from onetable where sal = 5000;
在onetable中查询工资等于5000的员工,where关键字后写条件;
上面的条件也可以写成:sal = ‘5000’;同样正确,他会自动转型 -
select name,sal from onetable where sal >=3000 and sal <= 5000;
select name,sal from onetable where sal between 3000 and 5000;(between中前面是小值3000,后面是大值5000)
两条语句都表示找出sal大于等于3000 并且小于与等于5000的数据;
select name from onetable where name between ‘A’ and ‘F’;
(表示查询表中的name中首字母在A到F之间的数据,包括A,但不包括F)
-
is null用法
select comm from onetable where comm is null;
comm 为补助,查询表格中补助为空的数据;不能用 comm=null; -
in
select name,sal from onetable where sal in(3000,5000);
找出工资为3000 和 5000的员工数据
select name,sal from onetable where name in(‘tony’,‘mency’);
找出名字为tony和mency的员工;
注:查找字符时加的单引号,not in 即查找工资不为3000或5000的员工数据,名字不为tony或mency的员工数据
注:not in 后面如果是表格,那么表格中的要查的数据不能为空,如果为空,需要先去除空值;但是in不用,in可以自动去除空值;
in后面也可以接一个表格; -
like(模糊查询)
select name from onetable where name like ‘%o%’;
查询名字中带有o的员工;
注:“%”代表0-n个任意字符
select name from onetable where name like ‘o%’;
查询名字中第一个字母是o的员工;
select name from onetable where name like ‘%o’;
查询名字中最后一个字母是o的员工;
select name from onetable where name like ‘_o%’;
查询名字中第二个字母是o的员工;
注:一个下划线代表一个任意字符
排序
- order by 字段 asc\desc(注:asc:升序,desc:降序)
select name,sal from onetable order by sal asc;
select name,sal from onetable order by 2 ;(不建议使用这种方法)
两种方法都是将薪水按照升序排列
select name,sal from onetable order by sal asc,name asc;
先按工资排序,工资相同的情况下,按名字的排序;
数据处理
select lower(ename) from emp; (lower:小写)
将ename字段的数据从emp中取出,并且小写
select upper(ename) from emp; (upper:大写)
将ename字段的数据从emp中取出,并且大写
select substr(ename,a,b) from emp;
从emp中取出ename字段中每个数据(从第a个字符开始截取,截取长度为b)
截取第二个字母是A的数据
select length(ename) from emp;
获取ename字段中的每个数据(名字)的长度
去除前后空白,即在不考虑空格的情况下进行搜索
select round(123.456,a); (round:四舍五入)
a为保留小数点的位数
select round(123.456,2);结果为:123.46
select round(rand()*100);
生成0到100 的随机数
select ename,ifnull(comm,’a‘) as comm from emp;
如果comm字段代表的数据为空,则显示a,并将字段的名字重命名为comm
注:在数据库里边,只要有空值参与的运算结果都为空;
str_to_date
查询1981-02-20入职的员工(将字符串转换成date类型)
select * from emp where HIREDATE=str_to_date(‘1981-02-20’,’%Y-%m-%d’);select * from emp where HIREDATE=str_to_date(‘02-20-1981’,’%m-%d-%Y’);
注意:Y大写
date_format
查询1981-02-20以后入职的员工,将入职日期格式化成yyyy-mm-dd hh:mm:ss
select empno, ename, date_format(hiredate, ‘%Y-%m-%d %H:%i:%s’) as hiredate from emp;
now() 获得当前时间
select date_format(now(),’%Y-%m-%d %H %i %s’);
分组函数(自动忽略空值)
count/sum/avg/min/max
count :记录一共有多少个数据
avg:数据的平均值
例:select max(sal) from emp; 求出薪水中的最大值
select count(sal) from emp; 求出薪水的个数
count(字段):这个字段中不为空的元素总数
select count(sal) from emp where comm is
;
count(*):所有字段中满足后面条件的元素总条数
注:分组函数不能直接使用在where语句中
distinct(去重)
select distinct ename from emp; 去除字段中重复的内容
select distinct deptno,job from emp; 去除两个字段中同样重复 - 的内容;即 部门和工作岗位 都相同的情况下,去重;
注:distinct只能出现在所有字段的前方
分组(group by,having)
group by:对字段进行分组;
select deptno,avg(sal) from emp group by deptno; 先对deptno进行分组,然后在每组中求sal的平均值;
注:查询字段中不能有分组之外的字段,如:
select ename,deptno,avg(sal) from emp group by deptno;是不被允许的;
select deptno,avg(sal) from emp where deptno<>‘10’ group by deptno; 先设定条件,再分组;
having和where一样,都是对数据进行过滤,后面都是添加条件
但:where是在group by 之前对数据进行过滤;
having是在group by 之后对数据进行过滤;
select job,avg(sal) from emp group by job having avg(sal) > 1500;
注:在where 可以过滤的情况下,先使用where 进行过滤;之后再考虑having ;
sql语句的关键词顺序,不能改变
内链接和外连接
即在emp表中查询ename,在dept表中查询dname,过滤条件是两张表中的deptno相同(e.deptno = d.deptno)
sql99比sql92好的地方是如果不满意结果,可以在后面直接加where + 条件,而sql92则需要在后面加and,再加过滤条件;相比之下sql99结构更清晰;
inner可以省略不写
内外连接区别
外连接
注:任何一个右外连接都可以写成左外连接,反之同理;
注:
多张表进行连接:
注:a先和b进行连接,满足后面的条件;然后,a和c进行连接,同样满足后面的条件;
子查询
在where后面出现出现子查询:
找出公司薪水比平均薪水高的员工:
select ename,avg(sal) from emp; — 2066.071429
select ename,sal from emp where sal > 2066.071429;
两式合并得下面:
select ename,sal from emp where sal > (select avg(sal) from emp);
在from后面出现子查询
在select后出现子查询
union:(将两个结果合并在一起)
注:两个语句的字段的数量必须相同,字段名可以不同,类型也可以不同;
limit:(mysql数据库中独有的)
limit出现在sql语句中的最后位置:
分页查看:
pageNo:页数,即第几页
pageSize:每页的信息条数,即每页有多少条信息
t:某个表
t.x:表中的某个字段
注:因为一张表中的数据太多的话,在一页显示的话不方便,所以可以分页;
补充:case…when…then…when…then…else…end
select
ename,sal,newsal as (case sal when ‘1600’ then sal1.5 when ‘2500’ then sal1.1 else sal end)
from
emp;
这段语句表示查询薪水和新薪水,
新薪水是:当(case)薪水(sal)为1600时,薪水变为原来的1.5倍成新薪水,当薪水为2500时,薪水变为原来的1.1倍成新薪水,其余的薪水不变,依然为原来的数;
注:练习题:https://www.bilibili.com/video/av14716238/?p=58
https://www.bilibili.com/video/av14716238/?p=59
补充:to_days(hiredate),是一个将年转换成天数的函数
如:select to_days(now());结果为737401