首页 🧐痛みの开端

MySQL

保存数据的容器:数组 集合 文件 ...

数组 、 集合 存入内存 具有易失性,如果要让数据永久存储,就不适用了;文件倒是可以永久储存,但不便统一管理、查询

数据库相关概念

DB(database)

存储数据的“仓库” , 保存了一系列有组织的数据

DBMS(database management system)

数据库管理系统 , 数据库是通过DBMS创建和操作的容器,以达到对数据的增删改查

SQL(structure query language)

结构化查询语言 , 专门用来与数据库通信的语言 ,DBMS普遍使用

数据库的特点

  • 将数据放到表中 ,表再放到库中
  • 一个数据库中可以有多张表 ,每个表都有一个名字 ,用来标识自己 , 表名具有唯一性
  • 表具有一些特性 , 这个特性定义了数据在表中如何存储 , 类似于Java中“类”的设计
  • 表由列组成 , 我们也称为字段 , 所有表都是由一个或多个列组成 , 每一列类似于Java中的”属性“
  • 表中的数据是按行存储的 , 每一行类似于Java中的”对象“

关于DBMS

DBMS分为两类

  • 基于共享文件系统的DBMS(Access)
  • 基于C/S的(MySQL、Oracle、SQL server)

MySQL配置中的问题

Windows中安装目录下的my.ini

image-20210618163835329

往后可以自行改动端口号、data路径...

net start MySQLnew

net stop MySQLnew

如何进入MySQL服务端

1.可以使用MySQL自带的MySQL command line client进入

这一种只限于root用户

2.也可以通过windows自带的客户端登录

mysql [-h(host) localhost -P(port) 3306]-u root -p270010

也可以让密码不显示 mysql -u root -p

退出:exit 或者 ctrl+c

常见命令

查看数据库

show databases;

发现4个库

其中只有test库可以改动,用来测试

查看某库里的表

use test;

进一个库看看里面有什么表,可以看到现在是空的

如果现在想看看其它库里的表

比如说可以

use mysql;

show tables;

也可以

show tables from mysql;不过这样你还在原来的库中,不信你可以使用select database(); 来查看自己所在的位置

创建表

create table fygod(

id int,

name varchar (20));

查看表的结构

desc fygod;

Field属性 ,n个字段 , 一个是id,一个是name ,对应的类型...

查看表中的数据

select * from fygod;

插入数据

INSERT INTO fygod (id,name) values(1,'fy');

修改数据

update fygod set name='ly' where id=1;

删除数据

delete from fygod where id=1;

查看MySQL版本

调用version()函数

或者切出MySQLmysql --version or mysql -V查看版本

MySQL的语法规范

  • 不区分大小写
  • 每条命令分号结尾
  • 每条命令根据需要,可以缩进、换行
  • 注释

    • 单行注释: #注释文字
    • 多行注释:-- 注释文字
    • 多行注释:/* 注释文字 */

DQL语言(data query language)

基础查询

使用方法

语法:
select 查询列表 from 表名;
类似于:System.out.println(打印东西);
特点:
1.查询列表可以是:表中的字段、常量值、表达式、函数
2.查询的结果是一个虚拟的表格

  • 如何查询表中的单个字段
    SELECT last_name FROM employees;
  • 查询表中的多个字段
    SELECT last_name,salary,email FROM employees;
  • 查询表中所有字段
    SELECT * FROM employees;

SELECT first_name,last_name,email,... FROM employees;

  • 查询常量值

SELECT 100;
SELECT 'john';

  • 查询表达式

SELECT 100%98;

  • 查询函数

SELECT VERSION();

  • 起别名

    • 便于理解
    • 如果查询的字段有重名的情况,使用别名可以区分

SELECT 100*98 AS consequence;

SELECT last_name AS 姓,first_name AS 名 FROM employees;

SELECT last_name 姓,first_name 名 FROM employees;

如果别名出现特殊字符,需要用引号括起来

  • 去重

SELECT DISTINCT department_id FROM employees;

  • '+' 的作用

实例:
查询员工名和姓为一个字段 ,并且显示姓名
错误的尝试:
SELECT last_name+first_name AS 姓名 FROM employees;
没报错但是也和我们的预期不符 , 一定是'+'出了问题
JAVA中的'+':

  • 运算符,两个数都得为数值型
  • 连接符,只要有一个操作数为字符串

MySQL中的'+':
仅仅有一个功能 运算符
SELECT 100+90; 两个操作数都为数值型,则做加法运算

其中一方为字符型,试图将字符型数值转化为数值型

SELECT '123'+90;如果转化成功,继续做加法运算
SELECT 'john'+90; 如果转化失败,则将字符型数值转化为0,再做加法运算

查询员工名和姓为一个字段,并且显示姓名

这个问题还没解决,如何拼接?使用CONCAT !

SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees;

