MYSQL 学习笔记
对数据库的操作可分为:
1,软件的安装以及对数据库的连接
2,对数据库的处理(创建,删除,导出,导入):
3, 对数据表整体的处理(创建,删除,改名,复制,合并,修改表的类型,临时表);
4,对数据表的格式的处理(添加列,删除列,修改列名,修改列类型,设定列字段默认值,删除默认值,索引)
5,对表内数据的处理(添加,删除数据,删除重复数据,修改,排序,查找, 序列,分组)
6, 其他(函数,语法)
一 软件的安装与数据库的连接
1,安装过程我们需要通过开启管理员权限来安装,否则会由于权限不足导致无法安装。
Linux/UNIX 上安装 MySQL
Linux平台上推荐使用RPM包来安装Mysql,MySQL AB提供了以下RPM包的下载地址:
MySQL - MySQL服务器。你需要该选项,除非你只想连接运行在另一台机器上的MySQL服务器。
MySQL-client - MySQL 客户端程序,用于连接并操作Mysql服务器。
MySQL-devel - 库和包含文件,如果你想要编译其它MySQL客户端,例如Perl模块,则需要安装该RPM包。
MySQL-shared - 该软件包包含某些语言和应用程序需要动态装载的共享库(libmysqlclient.so*),使用MySQL。
MySQL-bench - MySQL数据库服务器的基准和性能测试工具。
安装前,我们可以检测系统是否自带安装 MySQL:
rpm -qa | grep mysql
如果有,可以进行卸载:
rpm -e mysql // 普通删除模式
rpm -e --nodeps mysql // 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除
2,验证安装:
[root@host]# mysqladmin --version
mysqladmin Ver 8.23 Distrib 5.0.9-0, for redhat-linux-gnu on i386//说明安装成功
3,连接:
(1)以二进制方式连接:
[root@host]# mysql -u root -p
Enter password:******
退出mysql:
mysql> exit
Bye
(2)以PHP脚本的方式连接:(命名为 connect.php)
PHP 提供了 mysqli_connect() 函数来连接数据库。mysqli_connect(host,username,password,dbname,port,socket);
用mysqli_close ( mysqli $link )断开连接
<?php
$dbhost = 'localhost:3306'; // mysql服务器主机地址,默认为3306,
$dbuser = 'root'; // mysql用户名
$dbpass = '123456'; // mysql用户名密码
// $dbname ='RUNOB'; //如果是连接到创建好的数据库mybase 需要加这句
$conn = mysqli_connect($dbhost, $dbuser, $dbpass($bdname));
if(! $conn )
{
die('Could't connect: ' . mysqli_error());
}
echo '数据库连接成功!';
?>
二,对数据库的处理(创建,删除,导出,导入);
1,创建数据库
通常查看用户的数据库用:
SHWO DATABASES;
选择数据库:用use
USE RUNOOC;
(1)语法:CREATE DATABASE 数据库名;
[root@host]# mysql -u root -p
Enter password:****** # 登录后进入终端
mysql> create DATABASE RUNOOB;
(2)以PHP脚本创建:
?php
require ‘connect.php’; // 引用上一个脚本连接数据库
$sql = 'CREATE DATABASE RUNOOB';
$retval = mysqli_query($conn,$sql );
if(! $retval )
{
die('创建数据库失败: ' . mysqli_error($conn));
}
echo "数据库 RUNOOB 创建成功\n";
mysqli_close($conn); // 关闭数据库必不可少
?>
2,删除数据库
(1)drop 命令删除数据库
语法:drop database <数据库名>;
mysql> drop database RUNOOB;
(2)PHP脚本:
<?php
require ‘connect.php’;//l连接数据库
$sql = 'DROP DATABASE RUNOOB';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('删除数据库失败: ' . mysqli_error($conn));
}
echo "数据库 RUNOOB 删除成功\n";
mysqli_close($conn);
?>
3,导出
MySQL中你可以使用SELECT…INTO OUTFILE语句来简单的导出数据到文本文件上。
mysql> SELECT * FROM runoob_tbl
-> INTO OUTFILE '/tmp/runoob.txt';
ELECT ... INTO OUTFILE 语句有以下属性:
LOAD DATA INFILE是SELECT ... INTO OUTFILE的逆操作,SELECT句法。为了将一个数据库的数据写入一个文件,使用SELECT ... INTO OUTFILE,为了将文件读回数据库,使用LOAD DATA INFILE。
SELECT...INTO OUTFILE 'file_name'形式的SELECT可以把被选择的行写入一个文件中。该文件被创建到服务器主机上,因此您必须拥有FILE权限,才能使用此语法。
输出不能是一个已存在的文件。防止文件数据被篡改。
你需要有一个登陆服务器的账号来检索文件。否则 SELECT ... INTO OUTFILE 不会起任何作用。
在UNIX中,该文件被创建后是可读的,权限由MySQL服务器所拥有。这意味着,虽然你就可以读取该文件,但可能无法将其删除。
将数据表及数据库拷贝至其他主机
$ mysqldump -u root -p database_name table_name > dump.txt
password *****
4,导入
如果你需要将备份的数据库导入到MySQL服务器中,可以使用以下命令,使用以下命令你需要确认数据库已经创建:
$ mysql -u root -p database_name < dump.txt
password *****
三,对数据表整体的处理(创建,删除,改名,复制,合并,修改表的类型,临时表);
1,创建数据表
创建MySQL数据表需要以下信息:
表名
表字段名
定义每个表字段
(1)二进制:
语法:CREATE TABLE table_name (column_name column_type);
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED 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; // DEFAULT 用于设置默认值和格式
(2)PHP脚本:
<?php
require ‘connect.php’;//连接数据库
$sql = "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; ";
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('数据表创建失败: ' . mysqli_error($conn));
}
echo "数据表创建成功\n";
mysqli_close($conn);
?>
2,删除数据表
语法:DROP TABLE table_name ;
PHP脚本:
<?php
require ‘connect.php’ ;
$sql = "DROP TABLE runoob_tbl";
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('数据表删除失败: ' . mysqli_error($conn));
}
echo "数据表删除成功\n";
mysqli_close($conn);
?>
3,修改表名
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
4,复制数据表
CREATE TABLE new_table LIKE source_table;
INSERT INTO now_table SELECT * FROM source_table;
5,合并数据表
只能合并同一个数据库中的数据表
(1)用UNION:
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。
UNION 语法:
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
//expression1, expression2, ... expression_n: 要检索的列。
tables: 要检索的数据表。
WHERE conditions: 可选, 检索条件。
DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
ALL: 可选,返回所有结果集,包含重复数据。
**(2) 用JOIN **
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
mysql> SELECT * FROM tcount_tbl;
+---------------+--------------+
| runoob_author | runoob_count |
+---------------+--------------+
| 菜鸟教程 | 10 |
| RUNOOB.COM | 20 |
| Google | 22 |
+---------------+--------------+
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 |
+-----------+---------------+---------------+-----------------+
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 |
+-------------+-----------------+----------------+
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 |
+-------------+-----------------+----------------+
使用 LEFT JOIN,该语句会读取左边的数据表 runoob_tbl 的所有选取的字段数据,即便在右侧表 tcount_tbl中 没有对应的 runoob_author 字段值。
使用了 RIGHT JOIN,该语句会读取右边的数据表 tcount_tbl 的所有选取的字段数据,即便在左侧表 runoob_tbl 中没有对应的runoob_author 字段值。
php脚本:
<?php
require 'connect.php';
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");
$sql = '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';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
while($row = mysqli_fetch_array($retval, MYSQL_ASSOC))
{
echo "<tr><td> {$row['runoob_id']}</td> ".
"<td>{$row['runoob_author']} </td> ".
"<td>{$row['runoob_count']} </td> ".
"</tr>";
}
mysqli_close($conn);
?>
6,修改数据表的类型
查看数据表类型可以使用 SHOW TABLE STATUS 语句。
mysql> SHOW TABLE STATUS LIKE 'testalter_tbl'\G
四,对数据表的格式的处理(添加列,删除列,修改列名,修改列类型,设定列字段默认值,删除默认值,索引)
1,添加列
mysql> ALTER TABLE testalter_tbl ADD i INT;
2,删除列
mysql> ALTER TABLE testalter_tbl DROP i;
3,修改列名及列类型
可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
或
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
在修改ID的数据类型是 建表时设置的 key 以及AUTO 依旧存在
在没有主键和索引的数据表中插入重复的数据会被忽略
4,设定字段的默认字段及删除默认值
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
五,对表内数据的处理(添加,删除数据,删除重复数据,修改,排序,查找, 序列,分组)
1,添加信息
语法:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN ),
( value1, value2,...valueN ),
( value1, value2,...valueN );
1.5 读取数据
语法:select * from runoob_tbl;
PHP脚本:
<?php
require ‘connect.php’;
mysqli_query($conn , "set names utf8"); // 设置格式
$sql = 'SELECT runoob_id, runoob_title,
runoob_author, submission_date
FROM runoob_tbl';
//获取数据
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC)) // 或者用while($row = mysqli_fetch_assoc($retval))
{
echo "<tr><td> {$row['runoob_id']}</td> ".
"<td>{$row['runoob_title']} </td> ".
"<td>{$row['runoob_author']} </td> ".
"<td>{$row['submission_date']} </td> ".
"</tr>";
}
//输出数据
mysqli_free_result($retval); // 释放内存
mysqli_close($conn);
?>
或者用
while($row = mysqli_fetch_array($retval, MYSQLI_NUM))
{
echo "<tr><td> {$row[0]}</td> ".
"<td>{$row[1]} </td> ".
"<td>{$row[2]} </td> ".
"<td>{$row[3]} </td> ".
"</tr>";
}
2,删除数据
你可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录
语法:
DELETE FROM table_name [WHERE Clause] //WHERE 指定条件
PHP脚本:
<?php
require ‘connect.php’;
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");
$sql = 'DELETE FROM runoob_tbl
WHERE runoob_id=3';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法删除数据: ' . mysqli_error($conn));
}
echo '数据删除成功!';
mysqli_close($conn);
?>
3,删除重复信息
防止表中出现重复数据
你可以在 MySQL 数据表中设置指定的字段为 PRIMARY KEY(主键) 或者 UNIQUE(唯一) 索引来保证数据的唯一性。
统计重复数据
以下我们将统计表中 first_name 和 last_name的重复记录数:
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
-> FROM person_tbl
-> GROUP BY last_name, first_name
-> HAVING repetitions > 1;
确定哪一列包含的值可能会重复。
在列选择列表使用COUNT(*)列出的那些列。
在GROUP BY子句中列出的列。
HAVING子句设置重复数大于1。
过滤重复数据
mysql> SELECT DISTINCT last_name, first_name
-> FROM person_tbl;
你也可以使用 GROUP BY 来读取数据表中不重复的数据:
mysql> SELECT last_name, first_name
-> FROM person_tbl
-> GROUP BY (last_name, first_name);
删除重复数据
删除重复项其实就是 重新建一个表,并把 原表的GROUP BY 分组后的信息 复制给新表。
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl GROUP BY (last_name, first_name, sex);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;
4,修改更新数据
如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作。
语法:
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
mysql> UPDATE runoob_tbl SET runoob_title='python' WHERE runoob_id=3;
PHP脚本:
<?php
require ‘connect.php’;
mysqli_query($conn , "set names utf8");
$sql = 'UPDATE runoob_tbl
SET runoob_title=‘Python"
WHERE runoob_id=3';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法更新数据: ' . mysqli_error($conn));
}
echo '数据更新成功!';
mysqli_close($conn);
?>
5,排序
如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。
mysql> SELECT * from runoob_tbl ORDER BY submission_date ASC;
php脚本:
<?php
require ‘connect.php’;
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");
$sql = 'SELECT runoob_id, runoob_title,
runoob_author, submission_date
FROM runoob_tbl
ORDER BY submission_date ASC';
mysqli_select_db( $conn, 'RUNOOB' );
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
echo '<h2>菜鸟教程 MySQL ORDER BY 测试<h2>';
echo '<table border="1"><tr><td>教程 ID</td><td>标题</td><td>作者</td><td>提交日期</td></tr>';
while($row = mysqli_fetch_array($retval, MYSQL_ASSOC))
{
echo "<tr><td> {$row['runoob_id']}</td> ".
"<td>{$row['runoob_title']} </td> ".
"<td>{$row['runoob_author']} </td> ".
"<td>{$row['submission_date']} </td> ".
"</tr>";
}
echo '</table>';
mysqli_close($conn);
?>
6,查找
(1)以WHERE 来限定条件查找
语法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
WHERE 语法 AND 或者 OR 指定一个或多个条件。常与查找获取数据一起连用
SELECT * from runoob_tbl WHERE runoob_author='xxxx';
(2)用LIKE 来查找
语法:
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *
你可以使用LIKE子句代替等号 =。
你可以使用 AND 或者 OR 指定一个或多个条件。
你可以在 DELETE 或 UPDATE 命令中使用 WHERE…LIKE 子句来指定条件。
mysql> SELECT * from runoob_tbl WHERE runoob_author LIKE '%COM';//查找runoob_author 中含有COM字符的数据
PHP脚本:
<?php
require ‘connect.php’;
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");
$sql = 'SELECT runoob_id, runoob_title,
runoob_author, submission_date
FROM runoob_tbl
WHERE runoob_author LIKE "%COM"';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
while($row = mysqli_fetch_array($retval, MYSQLI_NUM))
{
echo "<tr><td> {$row[0]}</td> ".
"<td>{$row[1]} </td> ".
"<td>{$row[2]} </td> ".
"<td>{$row[3]} </td> ".
"</tr>";
}
mysqli_close($conn);
?>
8,分组
在用 SELECT 列1,列2 FROM 表名 GROUP BY 列1 时 表示以列1 为筛选项 ,列1,列2 为输出项
GROUP BY 语句根据一个或多个列对结果集进行分组。
语法:
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
mysql> SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;
+--------+----------+
| name | COUNT(*) |
+--------+----------+
| 小丽 | 1 |
| 小明 | 3 |
| 小王 | 2 |
+--------+----------+
3 rows in set (0.01 sec)
六,常用函数:
1,mysqli_connect(host,username,password,dbname,port,socket); mysqli_connect() 函数打开一个到 MySQL 服务器的新的连接。
2,bool mysqli_close ( mysqli $link ) 用于关闭数据库
**3,mysqli_query(connection,query,resultmode); ** mysqli_query() 函数执行某个针对数据库的查询。
4,mysqli_select_db(connection,dbname); 用于选择数据库
**5,mysqli_fetch_array() ** 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有。
注释:该函数返回的字段名是区分大小写的。
6,mysqli_fetch_assoc() 函数来输出数据表 runoob_tbl 的所有记录mysqli_fetch_assoc() 函数从结果集中取得一行作为关联数组。
注释:该函数返回的字段名是区分大小写的