# 进阶1:基础查询/*
语法:
select 查询列表 from 表明;
类似于:System.out.println(打印东西);
特点:
1.查询列表可以是:表中的字段、常量值、表达式、函数
2.查询的结果是一个虚拟的表格
*/USE ssh_jpkcw_sys;#1.查询表中的单个字段SELECT userName FROM t_admin;#2.查询表中的多个字段SELECT`userName`,`userPw`FROM t_admin;#3.查询表中的所有字段SELECT*FROM t_admin;#或者SELECT`userId`,`userName`,`userPw`FROM
t_admin;
说明:``(着重号是用来区分字段和关键字的,加``表示字段)#4.查询常量值SELECT100;SELECT'join';#5.查询表达式SELECT100%98;#6.查询函数SELECT VERSION();#7.起别名/*
① 便于理解
② 如果要查询的字段有重名的情况,使用别名可以区分开来
*/# 方式一:使用 asSELECT100%98AS"结果";# 别名用 "" 括起来SELECT userName AS 用户,`userPw`AS 密码 FROM t_admin;# 别名也可以不用 "" 括起来,但是最好括起来# 方式二:是以哦那个空格SELECT userName 用户, userPw 密码 FROM t_admin;# 案例:查询 userPw,显示结果为 out putSELECT userPw AS"out put"FROM t_admin;#8.去重#案例:查询员工表中涉及到的所有的部门编号SELECTDISTINCT`password`FROM`user`;#9.+号的作用/*
Java 中的 + 号:
①:运算符,两个操作数都为数值型
②:连接符,只要有一个操作数为字符串
mysql中的+号:
仅仅只有一个功能:运算符
select 100+90; 两个操作数都为数值型,则做加法运算
select '123'+90; 只要其中一方为字符型,试图将字符型数值转换成数值型
如果转换成功,则继续做加法运算
select 'john'+90 如果转换失败,则将字符型数值转换成0
select null+10; 只要其中一方为null,则结果肯定为null
*/#案例:查询员工名和姓连接成一个字段,并显示为 姓名SELECT
CONCAT(last_name,first_name)AS 姓名
FROM
NAME;# 显示表name的结构,并查询其中的全部数据DESC NAME;SELECT*FROM NAME;# 显示出表name的全部列,各个列之间用逗号连接,列头显示成OUT_PUTSELECT
IFNULL(money,0)AS 奖金,
money
FROM
NAME;#---------------------------------------------------------------SELECT
CONCAT(`last_name`,`first_name`,IFNULL(money,0))AS out_put
FROM
NAME;
# 进阶2:条件查询/*
语法:
select
查询列表 ③
from
表名 ①
where
筛选条件; ②
分类:
一、按条件表达式筛选
条件运算符:> < = != <> >= <=
二、按逻辑表达式筛选
逻辑运算符:
作用:用于连接条件表达式
&&和and:两个条件都为 true,结果为 true,反之为 false
||或or:只要有一个条件为 true,结果为 true,反之为 false
!或not:如果连接的条件本身为false,结果为true,反之为false
&& || !
and or not
三、模糊查询
like
between and
in
is null
*/#一、按条件表达式筛选#案例1:查询工资 > 12000 的员工信息SELECT*FROM
NAME
WHERE money>12000;#案例2:查询部门编号不等于5的员工名和部门编号SELECT`first_name`,`department_id`FROM`name`WHERE`department_id`<>5;#二、按逻辑表达式筛选#案例1:查询工资在 10000 到 20000 之间的员工名、工资以及奖金SELECT
CONCAT(last_name,first_name)AS 姓名,
money,`department_id`FROM
NAME
WHERE
money >=10000AND money <=20000;#案例2:查询部门编号不是在 90 到 110 之间,或者工资高于 14000 的员工信息SELECT*FROM
NAME
WHERENOT(`department_id`>=90AND`department_id`<=110)OR money >14000;#三、模糊查询/*
like
特点:
①一般和通配符搭配使用
通配符:
%:任意多个字符,包含0个字符
_:任意单个字符
between and
in
is null | is not null
*/#1.like#案例1:查询员工名中包含字符a的员工信息SELECT*FROM
NAME
WHERE
last_name LIKE'%a%';#字符型的值必须用单引号('')括起来#案例2:查询员工名中第三个字符为,第五个字符为的员工名和工资SELECT`last_name`,`money`FROM`name`WHERE`last_name`LIKE'__n_l%';#案例3:查询员工名中第二个字符为_的员工名SELECT
last_name
FROM
NAME
WHERE#last_name like '_\_%';#ESCAPE 指定 $ 为转义字符
last_name LIKE'_$_%'ESCAPE'$';#建议使用该转义字符#2.between and/*
①使用 between and 可以提高语句的简洁度
②包含临界值
③两个临界值不要调换位置
*/#案例1:查询员工编号在 100 到 120 之间的员工信息SELECT*FROM`name`WHERE`department_id`>=100AND`department_id`<=120;#-----------------------------------------------------------SELECT*FROM`name`WHERE`department_id`BETWEEN100AND120;#3.in/*
含义:判断某个字段的值是否属于 in 列表中的某一项
特点:
①使用 in 提高语句简洁度
②in 列表的值类型必须一致或兼容
*/#案例:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES 中的一个员工名和工种编号SELECT
last_name,
job_id
FROM
NAME
WHERE
job_id ='IT_PROG'OR job_id ='AD_VP'OR JOB_ID ='AD_PRES';#---------------------------------------------------------------------SELECT
last_name,
job_id
FROM
NAME
WHERE
job_id IN('IT_PROG','AD_VP','AD_PRES');# in 相当于 = #4.is null/*
=或<>不能用于判断 null 值
is null 或 is not null 可以判断 null 值
*/#案例1:查询没有奖金的员工名和奖金率SELECT
last_name,
commission_pct
FROM
NAME
WHERE
commission_pct ISNULL;#案例2:查询有奖金的员工名和奖金率SELECT
last_name,
commission_pct
FROM
NAME
WHERE
commission_pct ISNOTNULL;#-------------------错误示范 is 和 null 是搭配使用的-----------------------------SELECT
last_name,
commission_pct
FROM`name`WHERE`money`IS12000;# 安全等于 <=>#案例1:查询没有奖金的员工名和奖金率SELECT
last_name,
commission_pct
FROM
NAME
WHERE
commission_pct <=>NULL;#案例2:查询工资为 12000 的员工信息SELECT
last_name,
money
FROM
NAME
WHERE
money <=>12000;#is null pk <=> ISNULL:仅仅可以判断 NULL 值,可读性较高,建议使用
<=> :既可以判断 NULL 值,又可以判断普通的数值,可读性较低
# 查询员工号为 176 的员工的姓名和部门号和年薪SELECT`last_name`,`department_id`,`money`*12(1+IFNULL(`commission_pct`,0))AS 年薪
FROM
NAME;
测试:
1.查询工资大于 12000 的员工姓名和工资
2.查询员工号为 176 的员工的姓名和部门号和年薪
3.选择工资不在 5000 到 12000 的员工的姓名和工资
4.选择在 20 或 50 号部门工作的员工姓名和部门号
5.选择公司中没有管理者的员工姓名及 job id
6.选择公司中有奖金的员工姓名,工资和奖金级别
7.选择员工姓名的第三个字母是 a 的员工姓名
8.选择姓名中字母 a 和 e 的员工姓名
9.显示出表 employees 表中 FIRST NAME 以'e'结尾的员工信息
10.显示出来 employees 部门编号在 80-100 之间的姓名、职位
11.显示出来 employees 的 manager_id 是 100,101,110 的员工姓名、职位
测试题
一、查询没有奖金,且工资小于 18000 的salary,last_name
SELECT salary,last_name
FROM employees
WHERE commission_pct ISNULLAND salary <18000;
二、查询 employees 表中,job_id 不为 'IT' 或者 工资为 12000 的员工信息
SELECT*FROM employees
WHERE job_id <>'IT'OR salary =12000;
三、查看部门 departments 表的结构,查询效果如下
FIELD TYPENULLKEYDEFAULT Extra
department_id INT(4)NO PRI NULLAUTO_INCREMENT
department_name VARCHAR(3) YES NULL
manager_id INT(6) YES NULL
location_id indext(4) YES NULLNULL
命令:DESC departments;
四、查询部门 departments 表中涉及到了那些位置编号
SELECTDISTINCT location_id
FROM departments;
五、经典面试题:
试问:SELECT*FROM employees;
和
SELECT*FROM employees WHERE commission_pct LIKE'%%'AND last_name LIKE'%%';
结果是否一样?并说明原因
不一样!
如果判断的字段有 NULL 值
SELECT*FROM employees;
和(下面包含所有字段)SELECT*FROM employees WHERE commission_pct LIKE'%%'OR last_name LIKE'%%'OR employee_id LIKE'%%';
一样
一、数据库的好处
1. 可以持久化数据到本地
2.结构化查询
二、数据库的常见概念(重点)1、DB:数据库,存储数据的容器
2、DBMS: 数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理 DB
3、SQL: 结构化查询语言,用于和数据库通信的语言,不是某个数据库软件特有的,而是几乎所有的主流数据库软件通用的语言
三、数据库存储数据的特点
1、数据库存放到表中,然后表再放到库中
2、一个库中可以有多张表,每张表具有唯一的表名用来表示自己
3、表中有一个或多个列,列又称为"字段",相当于java中的"属性"4、表中的每一行数据,相当于java中的"对象"
常见的数据库管理系统
mysql、oracle、db2、sqlserver
MySQL的背景
前身属于瑞典的一家公司,MySQL AB
08年被 sun 公司收购
09年 sun 被 oracle 收购
MySQL的优点
1.开源、免费、成本低
2.性能高、移植性也好
3.体积小,便于安装
MySQL的安装
属于 c/s 架构的软件,一般来讲安装服务端
企业版
社区版
MySQL服务的启动和停止
方式一:通过命令行
net start 服务名
net stop 服务名
方式二:计算机--右击--管理--服务
MySQL服务的登录和退出
登录:mysql【-h 主机名 -P 端口号】-u 用户名 -p密码
退出:exit 或 ctrl+C
DQL语言
基础查询
一、语法
select 查询列表
from 表名:
二、特点
1.查询列表可以是字段、常量、表达式、函数、也可以是多个
2.查询结果是一个虚拟表
三、示例
1.查询单个字段
select 字段名 from 表名;2.查询多个字段
select 字段名,字段名 from 表名;3.查询所有字段
select*from 表名
4.查询常量
select 常量值;
注意:字符型和日期型的常量值必须用单引号引起来,数值型不需要
5.查询函数
select 函数名(实参列表)6.查询表达式
select100/1234;7.起别名
① as
② 空格
8.去重
selectdistinct 字段名 from 表名;# 错误写法# select distinct a,b from 表名;selectdistinct a from 表名;9.+
作用:做加法运算
select 数值+数值:直接运算
select 字符+数值:先试图将字符转换成数值,如果转换成功,则继续运算;否则转换成0,再做运算
selectnull+值;结果都是 null10.【补充】concat 函数
功能:拼接字符
select concat(字符1,字符2,字符3,...);11.【补充】ifnull 函数
功能:判断某字段或表达式是否为 null,如果为 null 返回指定的值,否则返回原来的值
select ifnull(connission_pct,0)from employees;12.【补充】isnull函数
功能:判断某字段或表达式是否为 null,如果是,则返回1,否则返回0select isnull(commission_pct),commission_pct from employees;
条件查询
一、语法
select 查询列表
from 表名
where 筛选条件
二、筛选条件的分类
1.简单条件运算符
><=<>!=>=<=<=> 安全等于
2.逻辑运算符
&&and||or!not3.模糊查询
like:一般搭配通配符使用,可以判断字符型或数值型
通配符:%任意多个字符,_任意单个字符
betweenandininnull/innotnull: 用于判断 null 值
普通类型的数值 null值 可读性
isnull × √ √
<=> √ √ ×
#进阶3:排序查询/*
引入:
select * from employees;
语法:
select 查询列表 ③
from 表 ①
【where 筛选条件】 ②
order by 排序列表 【asc | desc】④
特点:
1.asc代表的是升序,desc代表的是降序
如果不写,默认是升序
2.order by子句中可以支持单个字段、多个字段、表达式、函数、别名
3.order by子句一般是放在查询语句的最后面,limit子句除外
*/#案例1:查询员工信息,要求工资从高到底排序SELECT*FROM NAME ORDERBY money DESC;SELECT*FROM NAME ORDERBY money ASC;#默认的是升序# 或者SELECT*FROM NAME ORDERBY money;#默认的是升序#案例2: 查询部门编号 >= 90 的员工信息,按入职时间的先后进行排序【添加筛选条件】SELECT*FROM NAME
WHERE department_id >=90ORDERBY hiredate ASC;#案例3: 按年薪的高低显示员工的信息和 年薪【按表达式排序】SELECT*,money*12*(1+IFNULL(commission_pct,0)) 年薪
FROM NAME
ORDERBY money*12*(1+IFNULL(commission_pct,0))DESC;#案例4:按年薪的高低显示员工的信息和年薪【按别名排序】SELECT*,money*12*(1+IFNULL(commission_pct,0)) 年薪
FROM NAME
ORDERBY 年薪 DESC;#案例5:按姓名的长度显示员工的姓名和工资【按函数排序】SELECT LENGTH(last_name) 字节长度,last_name,money
FROM NAME
ORDERBY LENGTH(last_name)DESC;#案例6:查询员工信息,要求先按工资升序,再按员工编号排序【按多个字段排序】SELECT*FROM NAME
ORDERBY money ASC,department_id DESC;
测试
1.查询员工的姓名和部门号和年薪,按年薪降序 按姓名升序
SELECT last_name,department_id,money*12*(1+IFNULL(commission_pct,0)) 年薪
FROM NAME
ORDERBY 年薪 DESC,last_name ASC;2.选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序。
SELECT last_name,money
FROM NAME
WHERE money NOTBETWEEN8000AND17000ORDERBY money DESC;3.查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
SELECT*,LENGTH(email)FROM NAME
WHERE email LIKE'%e%'ORDERBY LENGTH(email)DESC,department_id ASC;