一、MYSQL 安装
下载完后,我们将 zip 包解压到相应的目录,这里我将解压后的文件夹放在 C:\web\mysql-8.0.15-winx64 下。
打开刚刚解压的文件夹 C:\web\mysql-8.0.15-winx64,在该文件夹下创建 my.ini 配置文件,编辑 my.ini 配置以下基本信息:
[mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] # 设置3306端口 port = 3306 # 设置mysql的安装目录 basedir=C:\\web\\mysql-8.0.11 # 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错 # datadir=C:\\web\\sqldata # 允许最大连接数 max_connections=20 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB
1.以管理员身份打开 cmd 命令行工具,切换目录:
cd C:\web\mysql-8.0.15-winx64\bin
2.初始化数据库:
mysqld --initialize --console
3.输入以下安装命令:
mysqld install
4.启动输入以下命令即可:
net start mysql
注意: 在 5.7 需要初始化 data 目录:
cd C:\web\mysql-8.0.15-winx64\bin
mysqld --initialize-insecure
初始化后再运行 net start mysql 即可启动 mysql。
二、登录 MySQL
mysql -h 主机名 -u 用户名 -p
参数说明:
- -h : 指定客户端所要登录的 MySQL 主机名, 登录本机(localhost 或 127.0.0.1)该参数可以省略;
- -u : 登录的用户名;
- -p : 告诉服务器将会使用一个密码来登录, 如果所要登录的用户名密码为空, 可以忽略此选项。
如果我们要登录本机的 MySQL 数据库,只需要输入以下命令即可:
mysql -u root -p
按回车确认, 如果安装正确且 MySQL 正在运行, 会得到以下响应: 密码:w9V9V)#+!r0u
Enter password:
若密码存在, 输入密码登录, 不存在则直接按回车登录。登录成功后你将会看到 Welecome to the MySQL monitor... 的提示语。
然后命令提示符会一直以 mysq> 加一个闪烁的光标等待命令的输入, 输入 exit 或 quit 退出登录。
三、MYSQL连接
以下是从命令行中连接mysql服务器的简单实例:
[root@host]# mysql -u root -p
Enter password:******
在登录成功后会出现 mysql> 命令提示窗口,你可以在上面执行任何 SQL 语句。
使用 PHP 脚本连接 MySQL
mysqli_connect(host,username,password,dbname,port,socket);
参数描述
四、创建数据库
CREATE DATABASE 数据库名;
使用 mysqladmin 创建数据库
mysql> create DATABASE RUNOOB;
使用普通用户,你可能需要特定的权限来创建或者删除 MySQL 数据库。
所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 mysql mysqladmin 命令来创建数据库。
以下命令简单的演示了创建数据库的过程,数据名为 RUNOOB:
[root@host]# mysqladmin -u root -p create RUNOOB
Enter password:******
以上命令执行成功后会创建 MySQL 数据库 RUNOOB。
使用root登录后,可以使用
CREATE DATABASE IF NOT EXISTS RUNOOB DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
创建数据库,该命令的作用:
- 如果数据库不存在则创建,存在则不创建。
- 创建RUNOOB数据库,并设定编码集为utf8
五、删除数据库
删除数据库
drop database <数据库名>
mysql> drop database RUNOOB;
使用 mysqladmin 删除数据库
[root@host]# mysqladmin -u root -p drop RUNOOB Enter password:******
使用PHP脚本删除数据库
mysqli_query(connection,query,resultmode);
六、选择数据库
mysql 选择数据库
eg: mysql -uroot -p 123456 mysql>use RUNOOB
就此就选择了 RUNOOB数据库,在后续的操作中,都是在RUNOOB中执行,
注意:所有的字段,表名,都是区分大小写的
使用php脚本选择mysql 数据库
mysql\_select\_db(connection,dbname)
eg:
七、mysql 数据类型
一个字符占多少长度与编码有关
UTF-8:一个汉字=3个字节
GBK:一个汉字=2个字节
2、varchar(n) 表示 n 个字符,无论汉字和英文,Mysql 都能存入 n 个字符,仅是实际字节长度有所区别
3、MySQL 检查长度,可用 SQL 语言来查看:
select LENGTH(fieldname) from tablename
整型
取值范围如果加了 unsigned,则最大值翻倍,如 tinyint unsigned 的取值范围为(0~255)。
2、浮点型(float 和 double)
设一个字段定义为 float(5,3),如果插入一个数 123.45678,实际数据库里存的是 123.457,但总个数还以实际为准,即 6 位。
3、定点数
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
decimal(m,d) 参数 m<65 是总个数,d<30 且 d<m 是小数位。
4、字符串(char,varchar,_text)
char 和 varchar:
- 1.char(n) 若存入字符数小于n,则以空格补于其后,查询之时再将空格去掉。所以 char 类型存储的字符串末尾不能有空格,varchar 不限于此。
- 2.char(n) 固定长度,char(4) 不管是存入几个字符,都将占用 4 个字节,varchar 是存入的实际字符数 +1 个字节(n<=255)或2个字节(n>255),所以 varchar(4),存入 3 个字符将占用 4 个字节。
- 3.char 类型的字符串检索速度要比 varchar 类型的快。
varchar 和 text:
1.varchar 可指定 n,text 不能指定,内部存储 varchar 是存入的实际字符数 +1 个字节(n<=255)或 2 个字节(n>255),text 是实际字符数 +2 个字节。
2.text 类型不能有默认值。
3.varchar 可直接创建索引,text 创建索引要指定前多少个字符。varchar 查询速度快于 text, 在都创建索引的情况下,text 的索引似乎不起作用。
5.二进制数据(_Blob)
1._BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写。
2._BLOB存储的数据只能整体读出。
3._TEXT可以指定字符集,_BLO不用指定字符集。
6.日期时间类型
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
数据类型的属性
八、mysql 创建数据表
mysql 创建数据表,需要以下信息
1.表名,
2.表字段名,
3.定义每个表字段
创建mysql数据表的语法
CREATE TABLE table_name (column_name column_type);
eg: RUNOOB 数据库中创建数据表runoob_tbl:
mysql> CREATE TABLE runoob_tbl( -> runoob_id INT NOT NULL AUTO_INCREMENT, -> runoob_title VARCHAR(100) NOT NULL, -> runoob_author VARCHAR(40) NOT NULL, -> submission_date DATE, -> PRIMARY KEY ( runoob_id ) -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
php脚本创建表
mysqli_query(connection,query,resultmode);
查询表字段
desc <表名>
八、删除数据表
语法
DROP TABLE table\_name ;
使用PHP脚本删除数据表、
mysqli\_query(connection,query,resultmode);
![](https://img-hello-world.oss-cn-beijing.aliyuncs.com/b453e8c1aa90a1057811f51b0de43508.png)
删除表内数据,用delete,格式为:
delete from 表名 where 删除条件
eg:删除学生表内姓名为张三的记录
delete from student where t\_name = "张三";
清除表内数据,保存表结构,用truncate.格式为:
truncate table 表名;
eg:清除学生表内的所有数据
truncate table student;
删除表用drop,就是啥都没了,格式为:
drop table 表名
eg:删除学生表
drop table student;
1、当你不需要该表时,用drop
2、当你仍要保留该表,但是要删除所有记录时,用truncate;
3、当你删除部分记录时,用delete.
九、mysql插入数据
语法
INSERT INTO table\_name (field1,field2,...fieldN) VALUES(value1,value2,..valueN)
如果数据是字符型,必须使用单引号或者双引号,如:"value"。
eg: INSERT INTO runoob\_tbl
(runoob\_title,runoob\_author,submission\_date)
VALUES
('study php','cainiao',NOW());
读取数据表
select \* from runoob\_tbl;
使用php脚本插入数据
mysqli\_query(connection,query,resultmode);
![](https://img-hello-world.oss-cn-beijing.aliyuncs.com/7664ecf8ad54a49ea41023d380796182.png)
十、mysql 查询数据
语法:
SELECT column\_name,column\_name From table\_name \[WHERE Clause\] \[LIMIT N\] \[OFFSET M\]
查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件
SELECT 命令可以读取一条或者多条记录
你可以使用星号(*)来代替其他字段,SELECT 语句会返回表的所有字段数据
你可以使用WHERE 语句来包含任何条件
你可以使用LIMIT 属性来设定返回的记录数
你可以通过OFFSET指定SELECT 语句开始查询的数据偏移量,默认情况下偏移量为0
十一、mysql where 子句
语法:
SElECT field1,field2,...fieldN, FROM table\_name1,table\_name2..
\[WHERE condition1 \[AND \[OR\]\] condition2...\]
查询语句你可以使用一个或者多个表,表之间用,隔开,并使用where 语句来设定查询条件
你可以在where 子句中指定任何条件
你可以使用AND 或者 OR 指定一个或多个条件
WHERE子句也可以运用于SQL的DELETE 或者UPDATE 命令
WHERE 子句类似于程序语言中的if 条件,根据mysql表中的字段值来读取指定的数据
where 子句的操作符
使用主键来作为WHERE子句的条件查询是非常快速的
如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据
eg:select * from runoob_tbl where runoob_author='cainiao';
mysql 的where 子句的字符串比较式不区分大小写的,你可以使用BINARY 来设定where子句的字符串比较是区大小写的
十二、mysql update查询
语法:
UPDATE table\_name SET field1= new -value1,field2=new -value2
\[WHERE Clause\]
你可以同时更新一个或多个字段
你可以在WHERE 子句中指定任何条件
你可以在一个表中同时更新数据
当你需要更细数据表中指定行的数据时,WHERE子句是非常有用的。
eg: UPDATE runoob\_tbl SET runoob\_title='study c++' WHERE runoob\_id=3;
再次查询:select \* from runoob\_tbl WHERE runoob\_id=3;
update 语句可用来修改表中的数据,简单来说基本的使用形式为:
update 语句可用来修改表中的数据, 简单来说基本的使用形式为:
update 表名称 set 列名称=新值 where 更新条件;
十三、mysql delete 语句
语法
DELETE FROM table\_name \[WHERE Clause\]
如果没有指定WHERE子句,mysql 表中所有的记录将被删除
你可以在WHERE子句中指定任何条件
您可以在单个表中一次性删除记录
eg:delete from runoob\_tbl where runoob\_id=1;
delete from 表名称 where 删除条件
delete drop truncate 都有删除表的作用,区别在于:
delete 和 truncate 仅仅删除表输几局,drop连表数据表结构一起删除,delete 是单杀,truncate是团灭,drop是把电脑摔了
十四、mysql LIKE
意义:有时后我们需要获取runoob\_author 字段含有"com"字符的所有记录,这是我们就需要再WHERE 子句中使用SQL LIKE子句
语法;
select field1,field2,field3...fieldN, from table\_name where field1,LIKE condition \[AND\[OR\]\] filed2 ='somevalue'
LIKE 通常与%一同使用,类似于一个元字符的搜索
![](https://img-hello-world.oss-cn-beijing.aliyuncs.com/7823108362e9853a3f4c5aadc480be85.png)
like 匹配/模糊匹配,会与%和\_结合使用
‘![](https://img-blog.csdnimg.cn/20190222125314289.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RoYW5rc3pteQ==,size_16,color_FFFFFF,t_70)’
十五、MYSQL UNION 操作符
mysql union 操作符用于连接2个以上的select 语句的结果组合到一个结果结合中去,多个select 语句会删除重复的数据
select expression1,expression2,expression3,,,expression\_n from tables; \[where conditions\] union \[all |distinct\] select expression1,expression2,,,expression\_n FROM tables; \[WHERE conditions\]
expression1,expression2,expressionn,要检索的列
tables; 要检索到的数据表
where conditions:可选,检索条件
DISINCT:可选,删除结果集中重复的数据,默认情况下UNION操作符已经删除了重复数据,所以DISTINCT 修饰符对结果没啥影响
ALL:可选,返回所有结果集,包含重复数据,
eg: select country from websites
union all
select country from apps;
order by country
UNION 语句:用于将不同表中相同列中查询的数据展示出来(不包括重复数据)
UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来 (包括重复数据)
SELECT 列名称 FROM 表名称 UNION SELECT 列名称 FROM 表名称 ORDER BY 列名称
SELECT 列名称 FROM 表名称 UNION ALL SELECT 列名称 FROM 表名称 ORDER BY 列名称
十六、mysql 排序
select field1,field2,..fieldn table\_name1 table\_name2... order by field1,field2,\[field2...\]\[ASC \[DESC\]\]
你可以使用任何条件来作为排序的条件,从而返回排序后的查询结果
你可以设定多个字段来排序,
你可以使用ASC或者DESC 关键字来设定查询结果,是按升序或者降序排列,
你可以添加where...like 子句来设置条件
eg:select \* from runoob\_tbl order by submission\_date ASC
mysql 拼音排序,如果字符集采用的是gbk(汉字编码字符集,直接在查询语句中后面添加order by
select \* from runoob\_tbl
order by runoob\_title;
如果字符集采用的是urtf8,需要先对字段进行转码然后排序
select \* from runoob\_tbl order by convert(runoob\_title using gbk);
十七、mysql GROUP BY
GROUP BY 语句根据一个或者多个列对结果进行分组
selelct column\_name ,function(column) FROM table\_name WHERE column\_name operator value GROUP BY column\_name;
group by 可以实现一个最简单的去重查询,假设想看下有哪些员工,除了用distinct 外,还可以用
select name from employee\_tbl group by name;
返回的结果集就是所有员工的名字
分组后的条件使用HAVING 来限定,where 是对原始数据进行条件限制,几个关键字的使用顺序为where、
group by having,order by
select name,sum(\*) from employee\_tbl where id <> 1 group by name HAVing sum(\*) >5 order by sum(\*) desc;
![](https://img-blog.csdnimg.cn/20190224115835518.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3RoYW5rc3pteQ==,size_16,color_FFFFFF,t_70)
十八、mysql 连接的使用
INNER JOIN(内连接,或等值连接) 获取两个表中字段匹配的记录
LEFT JOIN (左连接) 获取左表所有记录,及时右表没有对应匹配的记录
RIGHT JOIN(右连接) 与left join 想反,用于获取右表所有记录,即使左表没有对应匹配的记录
eg: select a.runoob_id,a.runoob_author,b.runoob_count from runoob_tbl a,tcount_tbl b where a.runoob_author = b.runoob_author
十九、mysql null值处理
is null :当列的值是null ,此运算符返回true
is not null 当列的值不为null ,运算符返回true,
二十、mysql 正则表达
![](https://img-hello-world.oss-cn-beijing.aliyuncs.com/2de79e2a3743a3fb3510fdaceec09220.png)
eg:
查找name 字段中以‘st’ ,为开头的所有数据
select name FROM person\_tbl where name REGEXP '^st'
查找name 字段中以‘ok’ 为结尾的所有数据
select name FROM person\_tbl where name REGEXP 'ok$',
查找name 字段中包含‘mar’ 字符串中的所有数据
select name from person\_tbl where name REGEXP 'mar'
查找name 字段中以元音字符开头或以‘ok’ 字符串结尾的所有数据
select name from person\_tbl whree name REGEXP '^\[aeiou\] | ok$';
二十一、mysql 事务
![](https://img-hello-world.oss-cn-beijing.aliyuncs.com/578fa5f88a0f3962f23b882968170c6b.png)
二十二、mysql alert 命令
MYSQL 需要修改数据表名,或者修改数据字段时,就需要用到mysql alter 命令
create table testalter_tbl
(
i INT,
c char(1)
)
show columns from testalter_tbl;
删除、添加或者修改字段
alter table testalter_tbl drop i;
如果只剩余一个字段,则无法使用drop 删除字段
mysql 中使用add 子句来向数据表中添加列,如下列在表testalter_tbl中添加i字段,并定义数据类型
ALTER TABLE testalter_tbl ADD i INT;
如果要指定新增字段的位置,可以使用mysql 提供的的关键字first,alter 字段名
尝试以下alter table 语句,在执行成功后,使用show columns 查看表结构变化
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT AFTER c;
修改字段类型及名称
如果需要修改字段类型及名称,你可以在ALTER命令中使用modify 或change 子句来向数据表中添加列,如下列在表testalter_tbl中添加i字段,并定义数据类
ALTER TBALE testalter_tbl MODIFY c CHAR(10);
使用CHANGE 子句,语法有很大的不同,在CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段及名称
ALTER TABLE testalter_tbl CHANGE i j BIGINT;
ALTER TABLE testalter_tbl CHANGE j j INT;
ALTER TABLE 对NULL值和默认值的影响
eg:指定字段j为not null 且默认值为100
ALTER TABLE testalter_tbl
MODIFY j BIGINT NOT NULL DEFAULT 100;
如果不设置默认值,mysql 会自动设置改字段默认值为null,
修改字段默认值
--可以使用alter 来修改字段的默认值,
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
SHOW COLUMNS FROM testalter_tbl;
你可以使用ALTER 命令及DROP 自己来删除字段的默认值
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
SHOW COLUMNS FROM testalter_tbl;
修改数据表类型,可以使用alter命令及type子句来完成,尝试以下实例,我们将表testalter_tbl的类型修改为MYISAM;
ALTER TABLE testalter_tbl ENGINE = MYISM;
SHOW TABLE STATUS LIKE 'testalter_tbl';
修改表名
如果需要修改数据表的名称,可以在ALTER TABLE 语句中使用rename子句来实现
eg:ALTER TABLE testalter_tbl RENAME TO alter_tbl;
alter 其他用途:
修改存储引擎,修改为myisam;
alter table tableName engine = myisam;
删除外键约束,keyName 是外键别名
alter table tableName drop foreign key keyName;
修改字段的相对位置:这里name1为想要修改的字段,type1为该字段原来类型 ,first和alter 二选一
这应该显而易见,first 放在第一位,after 放在name2 字段后面
alter table tableName modify name1 type1 first|after name2;
mysql 索引
索引可以大大提高mysql 的检索速度;
创建索引时你需要确保该索引时应用在sql 查询语句的条件
普通索引
创建索引
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;
唯一索引
创建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
修改表结构
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之外)
ALTER TABLE tbl\_name ADD INDEX index\_name(column\_list)添加普通索引,索引值可出现多次
ALTER TABLE tbl\_name ADD FULLTEXT index\_name(column\_list);该语句指定了索引为FULLTEXT ,用于全文索引
eg:
ALTER TABLE testalter\_tbl ADD INDEX(c);
还可以在alter 命令中使用drop 子句来删除索引,
eg: ALTER TABLE testalter\_tbl DROP INDEX c;
使用ALTER 命令添加和删除主键
--主键只能作用于一个列上,添加主键索引时,你要确保该主键默认不能为空(not null)
ALTER TABLE testalter\_tbl MODIFY i INT NOT NULL;
ALTER TABLE testalter\_tbl ADD PRIMARY KEY(i);
也可以使用ALTER 命令删除主键
ALTER TABLE testalter\_tbl DROP PRIMARY KEY;
删除主键时,只需指定PRIMARY KEY 但在删除索引时,你必须知道索引名
显示索引信息
--可以使用show index 命令来列出表中的相关的索引信息,可以通过添加G\\来格式化输出信息
SHOW INDEX FROM table\_name; \\G
MYSQL 临时表
当php执行完成之后,该临时表也会自动销毁
--创建mysql 临时表 saleSummary
CREATE TEMPORARY TBALE SaleSumary (
product_name VARCHAR(50) NOT NULL,
total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00,
total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
);
INSERT INTO SaleSumary
(product_name,total_sales,avg_unit_price,total_units_sold)
VALUES
('cucumber',100.25,90,2)
当使用show tables 命令系那是数据表列表时,你将无法看懂SalesSummary 表
当你退出 当前mysql 会话,再使用select 来读取原来创建的临时表那你会发现没有该表的存在。
--删除mysql 临时表
CREATE TEMPORARY TABLE SaleSumary(
product\_name VARCHAR(50) NOT NULL,
total\_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00,
avg\_unit\_price DECIMAL(7,2) NOT NULL DEFAULT 0.00,
total\_units\_sold INT UNSIGNED NOT NULL DEFAULT 0
);
INSERT INTO saleSummary
(product\_name,total\_sales,avg\_unit\_price,total\_units\_sold)
VALUES
('cucumber',100.25,90,2);
DROP TABLE saleSummary
SELECT \* FROM SaleSumary;
--MYSQL 复制表
使用SHOW CREATE TABLE 命令获取创建数据表(create table),该语句包含了数据表的结构,索引等
如果你想复制表的内容,你就可以使用INSERT INTO ...SELECT 语句来实现
复制完整表的的方法
CREATE TABLE targetTable LIKE sourceTable ;
INSERT INTO targetTable SELECT * FROM sourceTable;
其他:
可以拷贝一个表中的一些字段
CREATE TABLE newadmin AS
(
SELECT username,password FROM admin
)
可以将新建的表的字段改名
CREATE TABLE newadmin AS
(
SELECT id,username AS uname,password AS pass FROM admin
)
可以拷贝一部分数据
CREATE TABLE newadmin AS
(
SELECT \* FROM admin WHERE LEFT(username,1) = 's'
)
可以在创建表的同时定义表中的字段信息
CREATE TABLE newadmin
(
id INTEGERR NOT NULL AUTO\_INCREMENT PRIMARY KEY
)
AS
(
SELECT \* FROM admin
)
mysql 复制表结构到新表
create table 新表 select \* from 旧表 where 1 =2
或者 create table 新表 like 旧表
create table 新表 select \* from 旧表
--MYSQL 序列使用
使用函数创建自增序列管理表
第一步,创建Sequence 管理表 sequence;
DROP TABLE IF EXISTS sequence;
CREATE TABLE sequence (
name VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
PRIMARY KEY (name)
) ENGINE=InnoDB;
第二步:创建取当前值的函数 currval
DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE value INTEGER;
SET value = 0;
SELECT current_value INTO value
FROM sequence
WHERE name = seq_name;
RETURN value;
END
$
DELIMITER ;
第三步:创建取下一个值的函数 nextval
DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
UPDATE sequence
SET current_value = current_value + increment
WHERE name = seq_name;
RETURN currval(seq_name);
END
$
DELIMITER;
第四步:创建更新当前值的函数 setval
DROP FUNCTION IF EXISTS setval;
DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
RETURNS INTEGER
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
UPDATE sequence
SET current_value = value
WHERE name = seq_name;
RETURN currval(seq_name);
END
$
DELIMITER ;
测试函数功能
INSERT INTO sequence VALUES ('TestSeq', 0, 1);
----添加一个sequence名称和初始值,以及自增幅度 添加一个名为TestSeq 的自增序列
SELECT SETVAL('TestSeq', 10);
---设置指定sequence的初始值 这里设置TestSeq 的初始值为10
SELECT CURRVAL('TestSeq');
--查询指定sequence的当前值 这里是获取TestSeq当前值
SELECT NEXTVAL('TestSeq');
--查询指定sequence的下一个值 这里是获取TestSeq下一个值
--mysql 处理重复数据
你可以在mysql 数据表中设定的字段为PRIMARY key(主键) 或者unique(索引) 来保证数据的唯一性
eg:下面的表允许重复的值出现
CREATE TABLE person\_tbl
(
first\_name CHAR(20),
last\_name CHAR(20),
sex CHAR(10)
);
如果你想这只表中的字段first\_name ,last\_name,数据不能重复,你可以设置双主键模式来设置数据的唯一性,如果你设置了双主键,那么那个建的默认值不能为null,可设置成not null,
CREATE TABLE person\_tbl
(
first\_name CHAR(20) NOT NULL,
last\_name CHAR(20) NOT NULL,
sex CHAR(10),
PRIMARY KEY (last\_name,first\_name)
);
INSERT IGNORE INTO 与 INSERT INTO 的区别就是INSERT IGNORE会忽略数据库中已经存在的数据,如果数据库中没有数据,就插入新的数据,
INSERT IGNORE INTO person\_tbl(last\_name,first\_name)
values ('jay','Thomas');
INSERT IGNORE INTO person\_tbl (last\_name,first\_name)
values ('jay','Thomas')
INSERT IGNORE INTO 当插入数据时,子设置记录的唯一性后,如果插入重复的值,将不会反悔错误,只以警告的的形式返回,而REPLACE INTO
如果存在primary 或unique 相同记录时,则先删除掉,再插入记录
CREATE TABLE person\_tbl
(
first\_name CHAR(20) NOT NULL,
last\_name CHAR(20) NOT NULL,
sex CHAR(10),
UNIQUE (last\_name,first\_name)
)
--统计重复数据
以下,我们将统计表中first\_name ,和last\_name,的重复记录数
Select COUNT(\*) as repetitions ,last\_name,first\_name
from person\_tbl
group by last\_name,first\_name
HAVING repetitions >1;
以上查询语句将返回person\_tbl 表中重复的记录数,一般情况下,查询重复的值,请执行以下操作
确定哪一列包含的值可能会重复
在列选择列表使用COUNT(\*) 列出的那些列
在GROUP BY 子句找那个列出的列
HAVING 子句设置重复复数大于1。
过滤重复数据
如果你需要读取不重复的数据,可以在select 语句中使用DISTINCT 关键字来过滤重复的数据
select distinct last\_name,first\_name
from person\_tbl;
也可以使用GROUP BY 来读取数据表中不重复的数据;
select last\_name,first\_name
from person\_tbl
GROUP BY(last\_name,first\_name);
删除重复数据
如果你想删除重复的数据,可以使用
create table tmp select last\_name,first\_name,sex,from person\_tbl GROUP BY(last\_name,first\_name,sex);
drop table person\_tbl;
alter table tmp rename tp person\_tbl;
当然你也可以在数据中添加index(索引), 和primary key(主键),这种简单的方式来删除表中的重复记录,
alter ignore table person\_tbl
add primary key (last\_name,first\_name);
MYSQL 导出数据
--使用select ...into outfile 语句导出数据
select * from runoob_tbl
into outfile '/tmp/runoob.txt';
mysql 导入数据
1.mysql 命令导入
mysql -u 用户名 -p密码 <要导入的数据库数据(runoob.sql)
source 命令导入
create database abc 创建数据库
use abc 使用已创建的数据库
set names utf8 设置编码
source/home/abc/abc.sql 导入备份数据库
本文转自 https://blog.csdn.net/thankszmy/article/details/87364803,如有侵权,请联系删除。