1 数据库和SQL概述
1.1 数据库简介
数据库指的是长期存在计算机内、有组织、可共享的、大量数据的集合。数据是按照特定的数据模型来组织、存储在数据库中的。
1.2 数据库的好处
1.持久化数据到本地
2.可以实现结构化查询,方便管理
1.3 数据库相关概念
- DB(database):数据库,保存一组有组织的数据的容器
- DBMS(Database Management System):数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据
- 常见DBMS:MySQL、Oracle、DB2、SqlServer等
- SQL:结构化查询语言,用于和数据库通信的语言
1.4 SQL的语言分类
-
DML(Data Manipulate Language):数据操纵语言,用于添加、删除、修改数据库记录,并检查数据完整性
关键字:insert, delete, update 等
-
DDL(Data Define Languge):数据定义语言,用于库和表的创建、修改、删除
关键字:create, drop,alter等
-
TCL(Data Control Language):数据事务语言
-
DQL(Data Query Language):数据查询语言,用来查询数据库中表的记录(数据)
关键字:select, where 等
2 MySQL介绍和安装
2.1 MySQL介绍
MySQL 是一款安全、跨平台、高效的,并与 PHP、Java 等主流编程语言紧密结合的数据库系统。该数据库系统是由瑞典的 MySQL AB 公司开发、发布并支持,由 MySQL 的初始开发人员 David Axmark 和 Michael Monty Widenius 于 1995 年建立的
官方网址:https://www.mysql.com/
2.2 MySQL安装
注意:安装路径不要包含中文或者空格等特殊字符(使用纯英文目录),默认安装在C盘。
具体安装步骤请参见《MySQL数据库安装手册》
2.3 MySQL服务的启动和停止
方式一:计算机——右击管理——服务——MySQL
方式二:通过管理员身份运行cmd命令提示行
net start mysql(启动服务)
net stop mysql(停止服务)
2.4 MySQL服务的登录和退出
方式一:通过MySQL自带的客户端
只限于root用户
方式二:通过cmd命令提示行关闭,未配置MySQL环境变量,需在MySQL安装的bin下启动cmd
登录:
mysql 【-h主机名 -P端口号 】-u用户名 -p密码
退出:
exit或ctrl+C
2.5 MySQL常见的命令
1.查看当前所有的数据库
show databases;
2.打开指定的库
use 库名;
3.查看当前库的所有表
show tables;
4.查看其他库的所有表
show tables from 库名
5.创建表
create table 表名{
列名 列类型,
列名 列类型,
…
};
6.查看表结构
desc 表名;
7.查看服务器的版本
方式一:登陆到mysql服务器,
select version();
方式二:没有登录到mysql服务器
mysql --version 或 mysql --V
2.7 MySQL的语法规范
不区分大小写,但建议关键字大写,表名、列名小写
使用“;”结尾
各子句一般分行写
关键字不能缩写也不能分行
合理使用缩进
注释
单行注释:#注释文字
单行注释:-- 注释文字
多行注释:/* 注释文字 */
2.7 DQL语言
2.7.1 简单查询
1. 查询表中所有记录
* select * from 表名;
2. 基础查询
1. 多个字段的查询
select 字段名1,字段名2... from 表名;
* 注意:
* 如果查询所有字段,则可以使用*来替代字段列表。
2. 查询常量值
SELECT 100;
SELECT 'john';
3.查询表达式
SELECT 100%98;
6.查询函数
SELECT VERSION();
7.起别名
/*
①便于理解
②如果要查询的字段有重名的情况,使用别名可以区分开来
*/
#方式一:使用关键字AS
SELECT 100%98 AS 结果;
SELECT
last_name AS 姓,
first_name AS 名
FROM employees;
#方式二:使用空格
SELECT last_name 姓,
first_name 名
FROM employees;
# 案例:查询salary,显示结果为 out put
SELECT salary AS "out put" FROM employees;
8. 去除重复:
* distinct
#案例:查询员工表中涉及到的所有的部门编号
SELECT DISTINCT `department_id` FROM `employees`;
9.+号的作用 (运算符)
/*运算符
select 100+90 "结果"; 两个操作都是数值型,则是做加法运算
select '123' + 90;其中一个是字符型,试图将字符型转换成数值型,如果成功则是做加法运算
select 'john'+90;转换失败,则将字符符型转为0再做加法运算
select null+100;只要一方为null,结果肯定为null;
*/
#案例:查询员工名和姓连接成一个字段,并显示为姓名
SELECT CONCAT(`first_name`,`last_name`) AS "姓名" FROM `employees` ;
10.ifnull() 判断是否为空,为空时可自定义返回值
select ifnull(字段名,返回值) as 别名 , 字段名
from employees;
11.isnull() 判断是否为空,空返回1,不为空返回0
select isnull(字段名) as 别名
from employees;
课堂练习
1.下面的语句是否可以执行成功
select last_name , job_id , salary as sal from employees;
对的
2.下面的语句是否可以执行成功
select * from employees;
对的
3.显示表departments的结构,并查询其中的全部数据
desc departments;
select * from department;
4.显示出表employees的全部列,各个列之间用逗号连接,列头显示成OUT_PUT
select
concat(`first_name`,',',`last_name`,',',IFNULL(`commission_pct`,0),',',`job_id`) AS "out_put"
from
`employees`;
2.7.2 条件查询
# 进阶2:条件查询
/*
语法:
select
查询列表
from
表名
where
筛选条件;
分类:
一、按条件表达式筛选
条件运算符:> , < , = , != / <> , >= , <=
二、按逻辑表达式筛选
逻辑运算符:&& and 、|| or 、! not
三、模糊查询
like:一般和通配符搭配使用(%任意多个字符,包含0个字符 ;_任意单个字符)
between and
in
is null/is not null
*/
# 一、按条件表达式筛选 > , < , = , != / <> , >= , <=
#案列1:查询工资>12000的员工信息
SELECT
*
FROM
`employees`
WHERE
`salary`>12000;
#案列2:查询部门编号不等于90号的员工名和部门编号
SELECT
CONCAT(`last_name`,`first_name`) AS 员工名,
`department_id` AS 部门编号
FROM
`employees`
WHERE
`department_id`<>90;
# 二、按逻辑表达式筛选 && and 、|| or 、! not
# 案例1:查询工资在10000到20000之间的员工名、工资、奖金
SELECT
CONCAT(`last_name`,`first_name`) AS 员工名,
`commission_pct` AS 奖金,
`salary` AS 工资
FROM
`employees`
WHERE
`salary`>=10000 AND `salary`<=20000;
# 案例2:查询部门编号不在90到110之间,或者工资高于15000的员工信息
SELECT
*
FROM
`employees`
WHERE
NOT(`department_id`>=90 AND `department_id`<=110) OR `salary`>15000;
# 三、模糊查询 like 、between and 、in、is null/is not null
# 1.LIKE
# 案列1:查询员工名中包含字符a的员工信息
SELECT
*
FROM
`employees`
WHERE
`last_name` LIKE '%a%';
#案例2:查询员工名中第三个字符为e,第五个字符为a的员工名和工资
SELECT
`last_name`,
`salary`
FROM
`employees`
WHERE
`last_name` LIKE '__n_l%';
#案例3:查询员工名中第二个字符为_的员工名
SELECT
`last_name`
FROM
`employees`
WHERE
`last_name` LIKE '_$_%' ESCAPE '$'; #关键字escape转移标志,将其他符号作为转义字符
# 2.between and
/*
①可以提高语句简洁度
②包含临界值
③两个临界值不能换顺序
*/
#案例1:查询员工编号在100到120之间的员工信息
SELECT
*
FROM
`employees`
WHERE
`employee_id` BETWEEN 100 AND 200;
# 3.in
/*
含义:判断某个字段的值是否属于in列表中的某一项
特点: ①使用in提高语句简洁度
②in列表的值类型必须一致或兼容
③不支持在字段中写通配符
*/
#案例1:查询员工的工种编号是 IT_PROG、AD_VP、AD_PRES中的一个员工名和工种编号
SELECT
`last_name`,
`job_id`
FROM
`employees`
WHERE
`job_id` IN ('IT_PROG','AD_VP','AD_PRES');
# 4.is null
# 案列1:查询没有奖金的员工名和奖金率
SELECT
`last_name`,
`commission_pct`
FROM
`employees`
WHERE
`commission_pct` IS NULL;
# 案列2:查询有奖金的员工名和奖金率
SELECT
`last_name`,
`commission_pct`
FROM
`employees`
WHERE
`commission_pct` IS NOT NULL;
# 【补充】安全等于
# 案列1:查询没有奖金的员工名和奖金率
SELECT
`last_name`,
`commission_pct`
FROM
`employees`
WHERE
`commission_pct`<=> NULL;
#案例2:查询工资为12000的员工信息
SELECT
`last_name`,
`salary`
FROM
`employees`
WHERE
`salary`<=>12000;
#is null pk <=>
IS NULL:仅仅只判断NULL值,建议使用
<=>:可读性差
课堂练习
1. 查询员工号为176的员工的姓名和部门号和年薪
SELECT
CONCAT(`last_name`,`first_name`) AS 姓名,
`job_id` AS 部门号,
`salary`*12 *(1+IFNULL(`commission_pct`,0))AS 年薪
FROM
`employees`
WHERE
`employee_id`=176;
2. 选择工资不在5000到12000的员工的姓名和工资
SELECT
CONCAT(`last_name`,`first_name`) AS 姓名,
`salary` AS 工资
FROM
`employees`
WHERE
`salary`<5000 OR `salary`>12000;
3. 选择在20或50号部门工作的员工姓名和部门号
SELECT
CONCAT(`last_name`,`first_name`) AS 姓名,
`department_id` AS 部门号
FROM
`employees`
WHERE
`department_id`IN ('20','50');
4. 选择姓名中有字母a和e的员工姓名
SELECT
CONCAT(`last_name`,`first_name`) AS 姓名
FROM
`employees`
WHERE
`last_name` LIKE "%a%e%";
5. 显示出表employees部门编号在80-100之间的姓名、职位
SELECT
CONCAT(`last_name`,`first_name`) AS 姓名,
`job_id`
FROM
`employees`
WHERE
`department_id` BETWEEN 80 AND 100;