《MySQL必知必会》之基本使用
一、使用MYSQL
- 展示所有数据库
show databases;
- 选择数据库
use crashcourse;
- 展示该数据库中所有的表
show tables;
- 还可以展示表列的shema约束
show columns from customers;
快捷方式
describe customers;
- 其他show语句通过使用help shop命令来帮助使用
二、检索数据
本章讲述select、limit的基本使用
- 检索单个列
select prod_name from products;
注意:SQL语句和大小写
sql语句不区分大小写,但是一般将sql语句写为大写,列名、表名写为小写,这样易于阅读和调试
但注意,mysql4.1之前数据库名、表名、列名区分大小写,而mysql4.1后不再进行区分
- 检索多个列
select prod_id,prod_name,prod_price from products;
注意:多个列名直接通过逗号隔开
- 检索所有列
select * from products;
其中 * 为通配符,当不需要检索所有列时,不建议使用 * 取获取所有列,因为会降低性能
- 检索不同的行
SELECT DISTINCT vend_id from products;
使用DISTINCT关键字,返回的数据中则是不同的值,帮助我们为数据去重。
注意:DISTINCT作用于所有列,而不仅是前置它的列
- 限制结果
SELECT prod_name FROM products LIMIT 5;
使用limit显示返回的数据,可以作用于分页查询
其中limit的参数 5 表示返回的数据不多于 5 行
SELECT prod_name FROM products LIMIT 5,5;
其中参数 5,5 表示返回从第六行开始的5行数据
因此,带一个值的limit都是从第一行开始,带两个值的limit都是从指定行号开始
注意:行0
检索出来的第一行为行0而不是行1,因此limit 1,1表示检索出第二行的一条数据
当然,上述参数理解有些困难的话,还可以使用以下sql
SELECT prod_name FROM products LIMIT 5 OFFSET 5
表示从第六行(行5)开始的5行数据
- 使用完全限定的表名
select products.prod_name from products;
这种完全限定的表示方式其实是用于多表联查时的重复列名做区分的
三、排序检索数据
本章讲述order by的基本用法
- 排序数据
select prod_name from products order by prod_name;
表示对 prod_name列 以字母顺序排列
- 按多个列排序
select prod_id,prod_price,prod_name
from products
order by prod_price,pord_name;
表示先对prod_price进行排序,当prod_price具有相同的prod_name时,再对prod_name进行排序
- 指定排序方向
select prod_id,prod_price,prod_name
from products
order by prod_price desc;
order by的排序方式模式是以升序排列的,通过desc指定降序排列
select prod_id,prod_price,prod_name
from products
order by prod_price desc,prod_name;
表示按照产品价格降序排列,当价格相同时对产品名字进行默认的升序排列
- 排序的规则
A与a相同吗?a位于B之前还是位于Z之后?这并不其ASCII排列有关,而是与数据库的排序规则有关
在MySQL的默认行为中,其字典(dictionary)排序顺序认为 A 与 a 相同,当然也可以根据需要去更改
- 通过排序返回最值
select prod_price
from products
order by prod_price desc
limit 1
通过order by 与 limit 的组合返回最大值与最小值
四、过滤数据
本章讲述where的基本使用
- 使用WHERE子句
select prod_name,prod_price
from products
where prod_price=2.50;
结果只返回产品价格为2.50的数据
注意:
我们更建议使用这种服务器层的过滤,而不是将所有数据都搜索出来给了应用层让java代码去实现过滤,这样会提高性能
where应该位于order by语句之前
- where子句操作符
where的过滤条件不仅仅是 = ,还可以使用 <>、!=、<、<=、>、>=、BETWEEN ... AND...等等
select prod_name,prod_price
from products
where prod_price between 5 and 10;
- 空值查询
select cust_id
from customers
where cust_email is null;
通过 is null 来将返回未填写email的所有用户的id
五、数据过滤
本章讲述where的高级用法和NOT、IN操作符
组合where子句
- AND操作符
select prod_id,prod_price,prod_name
from products
where vend_id = 1003 and prod_price <=10;
- OR操作符
select prod_id,prod_price,prod_name
from products
where vend_id = 1002 or vend_id = 1003;
注意:两个操作符的计算次序
需求:返回10美金以上且有1002或者1003制造的所有产品
select prod_id,prod_price,prod_name
from products
where vend_id = 1002 or vend_id = 1003 and prod_price >=10;
这条sql并不能满足需求!会先进行and操作,再进行or操作
select prod_id,prod_price,prod_name
from products
where (vend_id = 1002 or vend_id = 1003) and prod_price >=10;
将or操作加上括号即可
- IN操作符
select prod_id,prod_price,prod_name
from products
where vend_id in (1002,1003);
结果相当于底下的or查询
select prod_id,prod_price,prod_name
from products
where vend_id = 1002 or vend_id = 1003
注意:in操作符比or操作符执行更快
- NOT操作符
select prod_id,prod_price,prod_name
from products
where vend_id not in (1002,1003);
同样的,not操作符也可以对 between、exists取反