写在前面
下列内容摘录自 http://www.runoob.com/mysql/ (菜鸟教程)
其实就是把里面讲的东西搬过来了,非常感谢菜鸟教程的整理
现在就是在php里面使用,把所有可能用到的代码(放在注释里面)放在了github上面:https://github.com/fengh16/Web-Learning/tree/master/sqlLearing
可视化工具
https://dev.mysql.com/downloads/file/?id=474210
数据库的连接
以下添加的内容均放在mysqli_close($conn);
之前
数据库创建
$sql = 'CREATE DATABASE ARTICLES';
$retval = mysqli_query($conn,$sql);
if(! $retval )
{
die('创建数据库失败: ' . mysqli_error($conn));
}
echo "数据库 ARTICLES 创建成功\n";
数据库删除
$sql = 'DROP DATABASE ARTICLES';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('删除数据库失败: ' . mysqli_error($conn));
}
echo "数据库 ARTICLES 删除成功
";
选择数据库&设置编码
// 选择数据库进行操作,下面的$_ENV['MYSQL_DBNAME']是数据库名
mysqli_select_db($conn, $_ENV['MYSQL_DBNAME']);
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");
创建数据表
$sql = "CREATE TABLE testtable_tbl( ".
"testtable_id INT NOT NULL AUTO_INCREMENT, ".
"testtable_title VARCHAR(100) NOT NULL, ".
"testtable_author VARCHAR(40) NOT NULL, ".
"submission_date DATE, ".
"PRIMARY KEY ( testtable_id ))ENGINE=InnoDB DEFAULT CHARSET=utf8; ";
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('数据表创建失败: ' . mysqli_error($conn));
}
echo "数据表创建成功
";
删除数据表
$sql = "DROP TABLE testtable_tbl";
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('数据表删除失败: ' . mysqli_error($conn));
}
echo "数据表删除成功
";
添加数据
$testtable_title = '学习';
$testtable_author = 'FH';
$submission_date = '2016-03-06';
$sql = "INSERT INTO testtable_tbl ".
"(testtable_title, testtable_author, submission_date) ".
"VALUES ".
"('$testtable_title','$testtable_author','$submission_date')";
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法插入数据: ' . mysqli_error($conn));
}
echo "数据插入成功
";
数据查询
$sql = 'SELECT testtable_id, testtable_title,
testtable_author, submission_date
FROM testtable_tbl';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
echo 'mysqli_fetch_array 测试';
echo '
ID 标题 作者 提交日期 ';
while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC))
{
echo " {$row['testtable_id']} ".
"{$row['testtable_title']} ".
"{$row['testtable_author']} ".
"{$row['submission_date']} ".
" ";
}
echo '
';
$sql = 'SELECT testtable_id, testtable_title,
testtable_author, submission_date
FROM testtable_tbl';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
echo 'mysqli_fetch_assoc 测试';
echo '
ID 标题 作者 提交日期 ';
while($row = mysqli_fetch_assoc($retval))
{
echo " {$row['testtable_id']} ".
"{$row['testtable_title']} ".
"{$row['testtable_author']} ".
"{$row['submission_date']} ".
" ";
}
echo '
';
// 使用常量 MYSQLI_NUM 作为 PHP mysqli_fetch_array() 函数的第二个参数,返回数字数组
$sql = 'SELECT testtable_id, testtable_title,
testtable_author, submission_date
FROM testtable_tbl';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法读取数据: ' . mysqli_error($conn));
}
echo 'mysqli_fetch_array 测试';
echo '
ID 标题 作者 提交日期 ';
while($row = mysqli_fetch_array($retval, MYSQLI_NUM))
{
echo " {$row[0]} ".
"{$row[1]} ".
"{$row[2]} ".
"{$row[3]} ".
" ";
}
echo '
';
// 释放内存
mysqli_free_result($retval);
// SELECT field1, field2,...fieldN FROM table_name1, table_name2...
// [WHERE condition1 [AND [OR]] condition2.....
// 条件可以使用=、<> !=、<、>、<=、>=
数据更新
$sql = 'UPDATE testtable_tbl
SET testtable_title="学习吗"
WHERE testtable_id=2';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法更新数据: ' . mysqli_error($conn));
}
echo '数据更新成功!';
数据删除
$sql = 'DELETE FROM testtable_tbl
WHERE testtable_id=1';
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
die('无法删除数据: ' . mysqli_error($conn));
}
echo '数据删除成功!';
like语句
// WHERE testtable_author LIKE "%COM"
// 里面的%是任意字符串
UNION指令
// SELECT country FROM Websites
// UNION
// SELECT country FROM apps
// ORDER BY country;
// UNION ALL不会去重
排序
// ORDER BY field1, [field2...] [ASC [DESC]]
// 排序,分别是升序或者倒序
分组
// GROUP BY column_name
// 按照column_name分组
// WITH ROLLUP 可以实现在分组统计数据基础上再进行相同的统计(SUM,AVG,COUNT…)
// 示例:SELECT name, COUNT(*) FROM employee_tbl GROUP BY name
// 示例:SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY name WITH ROLLUP
// 上面那个示例会显示总数信息
JOIN
// INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。INNER可以省略
// LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
// RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
// 用MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样)来连接以上两张表来读取testtable_tbl表中所有testtable_author字段在tcount_tbl表对应的testtable_count字段值
// SELECT a.testtable_id, a.testtable_author, b.testtable_count FROM testtable_tbl a INNER JOIN tcount_tbl b ON a.testtable_author = b.testtable_author;
// 相当于:
// SELECT a.testtable_id, a.testtable_author, b.testtable_count FROM testtable_tbl a, tcount_tbl b WHERE a.testtable_author = b.testtable_author;
// LEFT JOIN 会将所有a表中有的东西都列出来,b.testtable_count可能出现NULL
NULL
// NULL值:如果NULL和别的比较都会出现false,包括NULL=NULL为false
// 所以提供了运算符:
// IS NULL: 当列的值是 NULL,此运算符返回 true。
// IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
// <=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。
正则
// SELECT name FROM person_tbl WHERE name REGEXP 'mar';
// 也就是条件判断里面可以写
// 正则说明:
// ^ 匹配输入字符串的开始位置。如果设置了 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 次。
事务
// 事务:满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
// 事务代码示例:
mysqli_query($conn, "SET AUTOCOMMIT=0"); // 设置为不自动提交,因为MYSQL默认立即执行
mysqli_begin_transaction($conn); // 开始事务定义
if(!mysqli_query($conn, "insert into testtable_transaction_test (id) values(8)"))
{
mysqli_query($conn, "ROLLBACK"); // 判断当执行失败时回滚
}
if(!mysqli_query($conn, "insert into testtable_transaction_test (id) values(9)"))
{
mysqli_query($conn, "ROLLBACK"); // 判断执行失败时回滚
}
mysqli_commit($conn); //执行事务
ALTER
// ALTER:修改表的名称或者字段
// SHOW COLUMNS FROM testalter_tbl 可以显示所有字段
// ALTER TABLE testalter_tbl DROP i 可以直接删除表testalter_tbl中的i字段
// ALTER TABLE testalter_tbl ADD i INT 可以添加i字段(int)
// 上面的东西的最后可以添加FIRST或者AFTER c代表新加字段的位置
// ALTER TABLE testalter_tbl MODIFY c CHAR(10) 可以直接修改字段
// 如果使用CHANGE则如下:
// ALTER TABLE testalter_tbl CHANGE i j INT 就是把i换为j(INT)
// ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100 也就是设置默认值不是NULL,是100
// ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000 设置默认值
// ALTER TABLE testalter_tbl ALTER i DROP DEFAULT 删除默认值
// 重命名:ALTER TABLE testalter_tbl RENAME TO alter_tbl