目录
为什么要学习数据库
数据库的好处
数据库的概念
MySQL
优点
MySQL服务的启动和停止
MySQL服务的登录和退出
MySQL的常见命令
MySQL的语法规范
基本功能——查询
基础查询
查询表中的单个字段
查询表中的多个字段
查询表中的所有字段
查询常量值
查询表达式
查询函数
起别名
去重
+的作用
条件查询
按条件表达式筛选
按逻辑表达式筛选
模糊查询
排序查询
添加筛选条件
按表达式排序
按别名排序
按函数排序
按多个字段排序
分组查询
简单分组查询
添加分组前筛选
添加分组后筛选
按表达式或函数分组
按多个字段分组
连接查询
sql92标准
sql99标准
子查询
放在where或having后
放在select后
放在from后
放在exists后
分页查询
联合查询
总结:
·实现数据持久化
·使用完整的管理系统统一管理,易于查询
DB:数据库(database):存储数据的“仓库”。它保存了一系列有组织的数据
DBMS:数据库管理系统(Database Management System)。数据库是通过DBMS创建和操作的容器,常见的数据库管理系统:MySQL、Oracle、DB2、SqlServer。
SQL:结构化查询语言(Structure Query Language):专门用来与数据库通信的语言。
·成本低:开放源代码,一般可以免费试用
·性能高:执行很快
·简单:很容易安装和使用
·方式一
计算机——右击管理——服务
·方式二
通过管理员身份运行
net start 服务名(启动服务)
net stop 服务名(停止服务)
·方式一
通过mysql自带的客户端
只限于root用户
·方式二
通过windows自带的客户端登录
mysql (-h 主机名 -P 端口号) -u用户名 -p密码 (括号里面如果是localhost可不写)
·退出
exit或Ctrl+C
1.查看当前所有的数据库
show databases;
2.打开指定的库
use 库名
3.查看当前库的所有表
show tables;
4.查看其他库的所有表
show tables from 库名
5.创建表
create tables 表名(
列名 列类型,
列名 列类型,
···
);
6.查看表结构
desc 表名;
7.查看服务器的版本
方式一
登录到mysql服务端
select version();
方式二
没有登录到mysql服务端
mysql --version
或
mysql --V
·不区分大小写,但建议关键字大写,表名、列名小写
·每条命令最好用分号结尾
·每条命令根据需要,可以进行缩进或换行
·注释
单行注释:#注释文字
单行注释:-- 注释文字
多行注释:/* 注释文字 */
如:
SELECT last_name FROM employees;
如:
SELECT last_name,salary,email FROM employees;
如:
SELECT * FROM employees;
如:
SELECT 100; SELECT 'john';
注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要
如:
SELECT 100%98;
如:
SELECT VERSION();
·好处
1、便于理解
2、如果要查询的字段有重名的情况,使用别名可以区分开来
·方式一:使用as
SELECT 100%98 AS 结果; SELECT last_name AS 姓,first_name 名 FROM employees;
·方式二:使用空格
SELECT last_name 姓,first_name 名 FROM employees;
·特殊情况
当起的别名有空格,#等特殊字符,要用双引号括起来
SELECT salary AS "out put" FROM employees;
如:
SELECT DISTINCT department_id FROM employees;
·java中的+
1、运算符,两个操作数都为数值型
2、连接符,只要有一个操作数为字符串
·mysql中的+
仅仅只有一个功能:运算符
SELECT 100+90;(两个操作数都为数值型,则做加法运算) SELECT '123'+90;(只要其中一方为字符型,试图将字符型数值转换为数值型,如果转换成功,则继续做加法运算) SELECT 'john'+90;(如果转换失败,则将字符型数值转换为0) SELECT null+10;只要其中一方为null,则结果肯定为null
条件运算符:> < = <> >= <=
如
查询部门编号不等于90号的 SELECT last_name, department_id FROM employees WHERE department_id<>90;
逻辑运算符:and or not
·如
查询部门编号不是在90到110之间,或者工资高于15000的员工信息 SELECT * FROM employees WHERE NOT(department_id>=90 AND department_id<=110) OR salary>15000;
like
·特点
一般和通配符搭配使用,可以判断字符型或数值型
通配符:
% 任意多个字符,包含0个字符
_ 任意单个字符
例子1
查询员工名中第三个字符为n,第五个字符为l的员工名和工资 SELECT last_name, salary FROM employees WHRER last_name LIKE '__n_l%';
例子2
查询员工名中第二个字符为_的员工名 SELECT last_name FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';(ESCAPE这里表示$充当转义符/)
between and
·特点:
1、使用between and 可以提高语句的简洁度
2、包含临界值
3、两个临界值不要调换顺序
例子:
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
in
·特点:
1、使用in提高语句简洁度
2、in列表的值类型必须一致或兼容
例子
查询员工的工种编号是IT_PROG、AD_VP、AD_PRES的一个员工名和工种编号 SELECT last_name, job_id FROM employees WHERE job_id IN('IT_PROT','AD_VP','AD_PRES');
is null
·功能
判断某字段或表达式是否为null,如果是,则返回1,否则返回0
·特点
=或<>不能用于判断null值
is null或is not null 可以判断null值
例子
查询没有奖金的员工名和奖金率 SELECT last_name, commission_pct FROM employees WHERE commission_pct IS NULL;
如:
查询部门编号>=90的员工信息,按入职时间的先后进行排序 SELECT * FROM employees WHERE department_id>=90 ORDER BY hiredate ASC;
如:
按年薪的高低显示员工的信息和年薪 SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC
如:
按年薪的高低显示员工的信息和年薪 SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees ORDER BY 年薪 DESC;
如:
按姓名的长度显示员工的姓名和工资 SELECT LENGTH(last_name) 字节长度,last_name,salary FROM employees ORDER BY LENGTH(last_name) DESC;
如:
查询员工信息,要求先按工资排序,再按员工编号降序 SELECT * FROM employees ORDER BY salary ASC,employee_id DESC;
·语法
select 分组函数,列(要求出现在group by的后面)
from 表
【where 筛选条件】
group by 分组的列表
【order by 子句】
·注意:
查询列表必须特殊,要求是分组函数和group by后出现的字段
·特点
2、group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数(用得较少)
3、也可以添加排序(排序放在整个分组查询的最后)
如:
查询每个工种的最高工资 select max(salary),job_id from employees group by job_id;
如:
查询邮箱中包含a字符的,每个部门的平均工资 select avg(salary),department_id from employees where email like '%a%' group by department_id;
如:
查询哪个部门的员工个数>2 select count(*),department_id from employees group by department_id having count(*)>2;
如:
按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些 select count(*) c,length(last_name) len_name from employees group by len_name having c>5;
如:
查询每个部门每个工种的员工的平均工资 select avg(salary), department_id,job_id from employees group by job_id,department_id;
等值连接
例子1
查询女神名和对应的男神名 select name,boyName from boys,beauty where beauty.boyfriend_id=boys.id;
·为表起别名
1、提高语句的简洁度
2、区分多个重名的字段
注意:如果为表起了别名,则查询的字段就不能使用原来的表名去限定
例子2
查询员工名、工种号、工种名 select e.last_name,e.job_id,j.job_title from employees as e,jobs as j where e.'job_id'=j.'job_id';
·可以加筛选
例子3
查询有奖金的员工名、部门名 select last_name,department_name,commission_pct from employees e,departments d where e.'department_id'=d.'department_id' and e.'commission_pct' is not null;
非等值连接
例子
查询员工的工资和工资级别 select salary,grade_level from employees e,job_grades g where salary between g.'lowest_sal' and g.'highest_sal' ;
自连接
例子
查询员工名和上级的名称 select e.employee_id,e.last_name,m.employee_id,m.last_name from employees e,employees m where e.'manager_id'=m.'employee_id';
内连接
·语法
select 查询列表
from 表1 别名
inner join 表2 别名
on 连接条件;
等值连接
·特点
1、可以添加排序、分组、筛选
2、innner可以省略
3、筛选条件放在where后面,连接条件放在on后面,提高分离性,便于阅读
4、inner join连接和sql92语法中的等值连接效果是一样的,都是查询多表的交集
例子1
查询哪个部门的员工个数>3的部门名和员工个数,并按个数排序 select count(*),department_name from employees e inner join departments d on e.'department_id'=d.'department_id' group by department_name having count(*)>3 order by count(*) desc;
例子2
查询员工名、部门名、工种名,并按部门名降序 select last_name,department_name,job_title from employees e inner join departments d on e.'department_id'=d.'department_id' inner join jobs j on e.'job_id'=j.'job_id' order by department_name desc;
非等值连接
例子
查询工资级别的个数>20的个数,并且按工资级别降序 select count(*),grade_level from employees e join job_grades g on e.'salary' between g.'lowest_sal' and g.'highest_sal' group by grade_level having count(*)>20 order by grade_level desc;
自连接
例子
查询姓名中包含字符k的员工的名字、上级的名字 select e.last_name,m.last_name from employees e join employees m on e.'manager_id'=m.'employee_id' where e.'last_name' like '%k%';
外连接
·应用场景
用于查询一个表中有,另一个表没有的记录
·特点
1、外连接的查询结果为主表中的所有记录
如果从表中有和它匹配的,则显示匹配的值
如果从表中没有和它匹配的,则显示null
外连接查询结果=内连接结果+主表中有而从表没有的记录
2、左外连接,left join左边的是主表
右外连接,right join右边的是主表
3、左外和右外交换两个表的顺序,可以实现同样的效果
4、全外连接=内连接的结果+表1中有但表2没有的+表2有但表1没有的
左外连接
例子
查询哪个部门没有员工 select d.*,e.employee_id from departments d left outer join employees e on d.'department_id' = e.'department_id' where e.'employee_id' is null;
右外连接
例子
查询哪个部门没有员工 select d.*,e.employee_id from employees e right outer join departments d on d.'department_id' = e.'department_id' where e.'employee_id' is null;
交叉连接
·就是笛卡尔乘积
例子
select b.*,bo.* from beauty b cross join boys bo;
·含义
出现在其他语句中的select语句,称为子查询或内查询
外部的查询语句,称为主查询或外查询
·分类
按子查询出现的位置:
select后面:
仅仅支持标量子查询
from后面:
支持表子查询
where或having后面
标量子查询(单行,重点)
列子查询(多行,重点)
行子查询
exists后面(相关子查询)
表子查询
按结果集的行列数不同:
标量子查询(结果集只有一行一列)
列子查询(结果集只有一列多行)
行子查询(结果集有一行多列)
表子查询(结果集一般为多行多列
1、标量子查询(单行子查询)
2、列子查询(多行子查询)
3、行子查询(多行多列)
·特点
1、子查询放在小括号内
2、子查询一般放在条件的右侧
3、标量子查询,一般搭配着单行操作符使用,如> < >= <= = <>
列子查询,一般搭配着多行操作符使用,如in、any/some、all
4、子查询的执行优先于主查询执行,主查询的条件用到了子查询的结果
例子(标量子查询)
查询最低工资大于50号部门最低工资的部门id和其最低工资 select min(salary),department_id from employees group by department_id having min(salary)>( select min(salary) from employees where department_id=50 );
例子(列子查询)
返回其他工种中比job_id为'IT_PROG'工种任一工资低的员工的员工号、姓名、job_id以及salary select last_name,employee_id,job_id,salary from employees where salary<any( select distinct salary from employees where job_id='IT_PROG' )and job_id<>'IT_PROG';
例子(行子查询)
查询员工编号最小并且工资最高的员工信息 select* from employees where employee_id=( select min(emoployee_id) from employees )and salary=( select max(salary) from employees )
·仅仅支持标量子查询
例子
查询每个部门的员工个数 select d.*,( select count(*) from employees e where e.department_id=d.department_id )个数 from departments d;
·将子查询结果充当一张表,要求必须起别名
例子
查询每个部门的平均工资 select ag_dep.*,g.'grade_level' from( select avg(salary) ag,department_id from employees group by department_id )ag_dep inner join job_grades g on ag_dep.ag between lowest_sal and highest_sal;
·语法
exists(完整的查询语句)
结果:
1或0
例子
查询有员工的部门名 select department_name from departments d where exists( select* from employees e where d.'department_id'=e.'department_id' );
·应用场景
当要显示的数据,一页显示不全,需要分页提交sql请求
·语法
select 查询里诶博爱
from 表
【join type join 表2
on 连接条件
where 筛选条件
group by 分组字段
having 分组后的筛选
order by 排序的字段】
limit 【offset】,size;
offset 表示要显示条目的起始索引(起始索引从0开始)
size 表示要显示的条目个数
·特点
1、limit语句放在查询语句的最后
2、公式:要显示的页数page,每页的条目数size
select 查询列表
from 表
limit(page-1)*size,size;
例子1
查询前五条员工信息 select * from employees limit 5;
例子2
查询第11条-第25条 select * from employees limit 10,15;
例子3
有奖金的员工信息,并且工资较高的前10名显示出来 select * from employees where commission_pct is not null order by salary desc limit 10;
·union 联合 合并:将多条查询语句的结果合并成一个结果
·语法
查询语句1
union
查询语句2
union
·应用场景
要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时
·特点
1、要求多条查询语句的查询列数是一致的!
2、要求多条查询语句的查询的每一列的类型和顺序最好一致
3、union关键字默认去重,如果使用union all 可以包含重复项
例子
查询中国用户中男性的信息以及外国用户中年男性的用户信息 select id,cname,csex from t_ca where csex='男' union select t_id,tName,tGender from t_ua where tGender='male';
博主才学习完mysql里的查询相关的语句知识,发现mysql的知识特别多,而且对于博主这种第一次接触mysql的小白,感觉特别绕,需要通过以后多做mysql的查询面试题来提高熟练度。