资讯专栏INFORMATION COLUMN

MySQL基础部分总结

mating / 2327人阅读

摘要:在数据分组前进行过滤,在数据分组后进行过滤顺序子查询连接表笛卡儿积如果将两个表同时作为数据源后的表名,不加任何的匹配条件,那么产生的结果集就是一个迪卡尔积。迪卡尔积的结果没有意义,但是迪卡尔积是联合查询连接查询的基础。

MySQL 1、选择数据库

use dbname

show databases;

2、数据表

show tables

mysql> show columns from customers;

mysql> desc customers;

3、show 语句

show status

show create databases

show create table

show grants

4、select 检索

4.1.1版本后不再区分大小写,但是为了容易阅读和调试,建议还是使用。

mysql> select cust_name from customers;
mysql> select cust_name cust_status from customers;
mysql> select distinct vend_id from products;
mysql> select prod_name from products limit 5;
mysql> select prod_name from products limit 5,5;
//分页问题
从行0开始计数,limit5,5是从第5行开始(不包括第五行),取5行,结果是:6:10行
因为这个很容易引起误解,所以MySQL5开始支持另一个语法:limit 4 offset 3,意思是从行3开始取4行,等同于limit 3,4
4-1、排序数据
//单个字段排序
mysql> select prod_name from products order by  prod_name;
//多个字段排序,如果第一个字段全部唯一则第二个字段就不会生效
mysql> select prod_id,prod_price,prod_name from products order by prod_price ,prod_name;
4-2、指定排序方向

desc 降序

asc 升序-默认

注意顺序,from>ordrr by >limit

mysql> select prod_id,prod_price,prod_name from products order by prod_price desc;
mysql> select prod_id,prod_price,prod_name from products order by prod_price asc;
mysql> select prod_price from products order by prod_price desc limit 1;
5、where 条件

相关操作符:

= 等于

<> 不等于

!= 不等于

< 小于

> 大于

>= 大于或者等于

<= 小于或等于

between 两者之间 and

and 的优先级大于or,需要处理or,则需要括号
mysql> select prod_price,prod_name from  products where prod_price = 2.50;
mysql> select prod_price,prod_name from  products where prod_price  between 5 and 10;
//  IS NULL
mysql> select cust_id from customers where cust_email is null;
重点:空值检查
空值既是:NULL
MySQL中判断是否是空值的子句是: IS NULL

example:

 mysql> select cust_id FROM customers  where cust_email IS NULL;    
+---------+
| cust_id |
+---------+
|   10002 |
|   10005 |
+---------+
6、where 数据过滤

(logical operator)逻辑操作符:and - or

mysql> select prod_id,prod_price,prod_name from products where vend_id = 1003 and prod_price<= 10;
mysql> select prod_id,prod_price,prod_name from products where vend_id = 1003 or vend_id = 1002;

运算符优先级问题:
下列SQL中实际先运行 vend_id = 1002 and prod_price >= 10;,再运行vend_id = 1003.因为and的优先级大于or,如果要按理想执行,加括号!

mysql> select prod_id,prod_price,prod_name from products where vend_id = 1003 or vend_id = 1002 and prod_price >= 10;
mysql> select prod_id,prod_price,prod_name from products where (vend_id = 1003 or vend_id = 1002 )and prod_price >= 10;
6-1、 in操作符 (not in)
mysql> select prod_id,prod_price,prod_name from products where vend_id in (1002,1003) order by prod_name;
6-2、 or操作符
mysql> select prod_id,prod_price,prod_name from products where vend_id not in (1002,1003) order by prod_name;
7、用通配符过滤

like 和 _ 的区别是后者只能匹配一个字符

7-1、like

**注意NULL 虽然似乎 % 通配符可以匹配任何东西,但有一个例
外,即 NULL 。即使是 WHERE prod_name LIKE "%" 也不能匹配
用值 NULL 作为产品名的行。**

mysql> select prod_id,prod_price,prod_name from products where prod_name  LIKE "jet%";

mysql> select prod_id,prod_price,prod_name from products where prod_name  LIKE "%anv%";
7-2、_
mysql> select prod_id,prod_price,prod_name from products where prod_name  LIKE "_ ton anvil";
8、正则表达式

like是匹配全部,REGEXP可以匹配全部和部分

mysql> select prod_name  from products where prod_name ="JetPack 1000";
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.00 sec)

mysql> select prod_name from products where prod_name  REGEXP "1000";
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.00 sec)

