mysql常见操作汇总
SELECT REPLACE
( url, 'http://baidu.com', 'http://hello.com' ),
url
FROM
tb_banner
WHERE
url LIKE 'http://baidu.com%';
mysql中in多个字段
1. 基本用法
SELECT
*
FROM
USER
WHERE
user_id IN (600, 601, 602);
2. 多个字段同时使用
SELECT
*
FROM
USER
WHERE
(user_id, type) IN ((568, 6),(569, 6),(600, 8));
3. 多表同时多个字段使用
SELECT
*
FROM
USER
WHERE
(legal_id, type) NOT IN (
SELECT
a.legal_id,
a.type
FROM
USER AS a,
role_user_relation AS b
WHERE
a.legal_id = b.legal_id
AND a.type = b.legal_type
)
LIMIT 0,10;
https://blog.csdn.net/Guanjs2016/article/details/80237490
mysql limit在分页中的应用:
mysql中用limit 进行分页有两种方式
例1,假设数据库表student存在13条数据。
代码示例:
// 语句1和2均返回表student的第10、11、12、13行 ,
语句1:
select * from student limit 9,4 //第一个参数表示从该参数的下一条数据开始,第二个参数表示每次返回的数据条数。
语句2:
slect * from student limit 4 offset 9 //语句2中的4表示返回4行,9表示从表的第十行开始
例2,通过limit和offset 或只通过limit可以实现分页功能。
假设 pageSize表示每页要显示的条数,pageNumber表示页码,那么 返回第pageNumber页,每页条数为pageSize的sql语句:
代码示例:
语句3:select * from studnet limit (pageNumber-1)*pageSize,pageSize
语句4:select * from student limit pageSize offset (pageNumber-1)*pageSize
https://www.cnblogs.com/ahang/p/5644535.html
mysql limit offset
/*
Navicat MySQL Data Transfer Source Server : dev-192.168.38.109
Source Server Version : 50622
Source Host : 192.168.38.109:3306
Source Database : test Target Server Type : MYSQL
Target Server Version : 50622
File Encoding : 65001 Date: 2018-10-29 17:26:12
*/ SET FOREIGN_KEY_CHECKS=0; -- ----------------------------
-- Table structure for t_test
-- ----------------------------
DROP TABLE IF EXISTS `t_test`;
CREATE TABLE `t_test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4; -- ----------------------------
-- Records of t_test
-- ----------------------------
INSERT INTO `t_test` VALUES ('', 'name1');
INSERT INTO `t_test` VALUES ('', 'name2');
INSERT INTO `t_test` VALUES ('', 'name3');
INSERT INTO `t_test` VALUES ('', 'name4');
INSERT INTO `t_test` VALUES ('', 'name5');
SELECT * FROM t_test ORDER BY id asc; SELECT * FROM t_test ORDER BY id asc limit 0,1; SELECT * FROM t_test ORDER BY id asc limit 1,1; SELECT * FROM t_test ORDER BY id asc limit 0,2; SELECT * FROM t_test ORDER BY id asc limit 2,2;
今天无意间发现mysql的coalesce,
coalesce()解释:返回参数中的第一个非空表达式(从左向右依次类推);
使用示例:a,b,c三个变量。
select coalesce(null,2,3); // Return 2
select coalesce(null,null,3); // Return 3
select coalesce(1,2,3); // Return 1
通过上面例子可以看出,他的作用是将返回传入的参数中第一个非null的值,再比如
SELECT COALESCE(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1);
-- Return 1
如果传入的参数所有都是null,则返回null,比如
SELECT COALESCE(NULL, NULL, NULL, NULL);
-- Return NULL
这个参数使用的场合为:假如某个字段默认是null,你想其返回的不是null,而是比如0或其他值,可以使用这个函数
SELECT COALESCE(字段名,0) as value from t;//(如果数据库提成字段默认值不是为0值的话肯定是开发那个的错,个人观点请勿喷哈)。
无论从事什么行业,只要做好两件事就够了,一个是你的专业、一个是你的人品,
专业决定了你的存在,人品决定了你的人脉,剩下的就是坚持,用善良專業和真诚赢取更多的信任。
不忘初心 方得始终!
https://www.cnblogs.com/phpper/p/6903464.html
在mysql中sum函数查出的最终结果为0的时候会显示null,这时候就需要将null转为0:
方法1:使用IFNULL(expr1,expr2)函数:
SELECT
IFNULL(sum(SS), 0.0) AS sum
FROM
fd_order fo
WHERE
fo2.BUYER_ID = ''
结果为:
方法2:
使用COALESCE(value,...) 函数:
SELECT
COALESCE (sum(SS), 0.00) AS sum
FROM
fd_order fo2
WHERE
fo2.BUYER_ID = ''
结果为:
方法3:使用 case when 函数进行判断
SELECT
CASE
WHEN ISNULL(sum(SS)) THEN
0
ELSE
sum(SS)
END AS sum
FROM
fd_order fo2
WHERE
fo2.BUYER_ID = ''
结果为:
备注:这三种方法的结果稍微有点不一样,方法1和方法2的结果精确度可以在第二个参数中定义。
case when函数相当于一个判断语句,返回的结果可以定义成0,也可以定义成其他字母甚至汉字。
---------------------
作者:ZhuangYQ丶
来源:CSDN
原文:https://blog.csdn.net/iilegend/article/details/80363724
版权声明:本文为博主原创文章,转载请附上博文链接!
sql优化小结:
之前3m+,现在 300ms~400ms
解决思路:去掉冗余的查询条件,尽量使用3星索引。
更改字段长度,字段imei 由varchar(1024)更改为varchar(45) ,索引中涉及到imei字段的由imei(255)变为imei
梳理api接口使用中查询所需字段,优化查询条件,将一些不需要的查询参数去掉。
将经典场景使用的查询条件,单独建索引
将关键字段单独建索引,这个场景中,只将imei字段单独建立索引,其它字段不需要
SELECT IF(id=2,4,id) ,id from people ORDER BY id DESC;
MySql查看与修改auto_increment方法
查看表当前auto_increment
表的基本数据是存放在MySQL的information_schema库的tables表中,我们可以使用sql查出:
SELECT
auto_increment
FROM
information_schema. TABLES
WHERE
table_schema = 'db name'
AND table_name = 'table name';
例子:查看 test_user 库的 user 表 auto_increment
mysql> select auto_increment from information_schema.tables where table_schema='test_user' and table_name='user';
+----------------+
| auto_increment |
+----------------+
| 1002 |
+----------------+
1 row in set (0.04 sec)
修改表 auto_increment
alter table tablename auto_increment=NUMBER;
1、
创建表时指定AUTO_INCREMENT自增值的初始值(即起始值)不设置或设置为0时,会从1开始:
CREATE TABLE XXX (
ID INT (5) PRIMARY KEY AUTO_INCREMENT
) AUTO_INCREMENT = 100;
2、
通过 ALTER TABLE 修改初始值(但是要大于表中的 AUTO_INCREMENT 自增值,否则设置无效):
ALTER TABLE XXX AUTO_INCREMENT=100;
3、
如果自增序列的最大值被删除了,则在插入新记录时,该值被重用:
就是说如果表中原本有AUTO_INCREMENT属性值连续为78、100的值,但100这个数据被删除了,下此再添加数据的时候自增值为101,100被重用了。
即使在你将整个表中的所有数据delete清空后,之前的自增序列最大值还是会被重用。
解决办法是:
使用
ALTER TABLE XXX AUTO_INCREMENT=0;
重新设置自增初始值。
mysql中的字符串的拼接
字符串的拼接
1、Mysql
在Java、C#等编程语言中字符串的拼接可以通过加号“+”来实现,比如:"1"+"3"、"a"+"b"。
在MYSQL中也可以使用加号“+”来连接两个字符串,比如下面的SQL:
SELECT ''+'',FAge+'' FROM T_Employee
执行结果
''+'' FAge+''
45 26
45 29
45 24
45 26
45 29
45 28
45 24
45 29
45 23
MYSQL会尝试将加号两端的字段值尝试转换为数字类型,如果转换失败则认为字段值为
0,比如我们执行下面的SQL语句:
SELECT 'abc'+'',FAge+'a' FROM T_Employee
执行完毕我们就能在输出结果中看到下面的执行结果:
'abc'+'' FAge+'a'
123 25
123 28
123 23
123 25
123 28
123 27
123 23
123 28
123 22
在MYSQL中进行字符串的拼接要使用CONCAT函数,CONCAT函数支持一个或者多个参数,参数类型可以为字符串类型也可以是非字符串类型,对于非字符串类型的参数MYSQL将尝试将其转化为字符串类型,CONCAT函数会将所有参数按照参数的顺序拼接成一个字符串做为返回值。比如下面的SQL语句用于将用户的多个字段信息以一个计算字段的形式查询出来:
SELECT CONCAT('工号为:',FNumber,'的员工的幸福指数:',FSalary/(FAge-21))
FROM T_Employee 执行完毕我们就能在输出结果中看到下面的执行结果:
CONCAT('工号为:',FNumber,'的员工的幸福指数:',FSalary/(FAge-21))
工号为:DEV001的员工的幸福指数:2075.000000
工号为:DEV002的员工的幸福指数:328.685714
工号为:HR001的员工的幸福指数:1100.440000
MYSQL中还提供了另外一个进行字符串拼接的函数CONCAT_WS,CONCAT_WS可以在待拼接的字符串之间加入指定的分隔符,它的第一个参数值为采用的分隔符,而剩下的参数则为待拼接的字符串值,比如执行下面的SQL:
SELECT CONCAT_WS(',',FNumber,FAge,FDepartment,FSalary) FROM T_Employee
执行完毕我们就能在输出结果中看到下面的执行结果:
CONCAT_WS(',',FNumber,FAge,FDepartment,FSalary)
DEV001,25,Development,8300.00
DEV002,28,Development,2300.80
HR001,23,HumanResource,2200.88
HR002,25,HumanResource,5200.36
IT001,28,InfoTech,3900.00
IT002,27,InfoTech,2800.00
SALES001,23,Sales,5000.00
SALES002,28,Sales,6200.00
SALES003,22,Sales,1200.00
2,oracle
Oracle中使用“||”进行字符串拼接,其使用方式和MSSQLServer中的加号“+”一样。
比如执行下面的SQL语句:
SELECT '工号为'||FNumber||'的员工姓名为'||FName FROM T_Employee
WHERE FName IS NOT NULL
执行完毕我们就能在输出结果中看到下面的执行结果:
工号为||FNUMBER||的员工姓名为||FNAME
工号为DEV001的员工姓名为Tom
工号为DEV002的员工姓名为Jerry
工号为SALES001的员工姓名为John
工号为SALES002的员工姓名为Kerry
工号为SALES003的员工姓名为Stone
工号为HR001的员工姓名为Jane
工号为HR002的员工姓名为Tina
工号为IT001的员工姓名为Smith
除了“||”,Oracle还支持使用CONCAT()函数进行字符串拼接,比如执行下面的SQL语句:
SELECT CONCAT('工号:',FNumber) FROM T_Employee
执行完毕我们就能在输出结果中看到下面的执行结果:
CONCAT(工号:,FNUMBER)
工号:DEV001
工号:DEV002
工号:HR001
工号:HR002
工号:IT001
工号:IT002
工号:SALES001
工号:SALES002
工号:SALES003
如果CONCAT中连接的值不是字符串,Oracle会尝试将其转换为字符串,
与MYSQL的CONCAT()函数不同,Oracle的CONCAT()函数只支持两个参数,不支持两个以
上字符串的拼接。如果要进行多个字符串的拼接的话,可以使用多个CONCAT()函数嵌套使用。
SELECT CONCAT(CONCAT(CONCAT('工号为',FNumber),'的员工姓名为'),FName) FROM
T_Employee
WHERE FName IS NOT NULL
执行完毕我们就能在输出结果中看到下面的执行结果:
CONCAT(CONCAT(CONCAT(工号为,FNUMBER),的员工姓名为),FNAME)
工号为DEV001的员工姓名为Tom
工号为DEV002的员工姓名为Jerry
工号为SALES001的员工姓名为John
工号为SALES002的员工姓名为Kerry
工号为SALES003的员工姓名为Stone
工号为HR001的员工姓名为Jane
工号为HR002的员工姓名为Tina
工号为IT001的员工姓名为Smith
http://honly-java.iteye.com/blog/1633033
where 1071 Specialfied key war too long; max key length is 767 bytes
在为数据库中的某两个字段设置unique索引的时候,出现了Specified key was too long; max key length is 1000 bytes错误
经过查询才知道,是Mysql的字段设置的太长了,于是我把这两个字段的长度改了一下就好了。
建立索引时,数据库计算key的长度是累加所有Index用到的字段的char长度后再按下面比例乘起来不能超过限定的key长度1000:
latin1 = 1 byte = 1 character
uft8 = 3 byte = 1 character
gbk = 2 byte = 1 character
举例能看得更明白些,以GBK为例:
CREATE UNIQUE INDEX `uk_record` ON reports (`report_name`, `report_client`, `report_city`);
其中report_name varchar(200), report_client varchar(200), report_city varchar(200)
(200 + 200 +200) * 2 = 1200 > 1000,所有就会报1071错误,只要将report_city改为varchar(100)那么索引就能成功建立。
如果表是UTF8字符集,那索引还是建立不了
http://www.jb51.net/article/24499.htm
mysql中索引类型选择: btree(O(log(n))),hash
mysql最常用的索引结构是btree(O(log(n))),但是总有一些情况下我们为了更好的性能希望能使用别的类型的索引。
hash就是其中一种选择,例如我们在通过用户名检索用户id的时候,他们总是一对一的关系,用到的操作符只是=而已,假如使用hash作为索引数据结构的话,时间复杂度可以降到O(1)。
不幸的是,目前的mysql版本(5.6)中,hash只支持MEMORY和NDB两种引擎,而我们最常用的INNODB和MYISAM都不支持hash类型的索引。
不管怎样,还是要了解一下这两种索引的区别,下面翻译自mysql官网文档中对这两者的解释。
B-Tree 索引特征
B-Tree索引可以被用在像=,>,>=,<,<=和BETWEEN这些比较操作符上。而且还可以用于LIKE操作符,只要它的查询条件是一个不以通配符开头的常量。像下面的语句就可以使用索引:
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
下面这两种情况不会使用索引:
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;
第一条是因为它以通配符开头,第二条是因为没有使用常量。
假如你使用... LIKE '%string%'而且string超过三个字符,MYSQL使用Turbo Boyer-Moore algorithm算法来初始化查询表达式,然后用这个表达式来让查询更迅速。
一个这样的查询col_name IS NULL是可以使用col_name的索引的。
任何一个没有覆盖所有WHERE中AND级别条件的索引是不会被使用的。也就是说,要使用一个索引,这个索引中的第一列需要在每个AND组中出现。
下面的WHERE条件会使用索引:
... WHERE index_part1=1 AND index_part2=2 AND other_column=3
/* index = 1 OR index = 2 */
... WHERE index=1 OR A=10 AND index=2
/* 优化成 "index_part1='hello'" */
... WHERE index_part1='hello' AND index_part3=5
/* 可以使用 index1 的索引但是不会使用 index2 和 index3 */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;
下面的WHERE条件不会使用索引:
/* index_part1 没有被使用到 */
... WHERE index_part2=1 AND index_part3=2
/* 索引 index 没有出现在每个 where 子句中 */
... WHERE index=1 OR A=10
/* 没有索引覆盖所有列 */
... WHERE index_part1=1 OR index_part2=10
有时候mysql不会使用索引,即使这个在可用的情况下。例如当mysql预估使用索引会读取大部分的行数据时。(在这种情况下,一次全表扫描可能比使用索引更快,因为它需要更少的检索)。然而,假如语句中使用LIMIT来限定返回的行数,mysql则会使用索引。因为当结果行数较少的情况下使用索引的效率会更高。
Hash 索引特征
Hash类型的索引有一些区别于以上所述的特征:
1.它们只能用于对等比较,例如=和<=>操作符(但是快很多)。它们不能被用于像<这样的范围查询条件。假如系统只需要使用像“键值对”的这样的存储结构,尽量使用hash类型索引。
2.优化器不能用hash索引来为ORDER BY操作符加速。(这类索引不能被用于搜索下一个次序的值)
3.mysql不能判断出两个值之间有多少条数据(这需要使用范围查询操作符来决定使用哪个索引)。假如你将一个MyISAM表转为一个依靠hash索引的MEMORY表,可能会影响一些语句(的性能)。
4.只有完整的键才能被用于搜索一行数据。(假如用B-tree索引,任何一个键的片段都可以用于查找。我觉得可能意味着带通配符LIKE操作符会不起作用)。
后记
顺便记录一下在使用mysql过程中碰到的一些问题:
有时候使用脚本迁移数据时会碰到乱码的问题,即使将表字符集设置成utf8也无济于事,这个时候在执行sql之前加一句set names utf8即可。
http://www.jb51.net/article/62533.htm
DROP TABLE if EXISTS `people`;
CREATE TABLE people(
id BIGINT UNSIGNED auto_increment primary key,
zip_code char(32) not null default '',
address varchar(128) not null default '',
last_name char(64) not null default '',
first_name char(64) not null default '',
birthdate char(10) not null default ''
); DROP TABLE IF EXISTS `people_car`;
CREATE TABLE people_car(
people_id BIGINT UNSIGNED,
plate_number varchar(16) not null default '',
engine_number varchar(16) not null default '',
lasttime timestamp
); insert into people
(zip_code,address,last_name,first_name,birthdate)
values
('','henan','fan','li','516-09-15'),
('','anhui','zhang','san','1987-03-11'),
('','shanghai','wang','wu','1988-08-25'); insert into people_car
(people_id,plate_number,engine_number,lasttime)
values
(1,'A121311','','2013-11-23 :21:12:21'),
(2,'B121311','1S121313','2011-11-23 :21:12:21'),
(3,'C121311','1211SAS1','2012-11-23 :21:12:21'); ALTER TABLE `people`
ADD INDEX `idx_zipcode_firstname_lastname` (`zip_code`, `last_name`, `first_name`) USING BTREE ,
ADD INDEX `idx_zipcode` (`zip_code`) USING BTREE ; EXPLAIN SELECT * from people;
EXPLAIN SELECT zip_code,first_name,last_name from people;
EXPLAIN SELECT * from people;
http://www.cnblogs.com/zhanjindong/p/3439042.html
Tips:
Tom Smith中“Tom”是 first name,即名;“Smith”是last name=family name,即姓
1、Mysql服务突然启不来了,报错:
在分析时发现
MySQL Server 5.0\data下面有个名称为用户名,扩展名为.err的文件:
150725 20:01:19 [Note] 自己的安装目录\MySQL\MySQL Server 5.0\bin\mysqld-nt: Shutdown complete 150725 21:26:35 InnoDB: Error: unable to create temporary file; errno: 9
150725 21:26:35 [ERROR] Default storage engine (InnoDB) is not available
150725 21:26:35 [ERROR] Aborting 150725 21:26:35 [Note] 自己的安装目录\MySQL\MySQL Server 5.0\bin\mysqld-nt: Shutdown complete
按照网上找的解决办法,
(1)在MySQL\MySQL Server 5.0\my.ini中增加配置
tmpdir="自己的安装目录/MySQL/MySQL Server 5.0/Temp"
(2)更改引擎:
# The default storage engine that will be used when create new tables when
#default-storage-engine=INNODB
default-storage-engine=MyISAM
后,重新启动MySQL服务即可。
成功启动后 MySQL Server 5.0\data\当前用户名.err中的内容如下:
150725 20:01:19 [Note] C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld-nt: Shutdown complete 150725 21:26:35 InnoDB: Error: unable to create temporary file; errno: 9
150725 21:26:35 [ERROR] Default storage engine (InnoDB) is not available
150725 21:26:35 [ERROR] Aborting 150725 21:26:35 [Note] C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld-nt: Shutdown complete
150725 21:28:12 InnoDB: Error: unable to create temporary file; errno: 9
150725 21:28:12 [Note] C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld-nt: ready for connections.
Version: '5.0.96-community-nt' socket: '' port: 3306 MySQL Community Edition (GPL)
从上面的信息可以看到temporary file仍然创建失败,但Mysql服务器启动成功了
mysql> show engines;
+------------+----------+----------------------------------------------------------------+
| Engine | Support | Comment
+------------+----------+----------------------------------------------------------------+
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
| InnoDB | DISABLED | Supports transactions, row-level locking, and foreignkeys |
| BerkeleyDB | NO | Supports transactions and page-level locking
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) |
| EXAMPLE | NO | Example storage engine
| ARCHIVE | YES | Archive storage engine
| CSV | NO | CSV storage engine
| ndbcluster | NO | Clustered, fault-tolerant, memory-based tables
| FEDERATED | YES | Federated MySQL storage engine
| MRG_MYISAM | YES | Collection of identical MyISAM tables
| ISAM | NO | Obsolete storage engine
+------------+----------+----------------------------------------------------------------+
12 rows in set (0.00 sec)
2、MySQL 参数autoReconnect=true 解决8小时连接失效
(1). 即使在创建Mysql时url中加入了autoReconnect=true参数,一但这个连接两次访问数据库的时间超出了服务器端wait_timeout的时间限制,还是会CommunicationsException: The last packet successfully received from the server was xxx milliseconds ago.
(2) 服务器端的参数可以用
show global variables like 'wait_timeout';
28800s=8h
set global wait_timeout=10;
来进行设置,但是wait_timeout值不应该设的太高.
(3). 较好的策略是对处于idle状态的connection定时发送一个sql,来刷新服务器上的时间戳.这可以使用c3p0r的连接池.http://bzhang.iteye.com/blog/321832
(4). 对于tomcat的server.xml中使用的连接池,http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html,http://commons.apache.org/dbcp/configuration.html使用DBCP的连接池可以采用
<Resource name="jdbc/test" auth="Container"
type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8"
username="root" password="test" maxActive="500" maxIdle="10"
maxWait="-1" timeBetweenEvictionRunsMillis="10000" minEvictableIdleTimeMillis="10000" />
4.1 设置validationQuery,这样每次borrow(默认为开启)时会通过这个sql校验连接的有效性,但是增加了时间.
4.2 设置timeBetweenEvictionRunsMillis="10000" minEvictableIdleTimeMillis="10000" 依赖evictor thread线程来把超时的连接关闭.
4.3 设置testWhileIdle="true" timeBetweenEvictionRunsMillis="10000" validationQuery="select 1" 使得定时去用query检测处于idle状态的连接,也就刷新了服务器端的时间.
(5).每次提交的最大packet大小 show global variables like 'max_allowed_packet'; set global max_allowed_packet=1024*1024;
http://www.linuxidc.com/Linux/2012-10/72245.htm
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password
mysql ERROR 1045 (28000): Access denied for user解决方法
问题重现(以下讨论范围仅限Windows环境):
C:\AppServ\MySQL> mysql -u root -p
Enter password:
ERROR (): Access denied for user 'root'@'localhost' (using password: YES)
编辑mysql配置文件my.ini(不知道在哪请搜索),在[mysqld]这个条目下加入 skip-grant-tables 保存退出后重启mysql
1.点击“开始”->“运行”(快捷键Win+R)。
2.启动:输入
net stop mysql
3.停止:输入
net start mysql
这时候在cmd里面输入mysql -u root -p就可以不用密码登录了,出现password:的时候直接回车可以进入,不会出现ERROR 1045 (28000),但很多操作都会受限制,因为我们不能grant(没有权限)。按下面的流程走(红色部分为输入部分,粉红色的是执行后显示的代码不用输入):
1.进入mysql数据库:
mysql> use mysql;
Database changed
2.给root用户设置新密码,蓝色部分自己输入:
mysql> update user set password=password("新密码") where user="root";
Query OK, rows affected (0.01 sec) Rows matched: Changed: Warnings:
3.刷新数据库
mysql> flush privileges; Query OK, rows affected (0.00 sec)
4.退出mysql:
mysql> quit Bye
改好之后,再修改一下my.ini这个文件,把我们刚才加入的"skip-grant-tables"这行删除,保存退出再重启mysql就可以了。
http://blog.csdn.net/hsg77/article/details/39159191
在windows平台下MySql启动时的1067错误的解决方法及反思
1、打开my.ini文件,找到default-storage-engine=InnoDB这一行,把它改成default-storage-engine=MyISAM。
2、删除在MySQL安装目录下的Data目录中的ib_logfile0和ib_logfile1 3。找到在配置MySQL服务器时指定的InfoDB目录删除掉ibdata1
根据my.ini文件中:
#*** INNODB Specific options *** innodb_data_home_dir="D:/"。 4。重新启动MySQL的Service
根据我自己的实践,只要进行第三步就能解决问题。
二、
err文件内容:
090417 9:02:55 InnoDB: Error: unable to create temporary file; errno: 2 090417 9:02:55 [ERROR] Plugin 'InnoDB' init function returned error. 090417 9:02:55 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed. 090417 9:02:55 [ERROR] Unknown/unsupported table type: INNODB 090417 9:02:55 [ERROR] Aborting
090417 9:02:55 [Warning] Forcing shutdown of 1 plugins 090417 9:02:55 [Note] MySQL: Shutdown complete
经过一翻Google,找出了无法启动的原因:MySQL在安装的时候不会自动初始tmpdir(临时文件目录),所以要在配置文件my.ini中添加如下内容:
[mysqld]
#自己指定的临时文件目录
tmpdir="D:/MySQL/MySQL Server 5.1/Temp"
再次启动MySQL一切正常,在Temp文件夹下生成了一些*.tmp的临时文件。
最后还是存在一些疑问:如果是由于没有初始化tmpdir,为什么在我第一次安装的时候也没有初始化,但也没有出现这样的问题?
三、
以前手动安装MySQL5.0.16的windows service时很顺利,昨晚为5.0.83安装service时,总是提示1067的错误。网上有人说把my.ini放到C:\WINDOWS下就可以了,但我遇到的情况是问题仍然没有解决。我的解决办法是将参数中的--defaults-file用--defaults-extra-file取代,如下:
mysqld-nt--install MySQL --defaults-file=E:/mysql-5.0.83-win32/my.ini
改为
mysqld-nt--install MySQL --defaults-extra-file=E:/mysql-5.0.83-win32/my.ini
执行mysqld-nt --verbose --help能看到mysqld的用法,其中就有这两个参数的说明。
C:\Users\Administrator>mysqld-nt --verbose --help|more
mysqld-nt Ver 5.0.96-community-nt for Win32 on ia32 (MySQL Community Edition (G
PL))
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Starts the MySQL database server. Usage: mysqld-nt [OPTIONS]
NT and Win32 specific options:
--install Install the default service (NT)
--install-manual Install the default service started manually (NT
)
--install service_name Install an optional service (NT)
--install-manual service_name Install an optional service started manually (NT
)
--remove Remove the default service from the service list
(NT)
--remove service_name Remove the service_name from the service list (N
T)
--enable-named-pipe Only to be used for the default server (NT)
--standalone Dummy option to start as a standalone server (NT
根据我自己的实践,引起这个问题最大的可能性是数据表存储引擎(Engine,简而言之,存储引擎就是指表的类型,即Table Type
)引起的。MySQL数据库支持的数据表存储引擎有多种,可以用命令:show engines进行查看,在MySQL的配置文件my.ini中可以也看到(默认的是MyISAM):
# The default storage engine that will be used when create new tables when default-storage-engine=MyISAM。
常用的存储引擎还有InnoDB,InnoDB有多种优点,InnoDB给MySQL的表提供了事务、回滚、崩溃修复能力、多版本并发控制的事务安全.同时,InnoDB也是MySQL上第一个提供外键约束的引擎,而且InnoDB存储引擎对事务处理的能力也是MySQL其他存储引擎所无法与之比拟的。
InnoDB与MyISAM的区别:
以InnoDB存储引擎存储的表,存储表结构的.frm与存储的表数据文件(ibdata1)是分开存放的,存储表数据的文件位置可以通过修改my.ini文件自行设置:
#*** INNODB Specific options ***
innodb_data_home_dir="D:/"
以MyISAM存储引擎存储的表,一共包括3个文件:.frm(存储表的结构)文件,.MYD(MYouData的缩写,存储表的数据)文件,.MYI(MYIndex的缩写,存储表的索引),这个三个文件同时存放在MySQL数据库安装时存放数据的目录下,如F:\ProgramData\MySQL\MySQL Server 5.1\data\Databasename中。
另外,通过对这次问题的解决,我认识到了查看错误日志的重要性,当遇到问题的时候,我们首先想到的应该是去查看错误日志,而不是不加思索去Google或者去baidu,其实从错误日志中我们能得到真正造成问题的原因,对症下药,才能药到病除。MySQL的错误日志(.err)位于F:\ProgramData\MySQL\MySQL Server 5.1\data目录下,文件名一般为你的计算机名。
http://blog.sina.com.cn/s/blog_600357e40100q5ub.html
下面我建两个表,并执行一系列sql语句,仔细观察sql执行后表中数据的变化,很容易就能理解多表联合更新的用法
student表 class表
1. 执行 UPDATE student s , class c SET s.class_name='test00',c.stu_name='test00' WHERE s.class_id = c.id
student表 class表
2. 执行 UPDATE student s JOIN class c ON s.class_id = c.id SET s.class_name='test11',c.stu_name='test11'
student表 class表
3. 执行 UPDATE student s LEFT JOIN class c ON s.class_id = c.id SET s.class_name='test22',c.stu_name='test22'
student表 class表
4. 执行 UPDATE student s RIGHT JOIN class c ON s.class_id = c.id SET s.class_name='test33',c.stu_name='test33'
student表 class表
5. 执行 UPDATE student s JOIN class c ON s.class_id = c.id SET s.class_name=c.name , c.stu_name=s.name
student表 class表
---------------------
作者:dapeng94
来源:CSDN
原文:https://blog.csdn.net/u012604745/article/details/80642015
版权声明:本文为博主原创文章,转载请附上博文链接!
mysql操作查询结果case when then else end用法举例
Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
--比如说,下面这段SQL,你永远无法得到“第二类”这个结果
CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'
WHEN col_1 IN ('a') THEN '第二类'
ELSE'其他' END
https://www.cnblogs.com/clphp/p/6256207.html
在日常开发中由于业务逻辑较为复杂,常常需要用到UPDATE和CASE...WHEN...THEN...ELSE...END一起做一些复杂的更新。有时候因为对这几个字句理解得不透彻会带来很大的困扰。因此对UPDATE和CASE WHEN结构的特性做进一步的测试。
CASE WHEN的两种写法:
Type 1: CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
Type 2: CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
结论:
在第一个方案的返回结果中,value=compare-value.而第二个方案的返回结果是第一种情况的真实结果.
如果没有匹配的结果值,则返回结果为ELSE后的结果,如果没有ELSE 部分,则返回值为NULL,如果字段为NOT NULL则会根据不同数据类型返回不同的值(字符串类型时返回空字符串,数值类型时返回0,其它类型未做测试).
注意:如果CASE...WHEN...THEN...END没有WHERE字句的话会将相应表的记录遍历一遍。
创建测试表
CREATE TABLE `goods` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
`type` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
测试数据
1
2
3
4
5
6
7
8
|
id name type 1 1 1 2 2 1 3 3 2 4 4 2 5 5 3 6 6 3 7 7 4 |
- 没有WHERE字句时会遍历所有记录
UPDATE `goods` SET `type` = (
CASE `name` WHEN 1 THEN 999
WHEN 2 THEN 1000
WHEN 3 THEN 1024
END)
执行结果
1
2
3
4
|
(7 row(s) affected, 4 warning(s)) Execution Time : 00:00:00:000 Transfer Time : 00:00:00:047 Total Time : 00:00:00:047 |
type为字符串时返回空字符串,执行后的数据
1
2
3
4
5
6
7
|
1 1 999 2 2 1000 3 3 1024 4 4 5 5 6 6 7 7 |
type为整形时返回0,执行后的数据
1
2
3
4
5
6
7
|
1 1 999 2 2 1000 3 3 1024 4 4 0 5 5 0 6 6 0 7 7 0 |
- 添加where字句
UPDATE `goods` SET `type` = (
CASE `name` WHEN 1 THEN 999
WHEN 2 THEN 1000
WHEN 3 THEN 1024
END)
WHERE ID in(1, 2, 3);
执行结果
1
2
3
4
|
(3 row(s) affected) Execution Time : 00:00:00:000 Transfer Time : 00:00:00:016 Total Time : 00:00:00:016 |
执行后的数据
1
2
3
4
5
6
7
|
1 1 999 2 2 1000 3 3 1024 4 4 4 5 5 5 6 6 6 7 7 7 |
由此可见,做UPDATE时WHERE字句是多么的重要。做UPDATE更新时请时刻记住WHERE这条尾巴。
https://www.cnblogs.com/rwxwsblog/p/4512061.html
mysql常见操作汇总的更多相关文章
- mysql常见操作汇总 专题
mysql中in多个字段 1. 基本用法 SELECT * FROM USER WHERE , , ); 2. 多个字段同时使用 SELECT * FROM USER WHERE (, ),(, ), ...
- JS 数组常见操作汇总,数组去重、降维、排序、多数组合并实现思路整理
壹 ❀ 引 JavaScript开发中数组加工极为常见,其次在面试中被问及的概率也特别高,一直想整理一篇关于数组常见操作的文章,本文也算了却心愿了. 说在前面,文中的实现并非最佳,实现虽然有很多种,但 ...
- C#路径/文件/目录/I/O常见操作汇总
文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...
- C#路径/文件/目录/I/O常见操作汇总<转载>
文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...
- 【转】C#路径/文件/目录/I/O常见操作汇总
文件操作是程序中非常基础和重要的内容,而路径.文件.目录以及I/O都是在进行文件操作时的常见主题,这里想把这些常见的问题作个总结,对于每个问题,尽量提供一些解决方案,即使没有你想要的答案,也希望能提供 ...
- Mysql高手系列 - 第4天:DDL常见操作汇总
这是Mysql系列第4篇. 环境:mysql5.7.25,cmd命令中进行演示. DDL:Data Define Language数据定义语言,主要用来对数据库.表进行一些管理操作. 如:建库.删库. ...
- mysql常见操作语句,建表,增删改查
用户操作 新建用户 grant 权限 on 数据库.表名 to 用户名@'访问地址' identified by "密码"; 新建一个可以远程访问数据库的用户 test, 密码:p ...
- MySQL常见操作指令
1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2:创建一个数据库MYSQLDATA mysql> CREATE DATABASE M ...
- 四、DDL常见操作汇总
DDL: Data Define Language 数据定义语言,主要用来对数据库.表进行一些管理操作.如:建库.删库.建表.修改表.删除表.对列的增删改等. 一.库的管理 1.创建库 create ...
随机推荐
- Eclipse常用热键
,Ctrl+D 删除选中的几行 ,Alt+上下箭头 移动选中的代码块 ,Alt+左右箭头 回退 前进 ,Alt+Shift+上下箭头 复制选中的代码块 ,sysout+Ctrl space 生成Sys ...
- SVN配置文件详解
本章将详细介绍前一章所涉及的两个配置文件, svnserve.conf 和 authz.conf,通过对配置逐行的描述,来阐明其中的一些细节含义.除此之外的其他配置.安装等内容,不是本文重点,读者若有 ...
- Mac OS X在建筑Python科学计算环境
经验(比如这篇日志:http://blog.csdn.net/waleking/article/details/7578517).他们推荐使用Mac Ports这种软件来管理和安装全部的安装包.依照这 ...
- http://fonts.googleapis.com/css?打开很慢解决方案
最近, 在写一个demo的时候突然发现加载超级慢, 寻找之下发现了"罪魁祸首", 系引用了http://fonts.googleapis.com/css. 接着在网上看到有网友反映 ...
- 让CentOS系统时间同步
CentOS系统时间同步的步骤如下: 新装的CentOS系统服务器可能设置了错误的,需要调整时区并调整时间. 如下是CentOS系统使用NTP来从一个时间服务器同步cp /usr/share/zone ...
- (step7.2.1)hdu 1395(2^x mod n = 1——简单数论)
题目大意:输入一个整数n,输出使2^x mod n = 1成立的最小值K 解题思路:简单数论 1)n可能不能为偶数.因为偶数可不可能模上偶数以后==1. 2)n肯定不可能为1 .因为任何数模上1 == ...
- Windows Phone开发(2):竖立自信,初试锋茫
原文:Windows Phone开发(2):竖立自信,初试锋茫 上一篇文章中,我们聊了一些"大炮"话题,从这篇文章开始,我们一起来学习WP开发吧. 一.我们有哪些装备. 安装完VS ...
- Just4Fun - Comparaison between const and readonly in C#
/* By Dylan SUN */ Today let us talk about const and readonly. const is considered as compile-time c ...
- Js常用技巧
摘录:http://crasywind.blog.163.com/blog/static/7820316920091011643149/ js 常用技巧 1. on contextmenu=" ...
- SqlServer表EXCEL数据复制的另一种方法
一个.SqlServer表中的数据复制到excel 1.新建查询,用sql语句把表数据读出来 2.然后,选择数据,右键.复制(也能够点击连同标题复制),拷贝到记事本中(不然会乱码) 3.然后再把记事本 ...