MySQL数据库-1

MySQL数据库-1

image-20231115143217402

image-20231115143334283

1.为什么要使用数据库

  • 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以"固化”,而持久化的实现过程大多通过各种关系数据库来完成。
  • 持久化的主要作用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、XML数据文件中。

2.数据库与数据库管理系统

2.1数据库的相关概念

  • DB:数据库(Database)
    即存储数据的“仓库”,其本质是一个文件系统。它保存了一系列有组织的数据。
  • IDBMS:数据库管理系统(Database Management System)
    是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制。用户通过数据库管理系统访问数据库中表内的数据。
  • sQL:结构化查询语言(Structured Query Language)专门用来与数据库通信的语言。

image-20231115144819732


03章基本的SELECT语句

#1.sQL的分类

  • DDL:数据定义语言。CREATE \ALTER \ DROP \ RENAME\TRUNCATE
  • DML:数据操作语言。INSERT \DELETE
    UPDATE \SELECT
  • DCL:数据控制语言。COMMIT \ROLLBACK \ SAVEPOINT \GRANT \REVOKE

2.2 SQL大小写规范(建议遵守)

  • 推荐采用统一的书写规范:
  • 数据库名、表名、表别名、字段名、字段别名等都小写。SQL关键字、函数名、绑定变量等都大写

最基本的SELECT...FROM结构

SELECT  employee_id,last_name,salary
FROM employees

6.列的别名

as:全称:alias(别名),可以省略

列的别名可以使用一对""引起来。

SELECT  employee_id 我id,last_name AS xxx,salary
FROM employees

7.去除重复行

DISTINCT

8.空值参与运算

空值: null
null不等同于0,'', 'nulll

着重号

SELECT*FROM order;

查询常数

SELECT 'aaa',123, department_id
FROM employees;

#11.显示表结构

DESCRIBE employees; #显示了表中字段的详细信息

DESC employees;

#过滤条件 声明在FROM结构的后面

WHERE department_id = 90;


第04章_运算符

比较运算符

<=>:安全等于

SELECT NULL<=>NULL

LiKE:模制查询

%:代表不确定个数的字符(0个,1个,或多个)

_:代表一个不确定的字符

SELECT last_name
FROM employees
WHERE last_name LIKE '%a%';

REGEXP\RLiKE :正则表达式

SELECT 'asdf' REGEXP 's.f','asdf' REGEXP '[nb]'

第5章_排序与分页

列的别名只能在 ORDER BY中使用,不能在wHERE中使用。

#第5章_排序与分页

#1.排序
SELECT * FROM employees;

#使用ORDERBY对查询到的数据进行排序操作。
#升序:Asc (ascend)
#降序:DESc (descend)
#如果在ORDER BY后没有显式指名排序的方式的话,则默认按照升序排列。

SELECT employee_id ,last_name,salary
 FROM employees
ORDER BY salary DESC;

#2级排序
SELECT employee_id ,last_name,salary,department_id
 FROM employees
ORDER BY department_id DESC,salary;

分页

#分页
#mysql使用limit实现数据的分页显示
SELECT employee_id ,last_name,salary,department_id
 FROM employees
 LIMIT 0,20;
#需求:每页显示pagesize条记录,此时显示第pageNo页:
#公式:LIMIT (pageNo-1)* pagesize,pagesizer

#2.2 WHERE ... ORDER BY ...LIMIT声明顺序如下:
#LIMIT的格式:严格来说:LIMIT位置偏移量,条目数
#结构"LIMIT 0,条目数"等价于"LIMIT条目数"
SELECT employee_id ,last_name,salary,department_id
 FROM employees
 WHERE salary>6000
 ORDER BY salary DESC
 LIMIT 0,20;

第06章_多表查询

#第06章_多表查询
SELECT employee_id,department_name
FROM employees,departments
WHERE employees.`department_id`=departments.`department_id`;

#如果查询语句中出现了多个表中都存在的字段,则必须指明此字段所在的表。
SELECT employee_id,department_name,employees.department_id
FROM employees,departments
WHERE employees.`department_id`=departments.`department_id`;
#建议:从sql优化的角度,建议多表查询时,每个字段前都指明其所在的表。

#可以给表起别名,在SELECT和wHERE中使用表的别名。
SELECT t1.employee_id,t2.department_name,t1.department_id
FROM employees t1,departments t2
WHERE t1.`department_id`=t2.`department_id`;
#如果给表起了别名,一旦在SELECT或WHERE中使用表名的话,则必须使用表的别名,而不能再使用表的原名。

