您的位置:首页 > 数据库 > MySQL

MySQL 常用函数和 SQL 技巧

2018-03-19 21:37 381 查看
1、命令行登录客户端

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' );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息