文章目录
- 基本概念
- 基本操作语句
- SHOW 语句
- SELECT 基本检索语句
- SELECT FROM ... ORDER BY 排序检索语句
- WHERE 过滤语句
- AND OR IN NOT 结合 WHERE 多级过滤语句
基本概念
数据库 database:保存有组织的(结构化的)数据的容器(通常是一个文件或者一组文件)
- 数据库系统 database management system:用来访问数据库的管理系统,缩写(DBMS) ;最具有代表性的 DBMS 是 MYSQL
- 表 table:某种特定类型数据的结构化清单;同一个数据库中的表应该具有唯一的名字(唯一性),不同的数据库中可以出现相同的表名
- 模式 schema:数据库和表的布局及特性信息
- 列 column:表中的一个字段,一个表是有一个或者多个列组成的
- 行 row:表中的数据按行存储,一行也可以叫做一个记录
- 主键 primary key:主键也是以一列(或一组列)的形式存在,它能够唯一区分表中的每个行;通过索引主键,可以得到表中任意的一行
- 表中的任何列都可以作为主键,只要满足下列的条件:
1)任意两行不具有相同的主键值(唯一性)
2)每个行都必须有一个主键值(主键列不允许存在NULL 值) - 当多个列组合起来作为主键列的时候,主键列中的单个列的值可以不唯一,但是所有列值的组合必须是唯一存在的
- 数据库语言:SQL(sequel) 不是某个 DBMS 的专利语言,而是通用于几乎所有的数据库管理系统;但是不同的数据库管理系统使用的 SQL 的语法规定略微不同,但大同小异,具有移植性,但不完全一样;我们主要学习 MySQL
- DBMS 主要分两种:
1)基于共享文件系统的 DBMS
2)基于客户机-服务器的 DBMS
基本操作语句
注意每句话后面要加分号
SHOW 语句
- 展示数据库:
SHOW DATABASES;
- 选用数据库:
USE sakila;
- 展示数据库中的所有表:
SHOW TABLES
- 选择其中名为 actor 的表并展示所有列的信息:
SHOW COLUMNS FROM actor
;这种方法可以直接被以下语句替代:DESCRIBE actor
得到的也是相同的信息
但是通过这种方式只能获得所有列的名字,而不能获得所有列中的具体内容
SELECT 基本检索语句
- 展示一个表中所有列的具体内容:
SELECT * FROM actor;
- 限定选定的行的个数:
SELECT * FROM actor LIMIT 5;
选择前五行(1~5行,sql 规定第一行的索引是 1 不是 0) - 选定从任意一行开始的任意长度的行:
SELECT * FROM actor LIMIT 5,5;
(6~10 行,即从第5 行开始(但不包括第五行)往后的 5 行) - 检索单个列:
SELECT first_name FROM actor
- 检索多个列:
SELECT first_name, last_name FROM actor
- 完全限定的写法:
SELECT actor.first_name FROM sakila.actor
直接通过关键字和 . 把数据库名称、表名称、列名称全部建立关系,从而实现对列的检索;当然也可以用这种方式来索引多个列:SELECT actor.first_name, actor.last_name FROM sakila.actor
中间用逗号连接即可
SELECT FROM … ORDER BY 排序检索语句
- 按照某一列进行排序检索:
SELECT * FROM actor ORDER BY first_name;
- 按照多列进行排序检索:
SELECT * FROM actor ORDER BY first_name,last_name;
先按照第一个列进行排列,如果这样排列时有相同值的项,则按照第二个列的标准进行排列 - 按照某一列进行逆序排列:
SELECT * FROM actor ORDER BY first_name DESC;
- 首先按照某一列的逆序排列,重复的部分按照另外一列的方式进行排列:
SELECT * FROM actor ORDER BY first_name DESC, last_name;
- 按照多个列的逆序进行排列:
SELECT * FROM actor ORDER BY first_name DESC, last_name DESC;
每一个逆序的列都要在后面加DESC
- 结合 limit 和 order by 来选出最大的数值对应的行:
use sakila; select * from payment order by amount desc, staff_id limit 1;
-
payment
是 sakila 里的表名 -
amount
是 payment 中的一列,staff_id 是另外一列 -
limit 1
选出符合条件的第一个行 - 以上的指令还可以更加简化为:
select * from sakila.payment order by amount desc, staff_id limit 1;
,直接通过 sakila.payment 把 sakila 数据库选项也加载到指令中
- order by 子句必须处于 from 之后,limit 必须处于 order by 之后
WHERE 过滤语句
在这组例子中,我们使用 payment 这个表,这个表来自于 sakila 数据库。这个表的整体结构如下:
select * from sakila.payment;
- 通过 amount 来抽取指定的两列数据中 amount > 10 的条目:
select payment_id, amount from sakila.payment where amount >10 ;
- 通过 amount 来抽取指定的两列数据中 amount > 10 的条目,并把这些条目按照 payment 的降序进行排列:
select payment_id, amount from sakila.payment where amount>10 order by payment_id desc;
- where 子句的使用放在 order by 之前
- where 子句的操作符:
=, >, <>, !=, <, <=, >=, between
- where 子句操作符实例演练:
select payment_id, amount from sakila.payment where amount < 10;
select payment_id, amount from sakila.payment where amount != 10;
select payment_id, amount from sakila.payment where amount between 5 and 10;
select payment_id, amount from sakila.payment where amount >= 10;
- where 子句的 is null 判断:
select payment_id, amount from sakila.payment where amount is not null;
select payment_id, amount from sakila.payment where amount is null;
结果表明在这个表中,不存在 null 的值,因此,返回结果为空
AND OR IN NOT 结合 WHERE 多级过滤语句
- 多个 where 条件的筛选:
select payment_id, amount from sakila.payment where amount < 10 and payment_id between 100 and 120;
- 通过括号来约束多个 and 和 or 同时出现的过滤条件:
select payment_id, amount from sakila.payment where (amount =0.99 or amount = 6.99) and (payment_id between 100 and 120);
- 当条件中出现了多个 and 和 or 的时候,这个时候按照自己的意思通过 () 进行约束是非常有必要的,避免歧义的。
- 使用 in 来代替多个 or 的过滤情况:
select payment_id, amount from sakila.payment where amount in (0.99,6.99) and (payment_id between 100 and 120);
- 通过 in 语句,可以起到 or 的效果,而且往往更容易理解和直观
NOT
语句可以与IS, BETWEEN, EXIST
子句联合在一起进行取反