← 返回

MySql的一些笔记

序言

开始

为啥重新学习?在过去很长一段时间里,我做 PHP 开发都是使用框架,这些框架在进行数据操作时非常方便,甚至不用自己写 SQL 语句,这使我忘了很多之前学习的 MySQL 数据库知识。

最近接到学校通知,开学有MySQL考试,所以我决定重学MySQL 避免一些不必要的麻烦

为什么要学习数据库?

  1. 实现数据持久化
  2. 数据结构化,易于查询和管理
  3. 数据的共享性高,冗余度低,易于扩充
  4. 由DBMS统一管理和控制,易于维护

数据库相关概念

1. DB

数据库( database ) : 储存数据的”仓库” ,它保存了一系列有组织的数据

2. DBMS

数据库管理系统( Database Management System ) 。数据库是通过DBMS创建和操作的容器

3. SQL

机构化查询语言( Structure Query Language ) : 专门用来与数据库通信的语言

  • SQL的优点:
    • 不是某个特点的数据库供应商专有的语言,几乎所有 DBMS 都支持SQL
    • 简单易学
    • 虽然简单,但实际上是一种强有力的语言,灵活使用语言元素,可以进行非常复杂和高级的数据库操作

# MySQL存储数据过程

概念

  • 表头(header): 每一列的名称;
  • 列(col): 具有相同数据类型的数据的集合;
  • 行(row): 每一行用来描述某条记录的具体信息;
  • 值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
  • 键(key): 键的值在当前列中具有唯一性。

过程

  1. 将数据放到表中,表在放到库中
  2. 一个数据库可以有多个表,每个表都有一个名字,用来标识自己,表名具有唯一性。
  3. 表具有一些特性,这些特性定义了数据在表中如何存储,类似 面向对象 中类的设计
  4. 表又列组成,我们也称为字段。 所有表都是由一个或者多个列组成,类似于面向对象中类的熟悉
  5. 表中的数据是按行存储的,每一行类似与面向对象中的对象

# MySQL介绍

img

MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

  • MySQL 是开源的,所以你不需要支付额外的费用。
  • MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
  • MySQL 使用标准的 SQL 数据语言形式。
  • MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
  • MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。
  • MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
  • MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。

MySQL 安装

  • DBMS分为两类

    • 基于共享文件系统的DBMS (Access)
    • 基于客户机——服务器的DBMS (MySQL Oracle SQLServer)
  • MySQL安装(linux)

    • archlinux

      $ sudo pacman -S mysql # 下载
      
      $ sudo mysqld --initialize --user=mysql --basedir=/usr --datadir=/var/lib/mysql # 初始化
      
      $ sudo systemctl start mysqld # 启动
      $ sudo systemctl enable mysqld # 开机启动
      
      # 修改密码
      $ mysql -uroot -p 
      
      mysql> use mysql;
      mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
      mysql> FLUSH PRIVILEGES;
      
  • MySQL安装(windows)

    • 自求多福

MySQL 配置文件介绍

你可以在/etc/mysql/my.cnf路径下找到这个文件并进行一些配置

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.

[mysqld]

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M 

datadir=/var/lib/mysql
socket=/run/mysqld/mysqld.sock

default-authentication-plugin=mysql_native_password

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

如果你修改了配置文件它不会立刻生效必须重启MySQL服务

$ sudo systemctl restart mysqld.service

MySQL 启动停止&登录退出

启动停止

你可以通过系统的服务管理命令启动停止这里演示 Linux & Windows系统

  • Linux(Manjaro)
$ sudo systemctl start mysqld # 启动
$ sudo systemctl stop  mysqld # 停止
  • Windows(管理员权限)
net start mysqld ::启动
net stop  mysqld ::停止

## 登录退出

  • 登录
#格式 mysql -h 主机 -u 用户名 -P [端口] -p 密码

$ mysql -h localhost -P 3306 -u root -p admin
# 简写
$ mysql -uroot -padmin
  • 退出