默认不区分大小写,需要区分大小写binary

mysql> select prod_name from products where prod_name  REGEXP "jetpack .000";
mysql> select prod_name from products where prod_name  REGEXP binary "JetPack .000";
10、计算字段

concat 合并 讲两个字段合并成一个新的字段

mysql> select concat (vend_name , "C",vend_country,")") from vendors order by vend_name;
+-------------------------------------------+
| concat (vend_name , "C",vend_country,")") |
+-------------------------------------------+
| ACMECUSA)                                 |
| Anvils R UsCUSA)                          |
| Furball Inc.CUSA)                         |
| Jet SetCEngland)                          |
| Jouets Et OursCFrance)                    |
| LT SuppliesCUSA)                          |
+-------------------------------------------+
6 rows in set (0.00 sec)

rtrim (ltrim ,trim) 去掉空格

mysql> select concat (rtrim(vend_name) , "C",vend_country,")") from vendors order by vend_name;

as 别名

mysql> select concat (rtrim(vend_name) , "(",rtrim(vend_country),")") as vend_title   from vendors order by vend__name;

计算

+、-、* 、

mysql> select quantity*item_price as expand_price from orderitems where order_num =20005;
11、函数

trim、ltrim、rtrim 去掉空值

Upper 转为大写

mysql> select vend_name,upper(vend_name) as ven_name_upcase from vendors order by vend_name;
11-2 时间函数

AddDate() 增加一个日期(天、周等)

AddTime() 增加一个时间(时、分等)

CurDate() 返回当前日期

CurTime() 返回当前时间

==Date() 返回日期时间的日期部分==

DateDiff() 计算两个日期之差

Date_Add() 高度灵活的日期运算函数

Date_Format() 返回一个格式化的日期或时间串

Day() 返回一个日期的天数部分

DayOfWeek() 对于一个日期,返回对应的星期几

Hour() 返回一个时间的小时部分

Minute() 返回一个时间的分钟部分

Month() 返回一个日期的月份部分

Now() 返回当前日期和时间

Second() 返回一个时间的秒部分

Time() 返回一个日期时间的时间部分

Year() 返回一个日期的年份部分

取9月某一天的数据

mysql> select cust_id,order_num from orders where Date(order_date) = "2005-09-01"; 
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
+---------+-----------+
1 row in set (0.00 sec)

取9月整个月的订单

mysql> select cust_id,order_num from orders where Date(order_date)  between "2005-09-01" and "2005-09-30"; 
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
|   10003 |     20006 |
|   10004 |     20007 |
+---------+-----------+
3 rows in set (0.00 sec)

mysql> select cust_id,order_num from orders where Year(order_date) and month(order_date) = 9;
+---------+-----------+
| cust_id | order_num |
+---------+-----------+
|   10001 |     20005 |
|   10003 |     20006 |
|   10004 |     20007 |
+---------+-----------+
3 rows in set (0.00 sec)
11-4 数值处理函数

Abs() 返回一个数的绝对值

Cos() 返回一个角度的余弦

Exp() 返回一个数的指数值

Mod() 返回除操作的余数

Pi() 返回圆周率

Rand() 返回一个随机数

Sin() 返回一个角度的正弦

Sqrt() 返回一个数的平方根

Tan() 返回一个角度的正切

11-5 聚集函数

AVG() 返回某列的平均值

COUNT() 返回某列的行数

MAX() 返回某列的最大值

MIN() 返回某列的最小值

SUM() 返回某列值之和

DISTINCT

mysql> select avg(prod_price) as avg_price from products;
分组数据

GROUP BY子句和HAVING子句

mysql> select vend_id,count(*) as num_prods from products group by vend_id; 
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         3 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
+---------+-----------+
4 rows in set (0.00 sec)

mysql> select vend_id,count(*) as num_prods from products group by vend_id with rollup;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         3 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
|    NULL |        14 |
+---------+-----------+
5 rows in set (0.00 sec)

having
唯一的差别是 WHERE过滤行,而HAVING过滤分组。WHERE在数据 分组前进行过滤,HAVING在数据分组后进行过滤
mysql> select vend_id,count(*) as num_prods from products group by vend_id having count(*)>=2;
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1001 |         3 |
|    1002 |         2 |
|    1003 |         7 |
|    1005 |         2 |
+---------+-----------+
4 rows in set (0.00 sec)


