MySQL是最流行的关系型数据库管理系统(关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。),在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。由瑞典MySQL AB公司开发,目前属于Oracle公司。
1、MySQL的特点
(1)MySQL是开源的,所以你不需要支付额外的费用。
(2)MySQL支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
(3)MySQL使用标准的SQL数据语言形式。
(4)MySQL可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
(5)MySQL是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。
2、MySQL的管理
(1)为MySQL数据库中的user表添加新用户
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)
注意需要执行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 password;
Enter password:*******
mysql> use mysql;
Database changed
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON TUTORIALS.*
-> TO 'zara'@'localhost'
-> IDENTIFIED BY 'zara123';
*MySQL的SQL语句以分号 (;) 作为结束标识。
(2)管理MySQL的命令
a、USE 数据库名;选择要操作的Mysql数据库,使用该命令后所有Mysql命令都只针对该数据库。
mysql> use RUNOOB;
Database changed
b、SHOW DATABASES;列出MySQL数据库管理系统当前的数据库列表。
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| RUNOOB |
| cdcol |
| mysql |
| onethink |
| performance_schema |
| phpmyadmin |
| test |
| wecenter |
| wordpress |
+--------------------+
10 rows in set (0.02 sec)
c、SHOW TABLES;显示指定数据库的所有表,使用该命令前需要使用USE命令来选择要操作的数据库。
mysql> use RUNOOB;
Database changed
mysql> SHOW TABLES;
+------------------+
| Tables_in_runoob |
+------------------+
| employee_tbl |
| runoob_tbl |
| tcount_tbl |
+------------------+
3 rows in set (0.00 sec)
d、SHOW COLUMNS FROM 数据表;显示数据表的属性,属性类型,主键信息 ,是否为 NULL,默认值等其他信息。
mysql> SHOW COLUMNS FROM runoob_tbl;
+-----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| runoob_id | int(11) | NO | PRI | NULL | |
| runoob_title | varchar(255) | YES | | NULL | |
| runoob_author | varchar(255) | YES | | NULL | |
| submission_date | date | YES | | NULL | |
+-----------------+--------------+------+-----+---------+-------+
4 rows in set (0.01 sec)
e、SHOW INDEX FROM 数据表;显示数据表的详细索引信息,包括PRIMARY KEY(主键)。
mysql> SHOW INDEX FROM runoob_tbl;
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| runoob_tbl | 0 | PRIMARY | 1 | runoob_id | A | 2 | NULL | NULL | | BTREE | | |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
f、SHOW TABLE STATUS LIKE [FROM db_name] [LIKE ‘pattern’] \G;该命令将输出Mysql数据库管理系统的性能及统计信息。
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,查询结果按列打印
3、数据库的基本操作语句
(1)创建数据表
CREATE TABLE table_name (column_name column_type);
root@host# mysql -u root -p
Enter password:*******
mysql> use RUNOOB;
Database changed
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;
Query OK, 0 rows affected (0.16 sec)
mysql>
*如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL,在操作数据库时如果输入该字段的数据为NULL ,就会报错。
*AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
*PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
*ENGINE 设置存储引擎,CHARSET 设置编码。
(2)删除数据表
DROP TABLE table_name ;
root@host# mysql -u root -p
Enter password:*******
mysql> use RUNOOB;
Database changed
mysql> DROP TABLE runoob_tbl
Query OK, 0 rows affected (0.8 sec)
mysql>
查看一下:
mysql> show tables;
Empty set (0.01 sec)
(3)插入数据
INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1,value2,...valueN );
root@host# mysql -u root -p password;
Enter password:*******
mysql> use RUNOOB;
Database changed
mysql> INSERT INTO runoob_tbl
-> (runoob_title, runoob_author, submission_date)
-> VALUES
-> ("学习 PHP", "菜鸟教程", NOW());
Query OK, 1 rows affected, 1 warnings (0.01 sec)
mysql> INSERT INTO runoob_tbl
-> (runoob_title, runoob_author, submission_date)
-> VALUES
-> ("学习 MySQL", "菜鸟教程", NOW());
Query OK, 1 rows affected, 1 warnings (0.01 sec)
mysql> INSERT INTO runoob_tbl
-> (runoob_title, runoob_author, submission_date)
-> VALUES
-> ("JAVA 教程", "RUNOOB.COM", '2016-05-06');
Query OK, 1 rows affected (0.00 sec)
mysql>
*如果数据是字符型,必须使用单引号或者双引号,如:"value"。
*使用箭头标记->不是SQL语句的一部分,它仅仅表示一个新行,如果一条SQL语句太长,我们可以通过回车键来创建一个新行来编写SQL语句,SQL语句的命令结束符为分号 ;。
(4)查询数据
SELECT column_name,column_name FROM table_name [WHERE Clause][LIMIT N][ OFFSET M];
select * from runoob_tbl;
SELECT * from runoob_tbl WHERE runoob_author='菜鸟教程';
*查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
*SELECT 命令可以读取一条或者多条记录。你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
*你可以使用 WHERE 语句来包含任何条件。例如使用 AND 或者 OR 指定一个或多个条件。WHERE子句也可以运用于 SQL 的 DELETE 或者 UPDATE 命令。WHERE子句类似于程序语言中的 if 条件,根据 MySQL 表中的字段值来读取指定的数据。MySQL 的 WHERE 子句的字符串比较是不区分大小写的。 你可以使用 BINARY 关键字来设定 WHERE 子句的字符串比较是区分大小写的。
*你可以使用 LIMIT 属性来设定返回的记录数。
*你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
(5)更新数据表
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause];
mysql> UPDATE runoob_tbl SET runoob_title='学习 C++' WHERE runoob_id=3;
Query OK, 1 rows affected (0.01 sec)
mysql> SELECT * from runoob_tbl WHERE runoob_id=3;
+-----------+--------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+--------------+---------------+-----------------+
| 3 | 学习 C++ | RUNOOB.COM | 2016-05-06 |
+-----------+--------------+---------------+-----------------+
1 rows in set (0.01 sec)
*你可以同时更新一个或多个字段。
*你可以在 WHERE 子句中指定任何条件。
*你可以在一个单独表中同时更新数据。
(6)删除MySQL数据表中的记录
DELETE FROM table_name [WHERE Clause];
mysql> use RUNOOB;
Database changed
mysql> DELETE FROM runoob_tbl WHERE runoob_id=3;
Query OK, 1 row affected (0.23 sec)
*如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
*你可以在 WHERE 子句中指定任何条件
*您可以在单个表中一次性删除记录。
(7)删除,添加或修改表字段
删除:ALTER TABLE alter_tbl DROP columnname;删除指定字段
添加:ALTER TABLE alter_tbl ADD new_column_name new_typename AFTER columnname;指定添加位置
修改: ALTER TABLE alter_tbl MODIFY columnname new_typename;修改字段类型
ALTER TABLE alter_tbl CHANGE oldcolumnname newcolumnname newtypename;修改字段及类型
ALTER TABLE alter_tbl RENAME TO alter_tb2;修改表名
(8)UNION操作符
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
使用 UNION ALL 从 "Websites" 和 "apps" 表中选取所有的中国(CN)的数据(也有重复的值):
SELECT country, name FROM Websites
WHERE country='CN'
UNION ALL
SELECT country, app_name FROM apps
WHERE country='CN'
ORDER BY country;
*expression1, expression2, ... expression_n: 要检索的列。
*tables: 要检索的数据表。
*WHERE conditions: 可选,检索条件。
*DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
*UNION 只会选取不同的值。请使用 UNION ALL 来选取重复的值。
(9)排序
SELECT field1, field2,...fieldN table_name1, table_name2...ORDER BY field1, [field2...] [ASC [DESC]];
SELECT * from runoob_tbl ORDER BY submission_date ASC;
SELECT * from runoob_tbl ORDER BY submission_date DESC;
*你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
*你可以设定多个字段来排序。
*你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。默认情况下,它是按升序排列。
*你可以添加 WHERE...LIKE 子句来设置条件。
(10)GROUP BY语法
SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
SELECT name, COUNT(*) FROM employee_tbl GROUP BY name;将数据表按名字进行分组,并统计每个人有多少条记录
(11)LIKE子句
SELECT field1, field2,...fieldN
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
在 runoob_tbl 表中获取 runoob_author 字段中以 COM 为结尾的的所有记录:
mysql> SELECT * from runoob_tbl WHERE runoob_author LIKE '%COM';
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 3 | 学习 Java | RUNOOB.COM | 2015-05-01 |
| 4 | 学习 Python | RUNOOB.COM | 2016-03-06 |
+-----------+---------------+---------------+-----------------+
2 rows in set (0.01 sec)
*你可以在 WHERE 子句中指定任何条件。
*你可以在 WHERE 子句中使用LIKE子句。
*你可以使用LIKE子句代替等号 =。
*LIKE子句中使用百分号 % 字符来表示任意字符,类似于UNIX或正则表达式中的星号 * 。
*你可以使用 AND 或者 OR 指定一个或多个条件。
*你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。
(12)连接的使用
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
a、内连接示例
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;
等价于
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a,
tcount_tbl b WHERE a.runoob_author = b.runoob_author;
b、左连接示例
读取左边的数据表 runoob_tbl 的所有选取的字段数据,即便在右侧表 tcount_tbl中 没有对应的 runoob_author 字段值。
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;
c、右连接示例
读取右边的数据表 tcount_tbl 的所有选取的字段数据,即便在左侧表 runoob_tbl 中没有对应的runoob_author 字段值。
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;
(13)NULL值处理
IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
<=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。
*关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。
*在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false 。
(14)索引
CREATE INDEX indexName ON mytable(username(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))
);