mysql的管理
#Window 启动mysql
cd c:/mysql/bin
mysqld --console
#window 关闭mysql
cd c:/mysql/bin
mysqladmin -uroot shutdown
#Linux
ps -ef | grep mysqld #查看是否正在运行
#Linux启动 mysql
root@host# cd /usr/bin
./mysqld_safe &
#Linux 关闭mysql
root@host# cd /usr/bin
./mysqladmin -u root -p shutdown
Enter password: ******
#用户设置
root@host# mysql -u root -p
Enter password:*******
mysql> use mysql;
Database changed
mysql> INSERT INTO user
(host, user, password,
select_priv, insert_priv, update_priv)
VALUES ('localhost', 'guest',
PASSWORD('guest123'), 'Y', 'Y', 'Y');
Query OK, 1 row affected (0.20 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 1 row affected (0.01 sec)
mysql> SELECT host, user, password FROM user WHERE user = 'guest';
+-----------+---------+------------------+
| host | user | password |
+-----------+---------+------------------+
| localhost | guest | 6f8c114b58f2ce9e |
+-----------+---------+------------------+
1 row in set (0.00 sec)
在添加用户时,请注意使用MySQL提供的 PASSWORD() 函数来对密码进行加密。
你可以在以上实例看到用户密码加密后为: 6f8c114b58f2ce9e.
注意:在 MySQL5.7 中 user 表的 password 已换成了authentication_string。
注意:password() 加密函数已经在 8.0.11 中移除了,可以使用 MD5() 函数代替。
注意:在注意需要执行 FLUSH PRIVILEGES 语句。 这个命令执行后会重新载入授权表。
如果你不使用该命令,你就无法使用新创建的用户来连接mysql服务器,除非你重启mysql服务器。
你可以在创建用户时,为用户指定权限,在对应的权限列中,在插入语句中设置为 'Y' 即可,用户权限列表如下:
Select_priv
Insert_priv
Update_priv
Delete_priv
Create_priv
Drop_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv
Grant_priv
References_priv
Index_priv
Alter_priv
另外一种添加用户的方法为通过SQL的 GRANT 命令,以下命令会给指定数据库TUTORIALS添加用户 zara ,
密码为 zara123 。
root@host# mysql -u root -p
Enter password:*******
mysql> use mysql;
Database changed
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON TUTORIALS.*
-> TO 'zara'@'localhost'
-> IDENTIFIED BY 'zara123';
以上命令会在mysql数据库中的user表创建一条用户信息记录。
注意: MySQL 的SQL语句以分号 (;) 作为结束标识。
/etc/my.cnf 文件配置
一般情况下,你不需要修改该配置文件,该文件默认配置如下:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
[mysql.server]
user=mysql
basedir=/var/lib
[safe_mysqld]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
在配置文件中,你可以指定不同的错误日志文件存放的目录,一般你不需要改动这些配置。
mysql -h 127.0.0.1 -P 3306 -u 账号 -p密码
show databases;
use 数据库名;
选择数据库
创建用户
mysql 8.x
create user ‘test1’@’localhost’ identified by ‘‘密码’;
flush privileges; # 刷新权限
grant all privileges on . to ‘test1’@’localhost’ with grant option; # 授权
flush privileges;
mysql -h 127.0.0.1 -P 3306 -u 账号 -p密码
show databases; // 显示所有的数据库
use lijunyang; // 进入数据库
show tables;
desc table_name;
show create table table_name;
show columns from 数据表;
show index from 数据表;
show tab status like [from db_name] [like ‘pattern’] \G;
mysql> SHOW TABLE STATUS FROM RUNOOB; # 显示数据库 RUNOOB 中所有表的信息
mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'; # 表名以runoob开头的表的信息
mysql> SHOW TABLE STATUS from RUNOOB LIKE 'runoob%'\G; # 加上 \G,查询结果按列打印
创建数据库
create DATABASE 数据库名;
mysql -h 127.0.0.1 -P 3306 -u 账号 -p密码
create DATABASE RUNOOB;
删除数据库
drop database 数据库名;
mysql -h 127.0.0.1 -P 3306 -u 账号 -p密码
drop DATABASE RUNOOB;
创建表
创建表
语法:CREATE TABLE table_name (column_name column_type);
IF NOT EXISTS 判断表是否存在
AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
ENGINE 设置存储引擎,CHARSET 设置编码。
INT UNSIGNED 无符号int0
CREATE TABLE IF NOT EXISTS `user` (
`userId` int(18) UNSIGNED NOT NULL AUTO_INCREMENT,
`userName` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`Telephone` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT '',
`createTime` datetime NOT NULL,
`updatePasswordTime` datetime NOT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `historyPass` (
`userId` int(18) NOT NULL,
`updatePasswordTime` datetime NOT NULL,
`password` varchar(255) NOT NULL,
PRIMARY KEY (`userId`),
CONSTRAINT `FK_ID` FOREIGN KEY (`userId`) REFERENCES `user` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
删除表
drop table table_name; 删除表
MySQL常用命令
查询自增值,photos为数据库名,tableName为表名
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_schema=’photos’ and table_name=”tableName”;
修改自增键初始值
alter table table_name auto_increment=n;
注意n只能大于已有的auto_increment的整数值,小于的值无效.
新增数据
INSERT INTO user
(userName,password,Telephone,email,createTime,updatePasswordTime) VALUES (‘账号’,’密码’,’1891605’,’@163.com’,’2018-06-24 22:28:00’,’2018-06-24 22:28:00’)
select * from goods_list;
select * from goods_list limit 0,10; // 分页查询,第1页,10条
select * from goods_list g, fileSavePath f where g.pathId = f.fileId; // 多表联合查询
select from runoob_tbl where runoob_author like ‘%COM’; // LIKE与%号配合使用,查找COM的内容的数据
select * from tablename order by field1, [field2…] [ASC | [DESC]]; // order by 字段名 升序 | 降序_
UNION 连接 两个select
_MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会默认删除重复的数据。
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT] // ALL 会删除重复,DISTINCT 不会删除重复
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
mysql> set names utf8;
mysql> SELECT * FROM employee_tbl;
+----+--------+---------------------+--------+
| id | name | date | singin |
+----+--------+---------------------+--------+
| 1 | 小明 | 2016-04-22 15:25:33 | 1 |
| 2 | 小王 | 2016-04-20 15:25:47 | 3 |
| 3 | 小丽 | 2016-04-19 15:26:02 | 2 |
| 4 | 小王 | 2016-04-07 15:26:14 | 4 |
| 5 | 小明 | 2016-04-11 15:26:40 | 4 |
| 6 | 小明 | 2016-04-04 15:26:54 | 2 |
+----+--------+---------------------+--------+
6 rows in set (0.00 sec)
mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
+--------+----------+
| name | COUNT(*) |
+--------+----------+
| 小丽 | 1 |
| 小明 | 3 |
| 小王 | 2 |
+--------+----------+
3 rows in set (0.01 sec)
使用 WITH ROLLUP
WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)。
例如我们将以上的数据表按名字进行分组,再统计每个人登录的次数:
mysql> SELECT name, SUM(singin) as singin_count FROM
employee_tbl GROUP BY name WITH ROLLUP;
+--------+--------------+
| name | singin_count |
+--------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| NULL | 16 |
+--------+--------------+
4 rows in set (0.00 sec)
其中记录 NULL 表示所有人的登录次数。
我们可以使用 coalesce 来设置一个可以取代 NUll 的名称,coalesce 语法:
select coalesce(a,b,c);
参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null
,则返回为null(没意义)。
以下实例中如果名字为空我们使用总数代替:
mysql> SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl
GROUP BY name WITH ROLLUP;
+--------------------------+--------------+
| coalesce(name, '总数') | singin_count |
+--------------------------+--------------+
| 小丽 | 2 |
| 小明 | 7 |
| 小王 | 7 |
| 总数 | 16 |
+--------------------------+--------------+
4 rows in set (0.01 sec)
DELETE FROM table_name [WHERE Clause]
UPDATE tablename SET variablename = value [where variablename = value]
select * from goods_list g limit 0,1 #分页返回
select * from goods_list order by goodsId DESC limit 0,3; #升序
select * from goods_list order by goodsId ASC limit 0,3; #降序
## 修改表结构
## ALTER TABLE 表名 MODIFY 列名 数据类型
ALTER TABLE user MODIFY userId int(18) UNSIGNED NOT NULL;
## ALTER TABLE 表名 CHANGE 原列名 新列名 数据类型 ## 修改表结构,可以重命名字段名
ALTER TABLE user CHANGE userId UserId int(18) UNSIGNED NOT NULL;
## ALTER TABLE 表名 DROP 列名 ## 删除一个字段
## ALTER TABLE 表名 ADD 列名 数据类型 ## 新增一个字段
## 设置字段默认值,方法一,就不会有NULL了
ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100;
## 设置字段默认值,方法二
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | 1000 | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
## 删除掉default
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
### 创建表
CREATE TABLE `historyPass` (
`userId` int(18) UNSIGNED NOT NULL,
`updatePasswordTime` datetime NOT NULL,
`password` varchar(255) NOT NULL,
PRIMARY KEY (`userId`),
CONSTRAINT `FK_ID` FOREIGN KEY (`userId`) REFERENCES `user` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
## 查询用此表字段做外键的表信息
select
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
from INFORMATION_SCHEMA.KEY_COLUMN_USAGE
where CONSTRAINT_SCHEMA ='lijunyang' AND
REFERENCED_TABLE_NAME = 'user';
## 添加外键
SET FOREIGN_KEY_CHECKS=0;
alter table class_list add constraint `FK_TEACHERID` foreign key(`t_id`)
references teacher_list(`t_id`);
SET FOREIGN_KEY_CHECKS=1;
## 删除外键 FK_ID是外键名,tableName是表名
alter table tableName drop foreign key FK_ID;
## 修改表类型
mysql> ALTER TABLE testalter_tbl ENGINE = MYISAM;
mysql> SHOW TABLE STATUS LIKE 'testalter_tbl'\G
*************************** 1. row ****************
Name: testalter_tbl
Type: MyISAM
Row_format: Fixed
Rows: 0
Avg_row_length: 0
Data_length: 0
Max_data_length: 25769803775
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2007-06-03 08:04:36
Update_time: 2007-06-03 08:04:36
Check_time: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
###修改表名
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
## 索引
Mysql 连接查询
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。 ``` mysql> use RUNOOB; Database changed mysql> SELECT * FROM tcount_tbl; +———————-+———————+ | runoob_author | runoob_count | +———————-+———————+ | 菜鸟教程 | 10 | | RUNOOB.COM | 20 | | Google | 22 | +———————-+———————+ 3 rows in set (0.01 sec)
mysql> SELECT * from runoob_tbl; +—————-+———————-+———————-+————————-+ | runoob_id | runoob_title | runoob_author | submission_date | +—————-+———————-+———————-+————————-+ | 1 | 学习 PHP | 菜鸟教程 | 2017-04-12 | | 2 | 学习 MySQL | 菜鸟教程 | 2017-04-12 | | 3 | 学习 Java | RUNOOB.COM | 2015-05-01 | | 4 | 学习 Python | RUNOOB.COM | 2016-03-06 | | 5 | 学习 C | FK | 2017-04-05 | +—————-+———————-+———————-+————————-+ 5 rows in set (0.01 sec)
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
+——————-+————————-+————————+ | a.runoob_id | a.runoob_author | b.runoob_count | +——————-+————————-+————————+ | 1 | 菜鸟教程 | 10 | | 2 | 菜鸟教程 | 10 | | 3 | RUNOOB.COM | 20 | | 4 | RUNOOB.COM | 20 | +——————-+————————-+————————+ 4 rows in set (0.00 sec)
以上 SQL 语句等价于: mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a, tcount_tbl b WHERE a.runoob_author = b.runoob_author; +——————-+————————-+————————+ | a.runoob_id | a.runoob_author | b.runoob_count | +——————-+————————-+————————+ | 1 | 菜鸟教程 | 10 | | 2 | 菜鸟教程 | 10 | | 3 | RUNOOB.COM | 20 | | 4 | RUNOOB.COM | 20 | +——————-+————————-+————————+ 4 rows in set (0.01 sec)
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author; +——————-+————————-+————————+ | a.runoob_id | a.runoob_author | b.runoob_count | +——————-+————————-+————————+ | 1 | 菜鸟教程 | 10 | | 2 | 菜鸟教程 | 10 | | 3 | RUNOOB.COM | 20 | | 4 | RUNOOB.COM | 20 | | 5 | FK | NULL | +——————-+————————-+————————+ 5 rows in set (0.01 sec)
mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author; +——————-+————————-+————————+ | a.runoob_id | a.runoob_author | b.runoob_count | +——————-+————————-+————————+ | 1 | 菜鸟教程 | 10 | | 2 | 菜鸟教程 | 10 | | 3 | RUNOOB.COM | 20 | | 4 | RUNOOB.COM | 20 | | NULL | NULL | 22 | +——————-+————————-+————————+ 5 rows in set (0.01 sec)
<a name="rWj7o"></a>
## Mysql NULL值得处理
mysql> create table runoob_test_tbl -> ( -> runoob_author varchar(40) NOT NULL, -> runoob_count INT -> ); Query OK, 0 rows affected (0.05 sec) mysql> INSERT INTO runoob_test_tbl (runoob_author, runoob_count) values (‘RUNOOB’, 20); mysql> INSERT INTO runoob_test_tbl (runoob_author, runoob_count) values (‘菜鸟教程’, NULL); mysql> INSERT INTO runoob_test_tbl (runoob_author, runoob_count) values (‘Google’, NULL); mysql> INSERT INTO runoob_test_tbl (runoob_author, runoob_count) values (‘FK’, 20);
mysql> SELECT * from runoob_test_tbl; +———————-+———————+ | runoob_author | runoob_count | +———————-+———————+ | RUNOOB | 20 | | 菜鸟教程 | NULL | | Google | NULL | | FK | 20 | +———————-+———————+ 4 rows in set (0.01 sec)
以下实例中你可以看到 = 和 != 运算符是不起作用的:
mysql> SELECT FROM runoob_test_tbl WHERE runoob_count = NULL; Empty set (0.00 sec) mysql> SELECT FROM runoob_test_tbl WHERE runoob_count != NULL; Empty set (0.01 sec)
查找数据表中 runoob_test_tbl 列是否为 NULL,必须使用 IS NULL 和 IS NOT NULL,如下实例:
mysql> SELECT FROM runoob_test_tbl WHERE runoob_count IS NULL; mysql> SELECT from runoob_test_tbl WHERE runoob_count IS NOT NULL;
<a name="SHc3U"></a>
## select 去重查询
select distinct type from i18n_config
The solution is: [ RowDataPacket { type: ‘ar’ }, RowDataPacket { type: ‘de’ }, RowDataPacket { type: ‘en’ }, RowDataPacket { type: ‘es’ }, RowDataPacket { type: ‘fr’ }, RowDataPacket { type: ‘it’ }, RowDataPacket { type: ‘pt’ }, RowDataPacket { type: ‘th’ }, RowDataPacket { type: ‘vi’ } ]
<a name="C6MPo"></a>
## MySQL 正则表达式
| 模式 | 描述 |
| --- | --- |
| ^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\\n' 或 '\\r' 之后的位置。 |
| $ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\\n' 或 '\\r' 之前的位置。 |
| . | 匹配除 "\\n" 之外的任何单个字符。要匹配包括 '\\n' 在内的任何字符,请使用象 '[.\\n]' 的模式。 |
| [...] | 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 |
| [^...] | 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 |
| p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 |
| * | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
| + | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
| {n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
| {n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
<a name="RvDdF"></a>
### 实例
了解以上的正则需求后,我们就可以根据自己的需求来编写带有正则表达式的SQL语句。以下我们将列出几个小实例(表名:person_tbl )来加深我们的理解:<br />查找name字段中以'st'为开头的所有数据:
以st开头 mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘^st’; 以ok结束 mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘ok$’; 包含mar mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘mar’; 以元音字母开头或ok结尾 mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘^[aeiou]|ok$’;
<a name="rlHBg"></a>
## 创建索引
索引就相当于图书馆的分类卡片,可以增加查找的速度,但是会降低insert, update, delete操作的时间,索引必须在where的子语句里。
<a name="t238z"></a>
### 查看与删除唯一索引
```javascript
show index from table_name;
DROP INDEX [唯一索引名称] ON "表名";
创建唯一索引
## 创建索引
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
## 修改表,添加索引
ALTER table tableName ADD INDEX indexName(columnName)
## 创建表时,添加索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
## 删除索引
DROP INDEX [indexName] ON mytable;
###唯一索引
### 它与前面的普通索引类似,不同的就是:索引列的值必须唯一,
### 但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
## 创建唯一索引
## unique_md5_index 是索引名称 ,i18n_config是表名,unique_md5是字段名
create unique index unique_md5_index on i18n_config (unique_md5);
## 修改唯一索引
ALTER table mytable ADD UNIQUE [indexName] (username(length))
## 创建表时,创建唯一索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
);
###使用ALTER 命令添加和删除索引
##有四种方式来添加数据表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list):
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list):
这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list):
添加普通索引,索引值可出现多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):
该语句指定了索引为 FULLTEXT ,用于全文索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
## 显示索引信息
mysql> SHOW INDEX FROM table_name; \G
........
使用ALTER命令添加字段,删除字段与修改字段
ALTER TABLE table_name ADD column_name datatype comment ‘描述’;
ALTER TABLE table_name ADD column_name datatype comment '描述';
// 注意 :某些数据库系统不允许这种在数据库表中删除列的方式 (DROP COLUMN column_name)。
ALTER TABLE table_name DROP COLUMN column_name;
ALTER TABLE table_name modify COLUMN column_name datatype;
使用 ALTER 命令添加和删除主键
mysql> ALTER TABLE table_name MODIFY column_name INT NOT NULL;
mysql> ALTER TABLE table_name ADD PRIMARY KEY (column_name);
mysql> ALTER TABLE table_name DROP PRIMARY KEY;
查询表存在不存在
show index from table_name;
求表total合计
select count(id) from tableName;
select count(DISTINCT id) from tableName;
select id, count(*) as count from tableName group by id having count > 1; // 查重
bigInt 超长问题
把超长的字段转换成string
select CONVERT(spu_id, CHAR), xxx_table.* from xxx_table
insert,存在则更新,不存在则新增
SQL中的ON DUPLICATE KEY UPDATE使用详解
注意:想要使用该语法,必须利用“唯一索引”或者“主键索引”,只有产生“索引冲突”,该语法才能正常生效。
CREATE TABLE `testMfc` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`age` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`num` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_01` (`age`,`name`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4
注意:想要使用该语法,必须利用“唯一索引”或者“主键索引”,只有产生“索引冲突”,该语法才能正常生效。
此处建立唯一索引:age列和name列
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE t1 SET c=c+1 WHERE a=1;
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
(1)使用ALTER TABLE语句创建索性
应用于表创建完毕之后再添加。
ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名)
//普通索引
alter table table_name add index index_name (column_list) ;
//唯一索引
alter table table_name add unique (column_list) ;
//主键索引
alter table table_name add primary key (column_list) ;
删除索引可以使用ALTER TABLE或DROP INDEX语句来实现。DROP INDEX可以在ALTER TABLE内部作为一条语句处理,其格式如下:
drop index index_name on table_name ;
alter table table_name drop index index_name ;
alter table table_name drop primary key ;
select where 大小写问题
# 默认情况下,where 是不区分大小写的
select * from tableName where binary name = "Fans"