MySQL 常用函数和 SQL 技巧
2018-03-19 21:37
381 查看
1、命令行登录客户端
2、命令行客户端修改密码
3、delete 删除数据需要注意别名问题
4、update 更新数据时,需要注意 where 后面的 from 子句不能包含要更新的表
5、count(*)、count(1)、count(column) 区别
count(column) 会忽略为 null 的列,其他两个不会。
它们三个的效率如何呢?网上说的各有各的理,当表中存在索引和主键的时候(我还没接触过设计表时不设计主键的),三者效率差不多。而我在《高性能MySQL》一书中看到这样一段话:当我们使用 count() 时,通配符 并不会像我们猜想的那样扩展成所有的列,实际上,它会忽略所有的列而直接统计所有的行数。我们发现最常见的错误就是,在括号内指定一个列却希望统计结果集的行数。如果希望知道的是结果集的行数,最好使用 count(*),这样写意义清晰,性能也会很好。
另外,在 MyISAM 中,count() 函数总是非常快的,不过这也是有前提条件的,即只有没有任何 where 条件的 count(*)才非常快,这是这个引擎的特性。
6、union 和 union all 的联合查询
union 的查询结果不会有重复项,因为它的内部使用了一次 distinct,而 union all 的查询结果包含重复项。
注意:参与联合查询的各查询结果的列数必须相同,对应项的数据类型也必须相同
7、if 相关的函数
8、distinct
distinct 关键字应用于所有列而不是它后面的第一个列。一般情况下去重时,distinct 后面的列要包含 unique 的列,否则可能会出错。
9、case when 和行转列
参见:case when 和行转列
10、group by 分组统计
注意:1)ROLLUP和 ORDER BY 是互相排斥的 2)LIMIT 用在 ROLLUP 后面
数据:
mysql -h localhost -u root -p database_name
2、命令行客户端修改密码
# 其中PASSWORD是一个加密函数 update mysql.user set password=PASSWORD('123') where user='root'; flush privileges;
3、delete 删除数据需要注意别名问题
# from 后指定了表的别名时,delete 后面必须要加上别名,否则有语法错误 DELETE ui FROM user_info ui WHERE ui.name = '德莱文';
4、update 更新数据时,需要注意 where 后面的 from 子句不能包含要更新的表
# 错误演示 UPDATE user_info a SET a.name = '文森特' WHERE a.id IN ( SELECT b.id FROM user_info b WHERE b.name = '德莱文' ); # 正确演示 UPDATE user_info a JOIN ( SELECT b.id FROM user_info b WHERE b.name = '德莱文' ) c ON a.id = c.id SET a.name = '文森特';
5、count(*)、count(1)、count(column) 区别
count(column) 会忽略为 null 的列,其他两个不会。
它们三个的效率如何呢?网上说的各有各的理,当表中存在索引和主键的时候(我还没接触过设计表时不设计主键的),三者效率差不多。而我在《高性能MySQL》一书中看到这样一段话:当我们使用 count() 时,通配符 并不会像我们猜想的那样扩展成所有的列,实际上,它会忽略所有的列而直接统计所有的行数。我们发现最常见的错误就是,在括号内指定一个列却希望统计结果集的行数。如果希望知道的是结果集的行数,最好使用 count(*),这样写意义清晰,性能也会很好。
另外,在 MyISAM 中,count() 函数总是非常快的,不过这也是有前提条件的,即只有没有任何 where 条件的 count(*)才非常快,这是这个引擎的特性。
6、union 和 union all 的联合查询
union 的查询结果不会有重复项,因为它的内部使用了一次 distinct,而 union all 的查询结果包含重复项。
注意:参与联合查询的各查询结果的列数必须相同,对应项的数据类型也必须相同
7、if 相关的函数
# IF(expr,t f) 如果 expr 是真,返回 t;否则返回 f SELECT name, IF ( name = '文森特', '斧头', '无' ) '装备' FROM user_info # IFNULL(value1,value2) 如果 value1 为 null,返回 value2 SELECT IFNULL(name, '无名') name FROM user_info
8、distinct
distinct 关键字应用于所有列而不是它后面的第一个列。一般情况下去重时,distinct 后面的列要包含 unique 的列,否则可能会出错。
-- 创建表 学生表 CREATE TABLE `edu_student` ( `stu_id` VARCHAR (16) NOT NULL COMMENT '学号', `stu_name` VARCHAR (20) NOT NULL COMMENT '学生姓名', PRIMARY KEY (`stu_id`) ) COMMENT = '学生表' ENGINE = INNODB; -- 课程表 CREATE TABLE `edu_courses` ( `course_no` VARCHAR (20) NOT NULL COMMENT '课程编号', `course_name` VARCHAR (100) NOT NULL COMMENT '课程名称', PRIMARY KEY (`course_no`) ) COMMENT = '课程表' ENGINE = INNODB; -- 成绩表 CREATE TABLE `edu_score` ( `stu_id` VARCHAR (16) NOT NULL COMMENT '学号', `course_no` VARCHAR (20) NOT NULL COMMENT '课程编号', `scores` FLOAT NULL DEFAULT NULL COMMENT '得分', PRIMARY KEY (`stu_id`, `course_no`) ) COMMENT = '成绩表' ENGINE = INNODB; INSERT INTO edu_student (stu_id, stu_name) VALUES ('1001', '盲僧'), ('1002', '盲僧'); -- 课程表数据 INSERT INTO edu_courses (course_no, course_name) VALUES ('C001', '大学语文'),('C002', '新视野英语'),('C003', '离散数学'), ('C004','概率论与数理统计'),('C005', '线性代数'),('C006', '高等数学'); -- 成绩表数据 INSERT INTO edu_score (stu_id, course_no, scores) VALUES ('1001', 'C001', 67), ('1002', 'C001', 67), ('1001', 'C002', 87), ('1002', 'C002', 87), ('1001', 'C003', 83), ('1002', 'C003', 83), ('1001', 'C004', 88), ('1002', 'C004', 88), ('1001', 'C005', 77), ('1002', 'C005', 78); SELECT distinct est.stu_name, sum(ese.scores) FROM edu_student est JOIN edu_score ese ON est.stu_id = ese.stu_id GROUP BY est.stu_id
9、case when 和行转列
参见:case when 和行转列
10、group by 分组统计
注意:1)ROLLUP和 ORDER BY 是互相排斥的 2)LIMIT 用在 ROLLUP 后面
# 语法:FROM tablename [WHERE where_contition][GROUP BY field1,field2,……fieldn [WITH ROLLUP]] [HAVING where_contition] SELECT ifnull(a.year_, '合计') '年', a.total, a.order_total FROM ( SELECT DATE_FORMAT(create_date, '%Y') year_, sum(payable_amount) AS total, count(*) AS order_total FROM shop_order GROUP BY date_format(create_date, '%Y') WITH ROLLUP ) a;
数据:
CREATE TABLE `shop_order` ( `id` char(36) NOT NULL COMMENT 'id', `create_date` datetime NOT NULL COMMENT '创建日期', `modify_date` datetime NOT NULL COMMENT '修改日期', `order_number` varchar(50) NOT NULL COMMENT '订单编号', `payable_amount` decimal(10,2) NOT NULL COMMENT '应付金额', PRIMARY KEY (`id`), UNIQUE KEY `shop_order_number` (`order_number`), KEY `create_date` (`create_date`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商城订单表'; INSERT INTO `shop_order` VALUES ( 'fe4918e8-2cfd-4077-949b-79db2452d8da', '2017-10-25 17:21:39', '2017-07-25 17:21:39', 'NT20170725000043', '66.00' ), ( 'fe565435-52dd-410e-b43d-a1529530fec8', '2016-11-15 17:06:59', '2017-03-15 17:06:59', 'NT20170315000003', '223.10' ), ( 'fe77e32f-890d-460b-8957-96a4a378ddd3', '2018-03-17 09:42:54', '2017-06-17 09:42:54', 'NT20170617000008', '55.00' ), ( 'fe839068-0f1d-45dd-9290-830fab3b638e', '2017-08-29 15:34:24', '2017-08-29 15:34:24', 'NT20170829000024', '114.00' ), ( 'feaaa6e3-1520-417e-afc4-dee37df736a2', '2018-03-29 11:16:06', '2017-08-29 11:16:06', 'NT20170829000018', '114.00' ), ( 'feb2147d-5f5c-4a80-9035-da8be2ae8f98', '2017-03-27 13:01:59', '2017-06-27 13:01:59', 'NT20170627000015', '162.00' ), ( 'fec7a900-7644-452f-bfc1-bffb46d24481', '2017-07-22 11:08:06', '2017-06-22 11:08:06', 'NT20170622000025', '48.00' ), ( 'fecce78d-14f7-48c3-93f8-de470030a55f', '2017-06-10 10:13:34', '2017-07-10 10:13:34', 'NT20170710000001', '180.00' ), ( 'feeb950a-a624-4b40-8abe-cde13bab5dd9', '2018-02-28 14:22:36', '2017-08-28 14:22:36', 'NT20170828000009', '288.00' ), ( 'fef7e6ef-d361-4d79-a06a-ca6106e2c6a9', '2018-01-14 16:33:02', '2017-08-14 16:33:02', 'NT20170814000014', '132.00' ), ( 'fefcd408-ef18-4533-a13a-4bf6116709d8', '2017-11-30 17:30:20', '2017-07-31 17:30:20', 'NT20170731000028', '114.00' ), ( 'feffded3-f5f6-480e-9e6a-1501c86c13b1', '2017-09-24 14:27:19', '2017-07-24 14:27:19', 'NT20170724000009', '660.00' ), ( 'ff02a9e7-43e7-42b9-9068-d1d8c29f9d7d', '2017-12-03 11:13:14', '2017-08-03 11:13:14', 'NT20170803000016', '144.00' ), ( 'ff06abf4-a56a-4756-87bb-b1d054acc4fb', '2017-02-26 09:51:58', '2017-06-26 09:51:58', 'NT20170626000009', '48.00' ), ( 'ff16e6f7-bf7b-47a4-b55c-3f7e397e60b1', '2017-04-03 15:16:43', '2017-07-03 15:16:43', 'NT20170703000011', '31.00' ), ( 'ff227299-f4b9-41d1-a53b-10b8804608a1', '2017-05-07 16:06:33', '2017-07-07 16:06:33', 'NT20170707000033', '48.00' ), ( 'ff26cbc4-25d0-4252-ba5b-5669bad78f3d', '2016-12-08 00:03:35', '2017-04-08 00:03:35', 'NT20170408000001', '206.60' ), ( 'ff6e5032-23aa-44dc-87fb-94c479d02bf6', '2017-08-22 11:03:31', '2017-07-22 11:03:31', 'NT20170722000008', '48.00' ), ( 'ff9fdb57-2343-4c25-8711-9d66b7a3adad', '2016-10-17 14:10:42', '2017-05-17 14:10:42', 'NT20170517000009', '208.00' ), ( 'ffb59cf1-ca94-47d7-91fd-2dd03c097a3c', '2017-05-12 11:38:18', '2017-06-12 11:38:18', 'NT20170612000010', '96.00' ), ( 'ffccfdfe-0fcc-4e53-b3e0-5020845f85af', '2017-04-07 17:13:18', '2017-06-07 17:13:18', 'NT20170607000023', '797.70' ), ( 'ffcda1bd-23b6-47d4-a8e6-3b2934780a22', '2017-01-24 09:00:27', '2017-06-24 09:00:27', 'NT20170624000003', '66.00' ), ( 'ffe2a267-2edc-43c9-a975-dd7579530f37', '2017-07-13 17:25:21', '2017-07-13 17:25:21', 'NT20170713000033', '66.00' );
相关文章推荐
- sql语句case when使用和date_formate()的使用,DATEDIFF(字段1,字段2)获取天数,常用的MYSQL的函数
- Mysql学习笔记八,Mysql优化篇,常用sql技巧和常见问题
- DB2常用SQL技巧及函数
- mysql sql常用技巧
- mysql 入门基础(7)—sql编程常用函数
- MySql常用命令及sql 技巧 (持续更新)
- MySql常用命令及sql 技巧 (持续更新)
- 项目中学到SQL语句中的一些常用技巧及函数
- [MySQL] 常用SQL技巧--18.5
- MySQL 常用SQL 技巧
- zt: SQL*PLUS常用命令和Decode()函数使用技巧
- mysql 学习之 常用SQL技巧
- 【Mysql】常用sql查询技巧
- mysql sql 常用命令和函数
- MySQL SQL语句常用的30个优化技巧
- MySQL用户管理、常用sql语句、数据库备份
- 浅谈MySQL中优化sql语句查询常用的30种方法
- MYSQL的常用函数
- mysql导入导出表结构及表数据及执行sql常用指令
- Mysql常用函数