mysql> exit 
# 或者
mysql> quit

环境变量

如果你是Windows用户在执行以上操作的时候显示命令不存在的话,你就需要配置你的系统环境变量

我并不是Windows用户所以,以下来自百度经验:

  1. 首先找到MySQL 的安装路径,一直找到“bin”的路径下,如小编我的路径为:C:\Program Files\MySQL\MySQL Server 5.7\bin(这是个人的你的不一定和我一样)

    win10 下MySQL 环境变量设置

  2. 首先Ctrl + E打开此电脑,然后点击左上角的“计算机”,然后点击“属性”

    win10 下MySQL 环境变量设置

  3. 点击“高级系统设置”

    [win10 下MySQL 环境变量设置

    ](http://jingyan.baidu.com/album/4dc4084850e1ecc8d946f1f3.html?picindex=3)

  4. 打开“环境变量”

[win10 下MySQL 环境变量设置

](http://jingyan.baidu.com/album/4dc4084850e1ecc8d946f1f3.html?picindex=4)

  1. 找到环境变量中的Path,然后对其编辑,将C:\Program Files\MySQL\MySQL Server 5.7\bin,这个路径加在变量值的开始处,然后在C:\Program Files\MySQL\MySQL Server 5.7\bin后要加个英文的分号

    win10 下MySQL 环境变量设置

    [win10 下MySQL 环境变量设置

    ](http://jingyan.baidu.com/album/4dc4084850e1ecc8d946f1f3.html?picindex=6)

  2. 最后就是三个“确定”

win10 下MySQL 环境变量设置

win10 下MySQL 环境变量设置

win10 下MySQL 环境变量设置

  1. 然后win+ r 打开“运行”,然后输入CMD 打开命令提示符

    win10 下MySQL 环境变量设置

  2. 然后在命令提示符中输入mysql -V(V是大写的),出现版本信息说明已经配置好了

win10 下MySQL 环境变量设置

MySQL 配置文件介绍

你可以在/etc/mysql/my.cnf路径下找到这个文件并进行一些配置

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL.

[mysqld]

# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M

# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin

# These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = .....

# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M 

datadir=/var/lib/mysql
socket=/run/mysqld/mysqld.sock

default-authentication-plugin=mysql_native_password

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

如果你修改了配置文件它不会立刻生效必须重启MySQL服务

$ sudo systemctl restart mysqld.service

# MySQL 常用命令

此章很重要

学习

  • 查看MySQL版本

使用命令行

$ mysql --version

使用语句

mysql> select version();
  • 查看所有数据库

查看你所有的数据库使用语句 SHOW DATABASE

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| admin              |
| auth               |
| blog_test          |
| cms                |
| demo_db            |
| django             |
| exam               |
| information_schema |
| la_blog            |
| mall               |
| my_db              |
| mysql              |
| performance_schema |
| photos             |
| request_data       |
| sign               |
| sys                |
| think_auth         |
| thinkphp           |
| tp_blog            |
| typecho            |
| v3                 |
| video              |
+--------------------+
23 rows in set (0.00 sec)

  • 创建数据库

使用CREATE DATABASE 数据库名创建数据库

mysql> create database note;
Query OK, 1 row affected (0.00 sec)

  • 选择数据库

使用use 数据库名打开一个数据库

mysql> use my_db
Database changed

  • 查看当前打开数据库

查看当前打开的数据库使用select database();

mysql> select database();
+------------+
| database() |
+------------+
| my_db      |
+------------+
1 row in set (0.00 sec)

  • 创建表

语法:

CREATE TABLE table_name (column_name column_type);

例:

create table stuinfo  (
    id int,
    name varchar(20));

  • 查看所有的表

使用show tables查看当前数据库里所有的表

mysql> show tables;
+----------------+
| Tables_in_note |
+----------------+
| stuinfo        |
+----------------+
1 row in set (0.00 sec)

  • 查看表结构

使用desc 表名查看表的结构

mysql> desc stuinfo;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)

  • 查看表数据

使用select * from 表名查看此表的数据

mysql> select * from stuinfo;
Empty set (0.00 sec)

可是当前表并没有数据


  • 插入表数据

使用insert into 表名 (xx)往表里插入数据

mysql>  insert into stuinfo (id, name) value (1,'muxi_k');
Query OK, 1 row affected (0.02 sec)

再来查看

mysql> select * from stuinfo;
+------+--------+
| id   | name   |
+------+--------+
|    1 | muxi_k |
+------+--------+
1 row in set (0.00 sec)

## 总结

 -- 查看版本
 select version();
 -- 查看所有数据库
 show database;
 -- 创建数据库
 create database 数据库库名;
 -- 打开数据库
 use 库名;
 -- 查看当前打开数据库
 select database();
 -- 创建表
 create table 表名  (
    字段名 类型,
    字段名 类型(长度));
-- 查看所有的表
show tables
-- 查看表结构
desc 表名;
-- 查看表数据
select * from 表名;
-- 插入表数据
insert into 表名 (字段名) value (值);

MySQL语法规范

  1. 不区分大小写,但是建议关键字大写,表明,字段名小写
  2. 每条命令用分号结尾
  3. 每条命令根据需要,可以进行缩进或换行
  4. 注释
    • 单行注释: # 注释内容
    • 单行注释: -- 注释内容
    • 多行注释: /*注释内容*/

基础查询

开始

  • 语法
select 查询列表
  • 特点
  1. 查询列表可以是:表中的字段,常量值,表达式,函数

  2. 查询的结果是一个虚拟的表格

    查询字段

记得先打开数据库在进行查询

  • 查询单个字段

使用SELECT 字段名 FROM 表名查询

mysql> SELECT `job_id` FROM jobs;
+------------+
| job_id     |
+------------+
| AC_ACCOUNT |
| AC_MGR     |
| AD_ASST    |
| AD_PRES    |
| AD_VP      |
| FI_ACCOUNT |
| FI_MGR     |
| HR_REP     |
| IT_PROG    |
| MK_MAN     |
| MK_REP     |
| PR_REP     |
| PU_CLERK   |
| PU_MAN     |
| SA_MAN     |
| SA_REP     |
| SH_CLERK   |
| ST_CLERK   |
| ST_MAN     |
+------------+
19 rows in set (0.00 sec)
  • 查询表中的多个字段

使用SELECT 字段名,字段名 FROM 表名查询

mysql> SELECT `last_name`,`salary`,`email` FROM  employees;
+-------------+----------+----------+
| last_name   | salary   | email    |
+-------------+----------+----------+
| K_ing       | 24000.00 | SKING    |
| Kochhar     | 17000.00 | NKOCHHAR |
| De Haan     | 17000.00 | LDEHAAN  |
| Hunold      |  9000.00 | AHUNOLD  |
| Lorentz     |  4200.00 | DLORENTZ |
| Greenberg   | 12000.00 | NGREENBE |
| Faviet      |  9000.00 | DFAVIET  |
| Chen        |  8200.00 | JCHEN    |
| Sciarra     |  7700.00 | ISCIARRA |
| Urman       |  7800.00 | JMURMAN  |
| Gietz       |  8300.00 | WGIETZ   |
+-------------+----------+----------+
... rows in set (0.00 sec)
  • 查询表中所有字段

使用SELECT * FROM 表名查询

-- * 代表所有
mysql> SELECT * FROM jobs;
+------------+---------------------------------+------------+------------+
| job_id     | job_title                       | min_salary | max_salary |
+------------+---------------------------------+------------+------------+
| AC_ACCOUNT | Public Accountant               |       4200 |       9000 |
| AC_MGR     | Accounting Manager              |       8200 |      16000 |
| AD_ASST    | Administration Assistant        |       3000 |       6000 |
| AD_PRES    | President                       |      20000 |      40000 |
| AD_VP      | Administration Vice President   |      15000 |      30000 |
| FI_ACCOUNT | Accountant                      |       4200 |       9000 |
| FI_MGR     | Finance Manager                 |       8200 |      16000 |
| HR_REP     | Human Resources Representative  |       4000 |       9000 |
| IT_PROG    | Programmer                      |       4000 |      10000 |
| MK_MAN     | Marketing Manager               |       9000 |      15000 |
| MK_REP     | Marketing Representative        |       4000 |       9000 |
| PR_REP     | Public Relations Representative |       4500 |      10500 |
| PU_CLERK   | Purchasing Clerk                |       2500 |       5500 |
| PU_MAN     | Purchasing Manager              |       8000 |      15000 |
| SA_MAN     | Sales Manager                   |      10000 |      20000 |
| SA_REP     | Sales Representative            |       6000 |      12000 |
| SH_CLERK   | Shipping Clerk                  |       2500 |       5500 |
| ST_CLERK   | Stock Clerk                     |       2000 |       5000 |
| ST_MAN     | Stock Manager                   |       5500 |       8500 |
+------------+---------------------------------+------------+------------+
19 rows in set (0.00 sec)

查询 常量/表达式/函数

  • 查询常量
mysql> select 'joy';
+-----+
| joy |
+-----+
| joy |
+-----+
1 row in set (0.01 sec)

mysql> select 100;
+-----+
| 100 |
+-----+
| 100 |
+-----+
1 row in set (0.00 sec)
  • 查询表达式
SELECT 100%99;
  • 查询函数
SELECT VERESION();

起别名

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

### 方式1

使用AS关键字

mysql> SELECT 100 / 10 AS 结果;
+---------+
| 结果     |
+---------+
| 10.0000 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT email AS 邮箱  FROM employees ;
+----------+
| 邮箱      |
+----------+
| SKING    |
| NKOCHHAR |
| LDEHAAN  |
| AHUNOLD  |
| HBAER    |
| SHIGGINS |
| WGIETZ   |
+----------+
107 rows in set (0.00 sec)

方式2

使用空格直接写

mysql> SELECT email 邮箱  FROM employees ;   
+----------+
| 邮箱      |
+----------+
| SKING    |
| NKOCHHAR |
| LDEHAAN  |
| AHUNOLD  |
| BERNST   |
| DAUSTIN  |
| VPATABAL |
| SHIGGINS |
| WGIETZ   |
+----------+
107 rows in set (0.01 sec)

### 案例

查询 salary 显示结果为 out put

SELECT salary as "out put" FROM employess;
mysql> SELECT salary as "out put" FROM employees;
+----------+
| out put  |
+----------+
| 24000.00 |
| 17000.00 |
| 12000.00 |
|  9000.00 |
|  8200.00 |
|  8300.00 |
+----------+
107 rows in set (0.01 sec)

去重

案例:查询员工表中涉及到的所有的部门编号

SELECT department_id FROM employees;
mysql> SELECT department_id FROM employees;
+---------------+
| department_id |
+---------------+
|          NULL |
|            10 |
|            20 |
|            20 |
|            30 |
|            30 |
|            30 |
|            30 |
|            40 |
|            50 |
|            50 |
|            50 |
|            50 |
|            50 |
|            50 |
|            50 |
|            50 |
|            60 |
|            60 |
|            60 |
|            60 |
|            60 |
|            70 |
|            80 |
|            80 |
|            80 |
|            80 |
|            80 |
|            80 |
|            80 |
|            80 |
|            80 |
|            90 |
|            90 |
|            90 |
|           100 |
|           100 |
|           100 |
|           100 |
|           100 |
|           100 |
|           110 |
|           110 |
+---------------+
... rows in set (0.01 sec)
-- 使用DISTINCT关键字去重
mysql> SELECT DISTINCT department_id FROM employees;
+---------------+
| department_id |
+---------------+
|          NULL |
|            10 |
|            20 |
|            30 |
|            40 |
|            50 |
|            60 |
|            70 |
|            80 |
|            90 |
|           100 |
|           110 |
+---------------+
12 rows in set (0.00 sec)

补充

  • +号的作用

MySQL中的+号只有一个功能: 运算符,不具有拼接字符串的功能

SELECT 1+4; -- success 
SELECT '1'+1 -- success
SELECT 'a'+'b' -- warning

案例: 查询员工名和姓,并显示姓名

-- 使用CONCAT()函数拼接字符串
SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees; 


mysql> SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees; 
+------------------+
| 姓名             |
+------------------+
| K_ingSteven      |
| KochharNeena     |
| De HaanLex       |
| HunoldAlexander  |
| ErnstBruce       |
| OlsonTJ          |
| MallinJason      |
| RogersMichael    |
| GeeKi            |
| HigginsShelley   |
| GietzWilliam     |
+------------------+
107 rows in set (0.00 sec)

注意

NULL和任何拼接都为NULL

mysql> SELECT concat(job_id,commission_pct) AS out_put FROM employees;      
+------------+
| out_put    |
+------------+
| NULL       |
| NULL       |
| NULL       |
| NULL       |
| NULL       |
| NULL       |
| NULL       |
+------------+
107 rows in set (0.00 sec)

我们可以使用函数IFNULL判断是否为NULL

mysql> SELECT CONCAT(job_id,IFNULL(commission_pct,0)) AS out_put FROM employees;   
+----------------+
| out_put        |
+----------------+
| AD_VP0.00      |
| IT_PROG0.00    |
| IT_PROG0.00    |
| ST_CLERK0.00   |
| ST_CLERK0.00   |
| ST_CLERK0.00   |
| SA_MAN0.40     |
| SA_MAN0.30     |
| SA_REP0.20     |
| SA_REP0.20     |
| SA_REP0.15     |
| SA_REP0.10     |
| SH_CLERK0.00   |
| SH_CLERK0.00   |
| HR_REP0.00     |
| PR_REP0.00     |
| AC_MGR0.00     |
| AC_ACCOUNT0.00 |
+----------------+
107 rows in set (0.00 sec)

DQL条件查询

简介

  • 语法

    select
        查询列表
    from 
        表名
    where
        筛选条件
    
  • 分类

    • 按条件表达式筛选
      • 条件运算符: > < = != <> >= <=
    • 按逻辑表达式筛选
      • 逻辑运算符:
        • && and两个条件都为 true 则结果为 true 反之 false
        • || or只要有一个条件为 true 则结果为 true 反之 false
        • ! not如果连接的条件为 true 则结果为 false 反之 true
    • 模糊查询
      • like
      • between and
      • in
      • is null

条件运算符查询

  • 案例一、 查询工资大于12000

    mysql> SELECT last_name 姓, salary 工资 FROM employees WHERE salary > 12000;
    +-----------+----------+
    | 姓        | 工资     |
    +-----------+----------+
    | K_ing     | 24000.00 |
    | Kochhar   | 17000.00 |
    | De Haan   | 17000.00 |
    | Russell   | 14000.00 |
    | Partners  | 13500.00 |
    | Hartstein | 13000.00 |
    +-----------+----------+
    6 rows in set (0.00 sec)
    
  • 案例二、查询部门编号不等于90号的员工名和部门编号

    mysql> SELECT last_name, department_id FROM employees WHERE department_id <> 90;
    +-------------+---------------+
    | last_name   | department_id |
    +-------------+---------------+
    | Hunold      |            60 |
    | Ernst       |            60 |
    | Chen        |           100 |
    | Sciarra     |           100 |
    | Urman       |           100 |
    | Popp        |           100 |
    | Higgins     |           110 |
    | Gietz       |           110 |
    +-------------+---------------+
    103 rows in set (0.00 sec)
    

逻辑运算符

  • 案例一、 查询工资大于10000 小于12000的员工名
mysql> SELECT first_name FROM employees WHERE salary>=10000 AND salary <= 12000;
+------------+
| first_name |
+------------+
| Nancy      |
| Den        |
| Alberto    |
| Gerald     |
| Eleni      |
| Peter      |
| Janette    |
| Clara      |
| Lisa       |
| Harrison   |
| Ellen      |
| Hermann    |
| Shelley    |
+------------+
13 rows in set (0.00 sec)
  • 案例二、 查询部门编号在90到110之间或者工资 大于12000的员工名
mysql> select first_name from employees where department_id>=90 and department_id <= 110 or salary > 12000;
+-------------+
| first_name  |
+-------------+
| Steven      |
| Neena       |
| Lex         |
| Nancy       |
| Daniel      |
| John        |
| Ismael      |
| Jose Manuel |
| Luis        |
| John        |
| Karen       |
| Michael     |
| Shelley     |
| William     |
+-------------+
14 rows in set (0.00 sec)

模糊查询

1. like

特点:

  1. 一般配合通配符使用
    • 通配符 :
      • % 代表任意多个字符
      • _ 代表任意单个字符
  • 案例1: 查询员工名带’a’字符的员工名,不区分大小写

    mysql> SELECT last_name FROM employees WHERE last_name LIKE '%a%';
    +------------+
    | last_name  |
    +------------+
    | Kochhar    |
    | De Haan    |
    | Austin     |
    | Pataballa  |
    | Urman      |
    | Raphaely   |
    | Baida      |
    | Baer       |
    +------------+
    56 rows in set (0.01 sec)
    
  • 案例2:查询员工名第三个字符为n,地五个为l的员工名

    mysql> SELECT last_name FROM employees WHERE last_name LIKE '__n_l%';
    +-----------+
    | last_name |
    +-----------+
    | Hunold    |
    +-----------+
    1 row in set (0.00 sec)
    
  • 案例2:查询员工名第二个字符为_的员工名

    -- 用‘/’转义
    
    mysql> SELECT last_name FROM employees WHERE last_name LIKE '_\_%';
    +-----------+
    | last_name |
    +-----------+
    | K_ing     |
    | K_ing     |
    +-----------+
    2 rows in set (0.00 sec)
    
    -- 或者使用ESCAPE
    
    mysql> SELECT last_name FROM employees WHERE last_name LIKE '_$_%' ESCAPE '$';
    +-----------+
    | last_name |
    +-----------+
    | K_ing     |
    | K_ing     |
    +-----------+
    2 rows in set (0.00 sec)
    

翻译: Escape 转义 换码

2.between and

  1. 包含between and 可以提高语句简洁度
  2. 包含两个临界值
  3. 两个临界值不能调换顺序等价于 >= and <=
  • 案例 1: 查询员工编号在 100 到 120 之间的员工编号

    mysql> SELECT employee_id FROM employees WHERE employee_id BETWEEN 100 AND 120;
    +-------------+
    | employee_id |
    +-------------+
    |         100 |
    |         101 |
    |         102 |
    |         103 |
    |         104 |
    |         116 |
    |         117 |
    |         118 |
    |         119 |
    |         120 |
    +-------------+
    21 rows in set (0.00 sec)
    

翻译: between and在什么什么之间

3.in

in含义: 判断某个字段的值是否是否属于in列表的一项
特点:

1. in列表的类型必须统一 或兼容 `123` = 123
  • **案例1:查询员工的工种编号是IT_PROG AD_VP AD_PRES中的一个 的员工名和工种编号

4.is null

注意 : = 或 <> 不能判断NULL值

  • 案例:查询没有奖金的员工名和奖金率
-- IS NULL
mysql> SELECT last_name, commission_pct FROM employees WHERE commission_pct IS NULL; 
+-------------+----------------+
| last_name   | commission_pct |
+-------------+----------------+
| K_ing       |           NULL |
| Kochhar     |           NULL |
| De Haan     |           NULL |
| Hunold      |           NULL |
| Ernst       |           NULL |
| Baer        |           NULL |
| Higgins     |           NULL |
| Gietz       |           NULL |
+-------------+----------------+
72 rows in set (0.00 sec)
  • 案例:查询有奖金的员工名和奖金率
mysql> SELECT last_name, commission_pct FROM employees WHERE commission_pct IS NOT NULL;    
+------------+----------------+
| last_name  | commission_pct |
+------------+----------------+
| Russell    |           0.40 |
| Partners   |           0.30 |
| Errazuriz  |           0.30 |
| Hutton     |           0.25 |
| Taylor     |           0.20 |
| Livingston |           0.20 |
| Grant      |           0.15 |
| Johnson    |           0.10 |
+------------+----------------+
35 rows in set (0.00 sec)

安全等于<=>

  • 案例:查询没有奖金的员工名和奖金率
-- <=> 可以判断NULL值也可以判断普通值
mysql> SELECT last_name, commission_pct FROM employees WHERE commission_pct <=> NULL;      
+-------------+----------------+
| last_name   | commission_pct |
+-------------+----------------+
| K_ing       |           NULL |
| Kochhar     |           NULL |
| De Haan     |           NULL |
| Hunold      |           NULL |
| Ernst       |           NULL |
| Austin      |           NULL |
| Pataballa   |           NULL |
| Lorentz     |           NULL |
| Greenberg   |           NULL |
| Baer        |           NULL |
| Higgins     |           NULL |
| Gietz       |           NULL |
+-------------+----------------+
72 rows in set (0.00 sec)

案例

  1. 查询员工号为176的员工的姓名和部门号和年薪

    mysql> SELECT last_name,department_id,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees;
    +-------------+---------------+-----------+
    | last_name   | department_id | 年薪      |
    +-------------+---------------+-----------+
    | K_ing       |            90 | 288000.00 |
    | Kochhar     |            90 | 204000.00 |
    | De Haan     |            90 | 204000.00 |
    | Hunold      |            60 | 108000.00 |
    | Ernst       |            60 |  72000.00 |
    | Hartstein   |            20 | 156000.00 |
    | Fay         |            20 |  72000.00 |
    | Mavris      |            40 |  78000.00 |
    | Baer        |            70 | 120000.00 |
    | Higgins     |           110 | 144000.00 |
    | Gietz       |           110 |  99600.00 |
    +-------------+---------------+-----------+
    107 rows in set (0.00 sec)
    
  2. 查询没有奖金,且工资小于18000的salary ,last_name

    SELECT
    	salary,
    	last_name 
    FROM
    	employees 
    WHERE
    	commission_pct IS NULL 
    	AND salary < 18000;
    
  3. 查询job_id不为IT或者工资为12000的员工信息

    SELECT
    	* 
    FROM
    	employees 
    WHERE
    	job_id <> 'IT' 
    	OR salary = 12000
    
  4. 查询部门departments的表结构;

    DESC departments;
    
  5. 查询部门departments表中涉及到哪些位置编号

    SELECT DISTINCT
    	location_id 
    FROM
    	departments;
    
  6. 经典面试题

    -- 试问 select * from employees 和 select * from where commission_pct like "%%" and   last_name "%%";结果是否一致请说明原因
    -- 不一样!如果判断的字段有NULL值
    

复习

数据库相关概念

### 一、数据库好处

  1. 持久化数据到本地
  2. 结构化查询

二、数据库的常见概念

  1. DB:数据库
  2. DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
  3. SQL:结构化查询语言

三、数据库存储数据的特点

  1. 数据存放到表中,然后表被放到库中
  2. 一个库中可以有多张表, 每张表具有唯一的表名用来标识自己
  3. 表中的有一个或者多个列,又称为字段
  4. 表中的每一行数据,相当于对象

四、常见的数据库管理系统

  1. MySQL
  2. Oracle
  3. db2
  4. sqlserver
M

评论

还没有评论,来说第一句吧。

留下评论