MySql的一些笔记
序言
开始
为啥重新学习?在过去很长一段时间里,我做 PHP 开发都是使用框架,这些框架在进行数据操作时非常方便,甚至不用自己写 SQL 语句,这使我忘了很多之前学习的 MySQL 数据库知识。
最近接到学校通知,开学有MySQL考试,所以我决定重学MySQL 避免一些不必要的麻烦
为什么要学习数据库?
- 实现数据持久化
- 数据结构化,易于查询和管理
- 数据的共享性高,冗余度低,易于扩充
- 由DBMS统一管理和控制,易于维护
数据库相关概念
1. DB
数据库( database ) : 储存数据的”仓库” ,它保存了一系列有组织的数据
2. DBMS
数据库管理系统( Database Management System ) 。数据库是通过DBMS创建和操作的容器
3. SQL
机构化查询语言( Structure Query Language ) : 专门用来与数据库通信的语言
- SQL的优点:
- 不是某个特点的数据库供应商专有的语言,几乎所有 DBMS 都支持SQL
- 简单易学
- 虽然简单,但实际上是一种强有力的语言,灵活使用语言元素,可以进行非常复杂和高级的数据库操作
# MySQL存储数据过程
概念
- 表头(header): 每一列的名称;
- 列(col): 具有相同数据类型的数据的集合;
- 行(row): 每一行用来描述某条记录的具体信息;
- 值(value): 行的具体信息, 每个值必须与该列的数据类型相同;
- 键(key): 键的值在当前列中具有唯一性。
过程
- 将数据放到表中,表在放到库中
- 一个数据库可以有多个表,每个表都有一个名字,用来标识自己,表名具有唯一性。
- 表具有一些特性,这些特性定义了数据在表中如何存储,类似 面向对象 中类的设计
- 表又列组成,我们也称为字段。 所有表都是由一个或者多个列组成,类似于面向对象中类的熟悉
- 表中的数据是按行存储的,每一行类似与面向对象中的对象
# MySQL介绍
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用户所以,以下来自百度经验:
-
首先找到MySQL 的安装路径,一直找到“bin”的路径下,如小编我的路径为:C:\Program Files\MySQL\MySQL Server 5.7\bin(这是个人的你的不一定和我一样)
-
首先Ctrl + E打开此电脑,然后点击左上角的“计算机”,然后点击“属性”
-
点击“高级系统设置”
](http://jingyan.baidu.com/album/4dc4084850e1ecc8d946f1f3.html?picindex=3)
-
打开“环境变量”
](http://jingyan.baidu.com/album/4dc4084850e1ecc8d946f1f3.html?picindex=4)
-
找到环境变量中的Path,然后对其编辑,将C:\Program Files\MySQL\MySQL Server 5.7\bin,这个路径加在变量值的开始处,然后在C:\Program Files\MySQL\MySQL Server 5.7\bin后要加个英文的分号
](http://jingyan.baidu.com/album/4dc4084850e1ecc8d946f1f3.html?picindex=6)
-
最后就是三个“确定”
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语法规范
- 不区分大小写,但是建议关键字大写,表明,字段名小写
- 每条命令用分号结尾
- 每条命令根据需要,可以进行缩进或换行
- 注释
- 单行注释:
# 注释内容 - 单行注释:
-- 注释内容 - 多行注释:
/*注释内容*/
- 单行注释:
基础查询
开始
- 语法
select 查询列表
- 特点
-
查询列表可以是:表中的字段,常量值,表达式,函数
-
查询的结果是一个虚拟的表格
查询字段
记得先打开数据库在进行查询
- 查询单个字段
使用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
- 逻辑运算符:
- 模糊查询
likebetween andinis 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: 查询员工名带’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
- 包含between and 可以提高语句简洁度
- 包含两个临界值
- 两个临界值不能调换顺序等价于
>= 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)
案例
-
查询员工号为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) -
查询没有奖金,且工资小于18000的salary ,last_name
SELECT salary, last_name FROM employees WHERE commission_pct IS NULL AND salary < 18000; -
查询job_id不为
IT或者工资为12000的员工信息SELECT * FROM employees WHERE job_id <> 'IT' OR salary = 12000 -
查询部门departments的表结构;
DESC departments; -
查询部门departments表中涉及到哪些位置编号
SELECT DISTINCT location_id FROM departments; -
经典面试题
-- 试问 select * from employees 和 select * from where commission_pct like "%%" and last_name "%%";结果是否一致请说明原因 -- 不一样!如果判断的字段有NULL值
复习
数据库相关概念
### 一、数据库好处
- 持久化数据到本地
- 结构化查询
二、数据库的常见概念
- DB:数据库
- DBMS:数据库管理系统,又称为数据库软件或数据库产品,用于创建或管理DB
- SQL:结构化查询语言
三、数据库存储数据的特点
- 数据存放到表中,然后表被放到库中
- 一个库中可以有多张表, 每张表具有唯一的表名用来标识自己
- 表中的有一个或者多个列,又称为
字段 - 表中的每一行数据,相当于对象
四、常见的数据库管理系统
- MySQL
- Oracle
- db2
- sqlserver
评论
还没有评论,来说第一句吧。











