一、概述
数据库的好处
- 持久化数据到本地
- 可以实现结构化查询,方便管理
数据库相关概念
- DB:数据库,保存一组有组织的数据的容器
- DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据
- SQL:结构化查询语言,用于和DBMS通信的语言
数据库存储数据的特点
- 将数据放到表中,表再放到库中
- 一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。
- 表具有一些特性,这些特性定义了数据在表中如何存储,类似Java中 “类”的设计。
- 表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似Java中的”属性”
- 表中的数据是按行存储的,每一行类似于java中的“对象”。
二、MySQL简介和安装
1. MySQL优点
- 成本低:开放源码代码,可以免费试用
- 性能高:执行速度快
- 简单:容易安装和使用
2. MySQL 卸载和安装
卸载、安装步骤:参考地址,先自己搜索,后续补上
3. MySQL服务的启动和停止
- 方式一:计算机——右击管理——服务
- 方式二:右键命令行程序,通过管理员身份运行
- net start 服务名(启动服务)
- net stop 服务名(停止服务)
4. MySQL服务的登录和退出
-
方式一:通过mysql自带的客户端,开始-程序中找到MySQL目录
- 只限于root用户
-
方式二:通过windows自带的客户端,直接进入windows自带的命令行
- 登录:mysql 【-h主机名 -P端口号 】-u用户名 -p密码
- 退出:exit或ctr++l+C
三、MySQL命令
1. MySQL常用命令
1.查看当前所有的数据库
show databases;
2.打开指定的库
use 库名;
3.查看当前库的所有表
show tables;
4.查看其它库的所有表
show tables from 库名;
5.查看当前所在库
select database();
6.创建表
create table 表名(
列名 列类型,
列名 列类型,
...
);
7.查看表结构
desc 表名;
8.查看MySQL服务器的版本
方式一:登录到mysql服务端
select version();
方式二:没有登录到mysql服务端
mysql --version
或者
mysql -V
2. MySQL的语法规范
- 不区分大小写,但建议关键字大写,表名、列名小写
- 每条命令最好用分号结尾
- 每条命令根据需要,可以进行缩进或换行(直接回车)
- 字段可以加着重号``,也可以不加;字符常量必须加单引号’’
- 注释
- 单行注释:#注释文字
- 单行注释:-- 注释文字(注意–后面有空格)
- 多行注释:/* 注释文字 */
3. SQL的语言分类
- DQL(Data Query Language):数据查询语言
- select
- DML(Data Manipulate Language):数据操作语言
- insert 、update、delete
- DDL(Data Define Languge):数据定义语言
- create、drop、alter
- TCL(Transaction Control Language):事务控制语言
- commit、rollback
- commit、rollback
4. 数据表准备
导入脚本,或者创建表
员工表
部门表
位置表
工种表
女神表
男神表
具体sql执行脚本访问链接:https://blog.csdn.net/GongmissYan/article/details/102937816
四、DQL语言
1. 基础查询
语法:
SELECT 要查询的东西 【FROM 表名】;
- 类似于Java中:System.out.println(要打印的东西);
特点:
- 通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
- 要查询的东西可以是常量值、可以是表达式、可以是字段、可以是函数
补充说明:
- 使用sqlyog时,直接双击左侧字段,可以在查询器上直接输入完整字段,避免输入错误
- 选中sql语句,F12可以格式化sql语句
- 双击字段时,sqlyog会帮我们给字段加上着重号``,这个符号可以不加;加上的好处是,当某些字段名与关键字重名时,比如NAME,加上着重号标识,说明这就是个字段名
SQL举例:
查询字段
#查寻名字
SELECT last_name FROM employees;
#查询所有字段;有限制,查询得到的字段顺序与原表一致
SELECT * FROM employees;
查询常量
#查询数字常量
SELECT 100;
#查询字符常量
SELECT 'join';
查询表达式、函数
#查询表达式
SELECT 100*100;
#查询函数
SELECT VERSION();
查询的字段起别名:
- 用处:1.便于理解;2.查询多表有重名时,别名便于区分
#给字段起别名方式一
SELECT last_name AS 姓,first_name AS 名 FROM employees;
#给字段起别名方式二
SELECT last_name 姓,first_name 名 FROM employees;
#如果别名是特殊符号,直接使用会被识别成其他含义,这时推荐使用""包裹别名
SELECT salary AS "out put" FROM employees;
去重
#去重
SELECT DISTINCT department_id FROM employees LIMIT 1;
+号作用
- Java中
- 运算符:连个操作数都是数值型
- 只要有一个操作数为字符型,
- MySQL中
- 只有一个功能,表示运算符
- 当+号两边均为数值型,则做加法运算
- 当+号两边其中一方为字符型,则试图将字符型转为数值型,如果转换成功则做加法运算;如果转换失败,则字符直接等于0
- 当+号两边其中一方只要为null,结果就是一定null
- 只有一个功能,表示运算符
SELECT 10+90;
SELECT '10'+90;
SELECT 'join'+90;
SELECT NULL+90;
拼接字段:将查询的两个字段拼接成一个字段
SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees;
判断是否为空,如果为NULL则返回…
SELECT IFNULL(commission_pct,0) AS 奖金率,commission_pct FROM employees;
2. 条件查询
条件查询:根据条件过滤原始表的数据,查询到想要的数据
语法:
select
要查询的字段|表达式|常量值|函数
from
表
where
条件;
条件分类:条件表达式、逻辑表达式、模糊查询
条件表达式
特点
- 条件运算符:> < >= <= = != <>
- 举例:salary>10000
逻辑表达式
特点
- 逻辑运算符:
- and(&&):两个条件如果同时成立,结果为true,否则为false
- or(||):两个条件只要有一个成立,结果为true,否则为false
- not(!):如果条件成立,则not后为false,否则为true
- 举例:salary>10000 && salary<20000
案例
查询部门编号不在90-110之间,或者工资高于15000的员工信息
SELECT
*
FROM
employees
WHERE NOT (
department_id >= 90
AND department_id <= 110
)
OR salary > 15000 ;
模糊查询
like、between and、in、is null
like 特点
- like:一般和通配符搭配使用
- % 通配任意多个字符,包括0个字符
- _通配任意单个字符
案例
查询员工名中包含字符a的员工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';
查询员工名字中第三个字符为e,第五个字符为a的员工名和工资
SELECT last_name,salary FROM employees WHERE last_name LIKE '__n_a%';
查询员工名中第二个字符为_的员工名(需要给_转义)
SELECT last_name FROM employees WHERE last_name LIKE '_\_%';
#也可以不使用\,而是自己指定转义符
SELECT last_name FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';
between and 特点
- between and:在…之间
- 可以提高语句简洁度
- 选取的范围是闭区间,包含两个端点的值
- 两个端点的值不可以颠倒顺序,否则查询不到结果,因为它完全等价与>=左边的值,<=右边的值
案例
查询员工编号在100-200之间的员工信息
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 200;
in 特点
- in:判断某字段是否属于括号内的某一项
- 提高语句简洁度
- 括号内的值类型必须一致,或者可以兼容,也就是可以隐式转化
- 括号内的值必须是确定的,不支持通配符
案例
查询员工工种编号为 IT_PROT、AD_VP、AD_PRES的员工名和工种编号
SELECT * FROM employees WHERE job_id IN('IT_PROT','AD_VP','AD_PRES');
is null 特点
- is null:用于和null进行比较
- =或<>不能用于判断null值
- is null和is not null可以判断null值
- is只用于和null搭配,不能和普通常量、变量搭配
案例
查询没有奖金的员工名和奖金率
SELECT * FROM employees WHERE commission_pct IS NULL;
同理,查询有奖金的员工为
SELECT * FROM employees WHERE commission_pct IS NOT NULL;
<=>特点
- <=>:安全等于
- 可以用于和null做判断,也可以和普通类型做判断
- 缺点就是可读性比较差,不容易判断是等于还是不等于
案例
查询奖金为空的
SELECT * FROM employees WHERE commission_pct<=>NULL;
3. 排序查询
语法:
select
要查询的东西
from
表
where
条件
order by 排序的字段|表达式|函数|别名 【asc|desc】
特点:
- asc代表升序,desc代表降序,如果不写,默认降序
- order by 子句中可以支持单个字段,多个字段,表达式,函数,别名
- order by 子句一般放在查询语句的最后面,limit 子句除外
案例:
基础用法:查询员工,按照工资降序排序
SELECT * FROM employees ORDER BY salary DESC;
添加条件:查询员工,条件为部门编号>=90,按入职时间先后排序
SELECT * FROM employees WHERE department_id>=90 ORDER BY hiredate ASC;
按表达式排序:查询员工,按年薪从高到低排序,支持按照别名排序
SELECT
employee_id,
salary * 12 * (1+ IFNULL(commission_pct, 0)) 年薪
FROM
employees
ORDER BY 年薪 DESC ;
按照函数排序:查询员工,按姓名长度排序
SELECT
LENGTH(last_name) 字节长度,
last_name,
salary
FROM
employees
ORDER BY 字节长度 DESC ;
按照多个字段排序:先按第一个字段工资排序,然后在此基础按第二个字段员工编号排序,
SELECT
*
FROM
employees
ORDER BY salary DESC,
employee_id DESC ;
4. 常见函数
**概念:**类似于Java方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处:
- 隐藏了实现细节,
- 提高代码复用性
调用:先介绍现成的函数
select 函数名(实参列表) 【from 表】;
分类:
- 单行函数:如,concat,length,ifnull
- 分组函数:做统计使用,又称为统计函数、聚合函数、组函数
单行函数
字符函数
- concat:拼接
- substr:截取子串
- upper:转换成大写
- lower:转换成小写
- trim:去前后指定的空格和字符
- ltrim:去左边空格
- rtrim:去右边空格
- replace:替换
- lpad:左填充
- rpad:右填充
- instr:返回子串第一次出现的索引
- length:获取字节个数
案例:
SELECT UPPER('join');
#姓大写,名小写,然后拼接
SELECT CONCAT(UPPER(last_name),LOWER(first_name)) 姓名 FROM employees;
#截取字符串,从索引处开始到结尾,注意SQL语言索引从1开始
SELECT SUBSTR('abcde',3) out_put;
#截取字符串,从索引处开始,截取若干个字符,而且是字符长度而非字节
SELECT SUBSTR('abcde',3,2) out_put;
#要求结果中姓名首字母大写,其他字符小写,最后用_拼接
SELECT
CONCAT(
UPPER(SUBSTR(last_name, 1, 1)),
'_',
LOWER(SUBSTR(last_name, 2))
) out_put
FROM
employees ;
#返回淄川第一次出现的索引,如果没有则返回0
SELECT INSTR('abcde','c') AS out_put;
#去掉前后空格
SELECT TRIM(' a ') AS out_put;
#去掉前后指定的字符
SELECT TRIM('a' FROM 'aaaaaaHelloaaaa') AS out_put;
#用指定的字符左填充,最终得到指定的字符长度
SELECT LPAD('你们好',10,'*') AS out_put;
#替换,所有符合的全部都替换
SELECT REPLACE('aaaabcd','a','k') AS out_put;
数学函数
- round:四舍五入
- rand:随机数
- floor:向下取整
- ceil:向上取整
- mod:取余
- truncate:截断
#四舍五入,结果为-2
SELECT ROUND(-1.55);
#四舍五入重载,保留2位小数
SELECT ROUND(1.567,2);
#向上取整,返回>=该参数的最小整数
SELECT CEIL(1.02);
SELECT CEIL(-1.02);
#向下取整,返回<=该参数的最小整数
SELECT FLOOR(-9.99);
#截断
SELECT TRUNCATE(1.66654,2);
#取模、取余,mod(a,b)最终是按照公式 a-a/b*b计算的
SELECT MOD(10,3);
SELECT 10%3;
日期函数
- now:当前系统日期+时间
- curdate:当前系统日期
- curtime:当前系统时间
- str_to_date:将字符转换成日期,Y四位年份,y两位年份
- date_format:将日期转换成字符
举例:
#获取当前日期不包含时间
SELECT CURDATE();
#获取当前时间,不包含日期
SELECT CURTIME();
#可以获取指定的部分,年、月、日、消失、分钟、秒
SELECT YEAR(NOW()) 年;
SELECT YEAR(hiredate) 年 FROM employees;
SELECT MONTH(NOW()) 月;
#日期格式的字符转为指定格式的日期
SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put;
#如果用户输入的字符串是其他格式的时间,我们也可以按照对应格式将其转为时间
SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');
#日期转为指定格式的字符
SELECT DATE_FORMAT(NOW