#练习:查询员工的employee_id,last_name , department_name , city
#结论:如果有n个表实现多表的查询,则需要至少n-1个连接条件
SELECT t1.employee_id,t1.`last_name`,t2.department_name,t3.`city`,t1.department_id
FROM employees t1,departments t2,locations t3
WHERE t1.`department_id`=t2.`department_id`
AND t2.`location_id`=t3.`location_id`;

7.多表查询的分类

角度1:等值连接vs非等值连接
角度2:自连接vs非白连接

角度3:内连接vs外连接

#角度1:等值连接vs非等值连接
SELECT e.`last_name`,e.`salary`,j.`grade_level`
FROM employees e,job_grades j
WHERE e.`salary` BETWEEN j.`lowest_sal`AND j.`highest_sal`;

#自连接
#练习:查询员工id,员工姓名及其管理者的id和姓名
SELECT t1.`employee_id`,t1.`last_name`,t2.`employee_id`,t2.`last_name`
FROM employees t1,employees t2
WHERE t1.`manager_id`=t2.`employee_id`;


#7.3内连接vs外连接(交集和并集)
#内连接:合并具有同一列的两个以上的表的行,结果集中不包含一个表与另一个表不匹配的行
SELECT employee_id,department_name
FROM employees,departments
WHERE employees.`department_id`=departments.`department_id`;
#外连接:合并具有同一列的两个以上的表的行,结果集中除了包含一个表与另1个表匹配的行之外,
#还查询到了左表或右表中不匹配的行。
#外连接的分类:左外连接、右外连接、满外连接
 
 #.SQL92语法实现外连接:使用+    MySQL不支持sQL92语法中外连接的写法!

#sQL.99语法中使用JOIN ...ON的方式实现多表的查询。
#SQL99语法实现内连接:
SELECT employee_id,department_name
FROM employees JOIN departments
ON employees.`department_id`=departments.`department_id`;

#sQL99语法实现外连接:
#左外连接:
SELECT employee_id,department_name
FROM employees LEFT JOIN departments
ON employees.`department_id`=departments.`department_id`;

#满外连接: mysql不支持FULL OUTER JOIN

UNION操作符

UNION操作符返回两个查询的结果集的并集,去除重复记录。

UNION ALL操作符

UNION ALL操作符返回两个查询的结果集的并集。对于两个结果集的重复部分,不去重。

#满外连接: mysql不支持FULL OUTER JOIN
#!!!!!只能有一个分号
SELECT employee_id,department_name
FROM employees LEFT JOIN departments
ON employees.`department_id`=departments.`department_id`
UNION ALL
SELECT employee_id,department_name
FROM employees RIGHT JOIN departments
ON employees.`department_id`=departments.`department_id`
WHERE employees.`employee_id` IS NULL;

6.1自然连接

sQL99在SQL92的基础上提供了一些特殊语法,比如NATURAL JOIN用来表示自然连接。我们可以把自然连接理解为SQL92中的等值连接。它会帮你自动查询两张连接表中所有相同的字段,然后进行等值连接。

USING指定了具体的相同的字段名称,你需要在USING的括号()中填入要指定的同名字段。


函数

日期和时间函数

#日期和时间函数
SELECT NOW(),UNIX_TIMESTAMP(),FROM_UNIXTIME(UNIX_TIMESTAMP())

SELECT NOW(),DAY(NOW()),SECOND(NOW()),EXTRACT(HOUR FROM NOW())

SELECT NOW(),DATE_ADD(NOW(),INTERVAL 1 YEAR)

#3.7日期的格式化与解析
#格式化: 日期--->字符串
#解析:   字符串---->日期

SELECT NOW(),DATE_FORMAT(CURDATE(),'%Y--%c--%e') ,STR_TO_DATE('2023--11--11','%Y--%c--%e'),DATE_FORMAT(CURDATE(),GET_FORMAT(DATE,'USA'))

4.流程控制函数

#4.流程控制函数
SELECT last_name,salary,IF(salary>=10000,'高工资','低工资') '工资',IFNULL(commission_pct,0) pct,
CASE 	WHEN salary>=15000 THEN '111'
	WHEN salary>=10000 THEN '222'
	WHEN salary>=5000 THEN '333'
	ELSE '000' END '资'
FROM employees

5.加密与解密的函数

#5.加密与解密的函数
SELECT MD5('sjhg'),SHA('sjhg')
posted @ 2023-12-08 14:29  新至所向  阅读(20)  评论(0)    收藏  举报