mysql update语句

Mysql数据库调优

╄→гoц情女王★ 提交于 2019-12-07 01:55:05
1. 简介 在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响。MySQL是目前使用最多的开源数据库,但是MySQL数据库的默认设置性能非常的差,仅仅是一个玩具数据库。因此在产品中使用MySQL数据库必须进行必要的优化。 优化是一个复杂的任务,本文描述MySQL相关的数据库设计和查询优化,服务器端优化,存储引擎优化。 2. 数据库设计和查询优化 在MySQL Server性能调优中,首先要考虑的就是Database Schema设计,这一点是非常重要的。一个糟糕的Schema设计即使在性能调优的MySQL Server上运行,也会表现出很差的性能;和Schema相似,查询语句的设计也会影响MySQL的性能,应该避免写出低效的SQL查询。这一节将详细讨论这两方面的优化。 2.1 Schema Design Schema的优化取决于将要运行什么样的query,不同的query会有不同的Schema优化方案。2.2节将介绍Query Design的优化。Schema设计同样受到预期数据集大小的影响。Schema设计时主要考虑:标准化,数据类型,索引。 2.1.1 标准化 标准化是在数据库中组织数据的过程。其中包括,根据设计规则创建表并在这些表间建立关系;通过取消冗余度与不一致相关性,该设计规则可以同时保护数据并提高数据的灵活性

MySQL修改表列名

亡梦爱人 提交于 2019-12-06 22:31:04
京东2016实习生招聘 Java开发工程师 在MySql中,如果要修改表的列名,下列语句的语法正确的是 A ALTER TABLE 表名字 CHANGE 列名称 新列名称 B ALTER TABLE 表名字 ALTER 列名称 新列名称 C ALTER TABLE 表名字 MODIFY列名称 新列名称 D ALTER TABLE 表名字 列名称 新列名称 正确答案 : A 知识点 修改某个表的字段类型及指定为空或非空 alter table 表名称 change 字段名称 新字段名称 字段类型 [是否允许非空]; alter table 表名称 modify 字段名称 字段类型 [是否允许非空]; 扩展 创建数据库 > CREATE DATABASE database-name 删除数据库 >drop database dbname 查询所有数据表 >show tables; 查询表的字段信息 > desc 表名称; 添加表字段 >alter table table1 add transactor varchar( 10 ) not Null; >alter table table1 add id int unsigned not Null auto_increment primary key 如果要删除某一字段,可用命令: >ALTER TABLE 表名称 DROP 字段名;

谈谈MySQL隐式类型转换

怎甘沉沦 提交于 2019-12-06 20:58:11
本文首发于个人微信公众号《andyqian》,期待您的关注! 前言 今天我们继续回到MySQL系列文章中,谈一谈MySQL中隐式类型转换。(其实我最早知道是在慢SQL优化中知道隐式类型转换概念的),在说隐式类型转换之前,首先我们通过一个实例来看看是怎么回事。 数据结构 本文中所有的操作,都是基于该数据结构(有兴趣的童鞋,可以实验): create table t_base_user( oid bigint( 20 ) not null primary key auto_increment, name varchar( 30 ) null comment "name" , email varchar( 30 ) null comment "email" , age int null comment "age" , telephone varchar( 30 ) null comment "telephone" , status tinyint( 4 ) null comment "0 无效 1 有效 " , created_at datetime null default now() comment " 创建时间 " , updated_at datetime null default now() comment " 修改时间 " ) ### 新建索引 alter table t

MySQL隐式转换问题修复

