分类:MySQL

MySQL必知必会(一)

和题目一样,通过《MySQL必知必会》这本书记录一下MySQL应该掌握的知识。

前提当然是你已经安装了MySQL,至于如何安装MySQL,网上也有很多,这里不做记录

1.使用MySQL
打开终端,输入:                                                               

mysql -u username -p

然后回车,输入相应的密码即可;

#显示当前所有的数据库
show databases;
#选择数据库,dataname就是你要选择的数据库名字
use dataname;
#显示当前数据库下的所有表
show tables;
#显示tablename这个表的列
show columns from tablename;
#显示tablename列的第二种方法(更加简洁)
describe tablename;

关于show语句还有很多,我们可以输入help show来显示允许使用的show的语句,同时,我们也可以使用 help  xxx 来显示所支持的xxx的相关语句。

上面几行命令简单的介绍了MySQL的基本操作;

2.检索数据

#检索单个列,表示从studnet表中查出名为id的列
select id from student;
#检索多个列,表示从student中查出名为id和name的列,多个字段用,隔开
select id,name from student;
#检索所有列,使用 * 表示返回表中所有的列
select * from student;
#去重,使用distinct可以只显示不同的id
select distinct id from student;
#限制结果,返回不多于5行的数据
select id from student limit 5;
#返回从行3开始的5行数据,第一个数字为开始位置,第二个数字为检索的行数
select id from student limit 3,5;

3.排序检索数据

#根据id排序查询出来的id
select id from student order by id;
#多个列排序,先按照id排序,如果id相同则按照name排序
select id,name from studnet order by id,name;
#指定排序顺序,asc 升序(默认)    desc 降序
select id from student order by id desc;
#使用order by 和 limit 组合可以找出最高或最低的数据
#查询年龄最大的学生的年龄
select age from student order by age desc limit 1;

4.过滤数据

where语句的使用;

#查询id为1的学生的年龄
select age from student where id = 1;

where语句常用的操作符

操作符 说明
= 等于
<> 不等于
!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
between 在指定的两个值之间

组合语句过滤:

#查询id为1和年龄小于20的所有学生的名字和年龄
select name,age from student where id = 1 and age < 20;
#查询id为1或者2的学生的姓名
select name from student where id =1 or id = 2;

where可以包含任意数目的and和or操作符,但是需要注意优先级,and的优先级高于or,但是一般推荐组合时使用()

#查询id为1和5的学生的年龄
select age from student where id in (1,5);
#查询除id为1、5的学生的年龄
select age from student where id not in (1,5);

用通配符进行过滤-like的用法

#查询名字以wjy开头的所有学生的信息
select * from student where name like 'wjy%';
#查询名字包含wjy的学生的信息
select * from student where name like '%wjy%';
#查询名字以w开头,y结尾的学生的信息
select * from student where name like 'w%y';
#查询名字为w_y,_代表一个字符
select * from student where name like 'w_y';

“_”“%”的区别就是:% 可以代表任意字符,_只可以匹配单个字符;

通配符的处理所花时间较长,不要过度使用。

5.函数

函数一般用在数据上的执行,给数据的转换和处理提供了方便。

常用的文本处理的函数:

函数 说明
Left() 返回串左边的字符
Length() 返回串的长度
Locate() 找出串的一个子串
Lower() 将串转为小写
LTrim() 去掉串左边的空格
Right() 返回串右边的字符
RTrim() 去掉串右边的空格
Soundex() 返回串的SOUNDEX值
SubString() 返回子串的字符
Upper()

将串转换为小写

当然还有时间处理的函数、数值处理的函数等等,这里不对这些介绍,接下来看看数据汇总的一些函数。

AVG()函数:求平均值

#求出student表中所有的年龄的平均值 as 用来表示结果的别名;
select avg(age) as avg_age from student;

COUNT() 函数:进行计数

#返回学生表中学生的总数
select count(*) as num_studnet from student;
#返回address的总数,表示表中登记了地址的学生数
select count(address) as num_student from student;

MAX()函数:返回指定列中的最大值

#返回学生中年龄最大的年龄值
select max(age) from student;

MIN()函数:返回最小值,不作示例

SUM()函数:返回指定列的和

#计算所有学生的年龄和
select sum(age) from student;

6.分组

#根据班级class_id分别统计出每个班级的学生数
select class_id,count(*) as num from student group by class_id;

MySQL也允许过滤分组,之前的where是对行进行过滤,对分组进行过滤需要使用having

#过滤出学生数大于20的班级
select class_id,count(*) as num from student group by class_id having count(*) > 20;

7.子查询

子查询就是嵌套在其他查询中的查询;

比如说有三张表客户表customers、订单表orders、订单明细表orderitems;

需要列出订购物品book121的所有客户,我们可以分为3步:

(1)在订单明细表中查出包含book121的所有订单编号;

(2)根据订单编号在订单表中查出客户id;

(3)根据客户id在客户表中查询详细信息;

#执行上面的第一步
select order_num from ordersitems where prod_id = 'book121';
#假设返回的结果是 10001,10005 两个订单号
#执行第二步,根据10001,10005查询客户id
select cust_id from orders where order_num in (10001,10005);
#假设返回的结果是 20001,20005另个客户id
#执行第三步,根据客户id查询客户信息
select cust_name,cust_contact from customers where cust_id in (20001,20005);

上面的sql语句是每一步的执行过程,这时候我们将它们嵌套一下:

select cust_name,cust_contact from customers
from customers
where cust_id in (select cust_id
                    from orders
                    where order_num in (select order_num
                                        from orderitems
                                        where prod_id = 'book121'));