小练习

<u>显示出表employees的1、2、6、7列,各个列之间用','隔开,列头显示成out_put</u>

SELECT 
    CONCAT(`first_name`,',',`last_name`,',',salary*12,',',`commission_pct`) AS out_put
FROM 
    employees;

out_put栏却都显示NULL

这是因为有很多人的commission_pct奖金率为0 , 导致整项都为NULL

我们可以使用IFNULL来优化

SELECT 
    CONCAT(`first_name`,',',`last_name`,',',salary*12,',',IFNULL(commission_pct,0)) AS out_put
FROM 
    employees;

条件查询

使用方法

语法:

/*
注意:
其实的查询顺序是先查找对的表,再确定哪一行,最后确定哪一列
*/
SELECT
    3.查询列表;
FROM 
    1.表名; 
WHERE 
    2.筛选条件;

按照条件表达式筛选

  • 查询工资>12000的员工信息

SELECT * FROM employees WHERE salary>12000;

  • 查询部门编号不等于90的员工名和部门

    SELECT 
    CONCAT(`last_name`,`first_name`),`department_id` 
    FROM 
    employees 
    WHERE 
    department_id!=90;

按照逻辑表达式筛选

查询工资在1w-2w之间的员工名、工资、奖金

SELECT 
    CONCAT(`last_name`,`first_name`),`salary`,IFNULL(`commission_pct`,0) 
FROM 
    employees 
WHERE 
    salary<=20000 && salary>=10000;

模糊查询

通配符:

% 任意多个字符

_ 任意单个字符

四种方式:

like

between and

in

is null

1.查询员工名中包含字符a的员工信息

SELECT 
    * 
FROM 
    employees 
WHERE 
    CONCAT(`last_name`,`first_name`) LIKE '%a%';

2.查询员工中第三个字符为e,第五个字符为a的员工名和工资

SELECT 
    CONCAT(`last_name`,`first_name`),`salary` 
FROM 
    employees 
WHERE 
    CONCAT(`last_name`,`first_name`) LIKE '__n_l%';

3.查询员工名中第二个字符为_的员工名

SELECT 
    CONCAT(`last_name`,`first_name`)
FROM    
    employees
WHERE 
    CONCAT(`last_name`,`first_name`) LIKE '_\_%';

这里需要一个转义字符以和通配符_区分

我们也可以任意指定一个字符为转义字符

CONCAT(`last_name`,`first_name`) LIKE '_$_%' ESCAPE '$';

4.查询员工编号在100到120之间的员工信息

SELECT 
    * 
FROM 
    employees 
WHERE 
    `employee_id` BETWEEN 100 AND 120;

5.查询员工的公众编号是IT_PROGAD_VPAD_PRES中的一个员工名和工种编号

注意:IN 不支持通配符

SELECT 
    CONCAT(`last_name`,`first_name`),`job_id`
FROM 
    employees
WHERE 
    `job_id` IN ('IT_PROG','AD_VP','AD_PRES');

6.查询没有奖金的员工名和奖金率

注意:=<>不能用于判断NULL

IS NULLIS NOT NULL

SELECT 
    CONCAT(`last_name`,`first_name`),`commission_pct`
FROM 
    employees
WHERE 
    `commission_pct` IS NULL;

7.安全等于 <=>

既可以判断NULL值,又可以判断普通数值

小练习

  • <u>查询所有员工的年薪和部门号</u>
SELECT 
    CONCAT(`last_name`,`first_name`),salary*12*(1+IFNULL(commission_pct,0)),`department_id`
FROM 
    employees;
  • <u>查询没有奖金、其工资小于18000的员工名和salary</u>
SELECT  
    CONCAT(`last_name`,`first_name`),`salary`
FROM 
    employees
WHERE 
    `commission_pct` IS NULL && `salary`<18000;
  • <u>查询员工表中,job_id不为'IT'或者工资为12000的员工信息</u>
SELECT  
    *
FROM 
    employees
WHERE 
    `job_id` <> 'IT' || `salary`='12000';
  • <u>查询部门表中涉及到哪些位置编号</u>
SELECT 
    DISTINCT `location_id`
FROM    
    departments;

试问:

select * from employees;

select * from employees where commission_pct like '%%' and CONCAT(`last_name`,`first_name`) like '%%';

结果是否一样?

不一样,由于逻辑连接符为AND,所以只有满足奖金率和名字都为'%%'方可记录,而奖金率有一部分值为NULL

排序查询

使用方法

小练习

常见函数

分组函数

分组查询

连接查询

子查询

分页查询

union联合查询

DML语言(data manipulation language)

插入语句

修改语句

删除语句

DDL语言(data define language)

库和表的管理

常见的数据类型介绍

常见约束

TCL语言(transaction control language)

事务和事务处理




扫描二维码,在手机阅读!
文章评论

目录