mysql> select vend_id,count(*) as num_prods from products where prod_price>=10  group by vend_id having count(*)>=2; 
+---------+-----------+
| vend_id | num_prods |
+---------+-----------+
|    1003 |         4 |
|    1005 |         2 |
+---------+-----------+
2 rows in set (0.00 sec)

mysql> select order_num ,sum(quantity*item_price) as ordertotal from orderitems 
-> group by order_num
-> having sum(quantity*item_price) >= 50
-> order by ordertotal;
+-----------+------------+
| order_num | ordertotal |
+-----------+------------+
|     20006 |      55.00 |
|     20008 |     125.00 |
|     20005 |     149.87 |
|     20007 |    1000.00 |
+-----------+------------+
4 rows in set (0.00 sec)

顺序

select

from

where

group by

having

order by

limit

12 子查询
mysql>  select cust_id from orders where order_num in  (select order_num from orderitems where prod_id ="TNT2");
+---------+
| cust_id |
+---------+
|   10001 |
|   10004 |
+---------+
15 连接表 笛卡儿积(cartesian product)

如果将两个表同时作为数据源(from后的表名),不加任何的匹配条件,那么产生的结果集就是一个迪卡尔积。
迪卡尔积的结果没有意义,但是迪卡尔积是联合查询、连接查询的基础。

1. 交叉连接 cross join

使用表A中的1条记录去表B中连接所有的记录,就是笛卡尔积

2. 内连接

select 字段列表 from 表A 【inner】 join 表B ,匹配到的成功的记录

3. 外连接 分为左连接和右连接,

左连接保留左边的所有,右边匹配到的部分

4. using关键字
在进行连接时,如果进行连接的两个字段的名子相同,则可以使用using using("cid")
当前笔记出自 《MySQL必知必会》

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/48518.html

相关文章

  • 后端知识- 收藏集 - 掘金

    摘要:常见的八大排序算法,他们之间关系如下被人忽视的面向对象的六大原则后端掘金前言作为文集的第一篇,我觉得有必要介绍一下大概的写作规划。 Java多线程干货系列—(四)volatile关键字| 掘金技术征文 - 掘金原本地址:Java多线程干货系列—(四)volatile关键字博客地址:http://tengj.top/ 前言 今天介绍下volatile关键字,volatile这个关键字可能...

    Youngdze 评论0 收藏0
  • 后端知识- 收藏集 - 掘金

    摘要:常见的八大排序算法,他们之间关系如下被人忽视的面向对象的六大原则后端掘金前言作为文集的第一篇,我觉得有必要介绍一下大概的写作规划。 Java多线程干货系列—(四)volatile关键字| 掘金技术征文 - 掘金原本地址:Java多线程干货系列—(四)volatile关键字博客地址:http://tengj.top/ 前言 今天介绍下volatile关键字,volatile这个关键字可能...

    scola666 评论0 收藏0
  • 为项目配置docker

    摘要:和首先,在以往的项目中,都是使用的形式来配置的,所以,首先就需要了解这两者的关系。完整配置文件版本号服务官方参考 之前就了解过docker,但是一直没有自己配置过docker。这次自己为项目配置了一下docker,在这里做一下总结记录。 Dockerfile和docker-compose 首先,在以往的项目中,都是使用DockerFile + docker-compose的形式来配置d...

    qiangdada 评论0 收藏0
  • 回顾 | 开源分布式中间件DBLE社区分享活动总结

    摘要:社区投稿配置解析投稿余朝飞本文简单介绍了中的三个重要的配置段落,分别是的系统配置,用户配置以及黑白名单功能,针对用户配置则介绍了实际应用场景下的配置以及对应的权限配置,并详细介绍了黑白名单配置实践。 1月24日,我们发布了为期30天的「如何获取全国 25场 MySQL 主题大会免费入场券」有奖社区分享活动,希望社区同学能够分享测试或生产环境中DBLE使用上的难题,困惑,创新或收获,分享...

    pf_miles 评论0 收藏0
  • 回顾 | 开源分布式中间件DBLE社区分享活动总结

    摘要:社区投稿配置解析投稿余朝飞本文简单介绍了中的三个重要的配置段落,分别是的系统配置,用户配置以及黑白名单功能,针对用户配置则介绍了实际应用场景下的配置以及对应的权限配置,并详细介绍了黑白名单配置实践。 1月24日,我们发布了为期30天的「如何获取全国 25场 MySQL 主题大会免费入场券」有奖社区分享活动,希望社区同学能够分享测试或生产环境中DBLE使用上的难题,困惑,创新或收获,分享...

    wangbjun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<