徘徊边缘 提交于 2019-12-06 20:52:26
一、背景 某业务一条UPDATE SQL where条件中存在隐式转换,预期要更新1条数据,实际由于隐式转换更新了80W条数据,更新后数据异常。 二、问题SQL UPDATE `xm_user` SET `status`=0 WHERE `user_number`=0; 三、表结构 表数据有一千多万;user_number为用户的唯一标识,其中有M159632/45841315两种格式的数据; CREATE TABLE `xm_user` ( `user_number` varchar(20) NOT NULL COMMENT '主键;用户唯一标识', `status` int(11) unsigned NOT NULL COMMENT '0:不可使用;1:可使用', PRIMARY KEY (`user_number`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户基本信息表' 四、查询执行 select count(0)from `xm_user` WHERE `user_number`=0; 查出80多万数据; select count(0)from `xm_user` WHERE `user_number`='0'; 查询0条数据; 五、SQL_MODE避免

MySQL隐式转化整理

最后都变了- 提交于 2019-12-06 20:49:09
MySQL隐式转化整理 前几天在微博上看到一篇文章: 价值百万的 MySQL 的隐式类型转换 感觉写的很不错,再加上自己之前也对MySQL的隐式转化这边并不是很清楚,所以就顺势整理了一下。希望对大家有所帮助。 当我们对不同类型的值进行比较的时候,为了使得这些数值「可比较」(也可以称为类型的兼容性),MySQL会做一些隐式转化(Implicit type conversion)。比如下面的例子: mysql> SELECT 1+'1'; -> 2 mysql> SELECT CONCAT(2,' test'); -> '2 test' 很明显,上面的SQL语句的执行过程中就出现了隐式转化。并且从结果们可以判断出,第一条SQL中,将字符串的“1”转换为数字1,而在第二条的SQL中,将数字2转换为字符串“2”。 MySQL也提供了 CAST() 函数。我们可以使用它明确的把数值转换为字符串。当使用 CONCA() 函数的时候,也可能会出现隐式转化,因为它希望的参数为字符串形式,但是如果我们传递的不是字符串呢: mysql> SELECT 38.8, CAST(38.8 AS CHAR); -> 38.8, '38.8' mysql> SELECT 38.8, CONCAT(38.8); -> 38.8, '38.8' 隐式转化规则 官方文档中关于隐式转化的规则是如下描述的: If one

MySQL——数据库基础操作

匆匆过客 提交于 2019-12-06 17:00:43
基本操作命令 1、查看数据库列表信息 show databases; mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.11 sec) 2、查看数据库中的数据表信息 (1)进入数据库 use mysql; mysql> use mysql; Database changed (2)查看数据表 show tables; mysql> show tables; +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | | db | | engine_cost | | event ...... 3、显示表结构信息(字段) describe user; (1)其中PRI为主键(不能为空) 定义——确定表中唯一实体对象的标识 特点——唯一性、非空性 (2)其中Extra为约束条件 mysql> describe user; +--------

python-操作 MySQL 数据库

送分小仙女□ 提交于 2019-12-06 16:51:30
1、连接数据库基础代码   使用 pymysql.connect(host, user, passwd, db, port, charset='utf8') 连接数据库   使用 cursor() 方法获取操作游标   使用 execute(sql) 方法执行SQL语句   使用 fetchone() 方法获取一条数据 import pymysql # 打开数据库连接 db = pymysql.connect(host="192.168.120.78", user="test", passwd="Ddc@2019", db="user", port=3306, charset='utf8') # 使用cursor()方法获取操作游标 cursor = db.cursor() # 使用execute()方法执行SQL语句 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法获取一条数据 data = cursor.fetchone() print("Database version : %s " % data) # 关闭数据库连接 cursor.close() db.close() 2、创建数据库表,使用 execute(sql) 方法执行sql语句 import pymysql # 打开数据库连接 db = pymysql

存储过程从定义开始

倖福魔咒の 提交于 2019-12-06 16:47:14
1. 使用存储过程的优点有: (1)存储过程在服务器端运行,执行速度快。 (2)存储过程执行一次后,其执行规划就驻留在高速缓冲存储器,在以后的操作中,只需从高速缓冲存储器中调用已编译好的二进制代码执行,提高了系统性能。 (3)确保数据库的安全。使用存储过程可以完成所有数据库操作,并可通过编程方式控制上述操作对数据库信息访问的权限。 2.创建存储过程可以使用create procedure语句。 要在MySQL 5.1中创建存储过程,必须具有CREATE routine权限。要想查看数据库中有哪些存储过程,可以使用SHOW PROCEDURE STATUS命令。要查看某个存储过程的具体信息,可使用SHOWCREATE PROCEDURE sp_name命令,其中sp_name是存储过程的名称。 CREATE PROCEDURE的语法格式: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body 其中,proc_parameter的参数如下: [ IN | OUT | INOUT ] param_name type characteristic特征如下: language SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL

数据库----mysql表的约束和查询

江枫思渺然 提交于 2019-12-06 16:16:30
一,mysql中表的约束   为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以 确保数据库中存储的数据正确、有效、相容。 约束条件与数据类型的宽度一样,都是可选参数,主要分为以下几种: NOT NULL :非空约束,指定某列不能为空; 是否可空,null表示空,非字符串 not null - 不可空 null - 可空 mysql> create table t12 (id int not null); Query OK, 0 rows affected (0.02 sec) mysql> select * from t12; Empty set (0.00 sec) mysql> desc t12; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | +-------+---------+------+-----+---------+-------+ 1 row

MySQL delete嵌套子查询问题

北战南征 提交于 2019-12-06 16:09:40
有这样一个例子: 删除除了编号id不同, 其他都相同的学生冗余信息。 感觉很简单,先按照除了编号以外的字段分组,查询出结果,然后删除id不在查询结果中的数据。 sql语句就是这样: DELETE FROM table2 WHERE id NOT IN (SELECT MAX(id) AS id FROM table2 GROUP BY NAME,studentID) 但是结果会报错: You can't specify target table 'table2' for update in FROM clause 报错原因是因为不能先从同一张表中查出数据,然后再在同一张表中进行update操作。 可以通过建一张临时表来解决这个问题。 SELECT tmp.id FROM (SELECT MAX(id) AS id FROM table2 GROUP BY NAME,studentID) tmp 然后删除id不在这张临时表中的数据。最后的sql语句就是这样: DELETE FROM table2 WHERE id NOT IN (SELECT tmp.id FROM (SELECT MAX(id) AS id FROM table2 GROUP BY NAME,studentID) tmp) 来源: https://www.cnblogs.com/w998/p/11993366