Mysql笔记
MySQL资料
MySQL的进入
[root@host]# mysql -u root -p Enter password:****** # 登录后进入终端 mysql> create DATABASE RUNOOB;
MySQL 数据库的操作
CREATE DATABASE 数据库名; drop database <数据库名>;
MySQL 创建数据表
创建MySQL数据表需要以下信息:
表名表字段名定义每个表字段
以下为创建MySQL数据表的SQL通用语法:
CREATE TABLE table_name (column_name column_type);
## 例如使用SQL创建数据表
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;
MySQL 删除数据表
MySQL中删除数据表是非常容易操作的,但是你在进行删除表操作时要非常小心,因为执行删除命令后所有数据都会消失。
语法
-- 以下为删除MySQL数据表的通用语法:
DROP TABLE table_name ;
实例
以--下 SQL 语句从 客户(customer) 表中删除客户 "zhansan":
DELETE FROM Customers WHERE CustomerName='zhansan';
MySQL 插入数据
MySQL 表中使用 **INSERT INTO** SQL语句来插入数据。
**语法**
以下为向MySQL数据表插入数据通用的 **INSERT INTO** SQL语法:
INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
-- 使用下面的例子添加数据 INSERT INTO runoob_tbl
(runoob_title, runoob_author, submission_date)VALUES("MySQL", "zhangsan", NOW());
MySQL 查询数据
MySQL 数据库使用SQL SELECT语句来查询数据。
你可以通过 mysql> 命令提示窗口中在数据库中查询数据,或者通过PHP脚本来查询数据。
MySQL读取数据表
select * from runoob_tbl; --查询全部从表中
语法
以下为在MySQL数据库中查询数据通用的 SELECT 语法:
SELECT column_name,column_name FROM table_name [WHERE Clause] --查询条件 [LIMIT N][ OFFSET M] --查询限制
- 查询语句中你可以使用一个或者多个表,表之间使用逗号(,)分割,并使用WHERE语句来设定查询条件。
- SELECT 命令可以读取一条或者多条记录。
- 你可以使用星号(*)来代替其他字段,SELECT语句会返回表的所有字段数据
- 你可以使用 WHERE 语句来包含任何条件。
- 你可以使用 LIMIT 属性来设定返回的记录数。
- 你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。
DISTINCT (取出唯一值)
SELECT DISTINCT 语句用于返回唯一不同的值。
在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。
SELECT DISTINCT username,className FROM Student;
通过命令提示符获取数据
以下实例我们将通过 SQL SELECT 命令来获取 MySQL 数据表 runoob_tbl 的数据:
实例
以下实例将返回数据表 runoob_tbl 的所有记录:
MySQL WHERE 子句
我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。
如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。
语法
以下是 SQL SELECT 语句使用 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 子句中。
下表中实例假定 A 为 10, B 为 20
| 操作符 | 描述 | 实例 |
|---|---|---|
| = | 等号,检测两个值是否相等,如果相等返回true | (A = B) 返回false。 |
| <>, != | 不等于,检测两个值是否相等,如果不相等返回true | (A != B) 返回 true。 |
| > | 大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true | (A > B) 返回false。 |
| < | 小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true | (A < B) 返回 true。 |
| >= | 大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true | (A >= B) 返回false。 |
| <= | 小于等于号,检测左边的值是否小于或等于右边的值, 如果左边的值小于或等于右边的值返回true | (A <= B) 返回 true。 |
如果我们想在 MySQL 数据表中读取指定的数据,WHERE 子句是非常有用的。
使用主键来作为 WHERE 子句的条件查询是非常快速的。
如果给定的条件在表中没有任何匹配的记录,那么查询不会返回任何数据。
MySQL UPDATE 更新
如果我们需要修改或更新 MySQL 中的数据,我们可以使用 SQL UPDATE 命令来操作。
语法
以下是 UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法:
UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
MySQL DELETE 语句
你可以使用 SQL 的 DELETE FROM 命令来删除 MySQL 数据表中的记录。
你可以在 mysql> 命令提示符或 PHP 脚本中执行该命令。
语法
以下是 SQL DELETE 语句从 MySQL 数据表中删除数据的通用语法:
DELETE FROM table_name [WHERE Clause]
- 如果没有指定 WHERE 子句,MySQL 表中的所有记录将被删除。
- 你可以在 WHERE 子句中指定任何条件
- 您可以在单个表中一次性删除记录。
当你想删除数据表中指定的记录时 WHERE 子句是非常有用的。
从命令行中删除数据
这里我们将在 SQL DELETE 命令中使用 WHERE 子句来删除 MySQL 数据表 runoob_tbl 所选的数据。
实例
以下实例将删除 runoob_tbl 表中 runoob_id 为3 的记录:
DELETE 语句:
mysql> use RUNOOB;
mysql> DELETE FROM runoob_tbl WHERE runoob_id=3;
MySQL LIKE 子句
我们知道在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。
WHERE 子句中可以使用等号 = 来设定获取数据的条件,如 "runoob_author = 'RUNOOB.COM'"。
但是有时候我们需要获取 runoob_author 字段含有 "COM" 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
SQL LIKE 子句中使用百分号 %字符来表示任意字符,类似于UNIX或正则表达式中的星号 *****。
如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。
语法
## 以下是 SQL SELECT 语句使用 LIKE 子句从数据表中读取数据的通用语法:
SELECT field1, field2,...fieldN FROM table_name WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
- 你可以在 WHERE 子句中指定任何条件。
- 你可以在 WHERE 子句中使用LIKE子句。
- 你可以使用LIKE子句代替等号 =。
- LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
- 你可以使用 AND 或者 OR 指定一个或多个条件。
- 你可以在 DELETE 或 UPDATE 命令中使用 WHERE...LIKE 子句来指定条件。
在命令提示符中使用 LIKE 子句
以下我们将在 SQL SELECT 命令中使用 WHERE...LIKE 子句来从MySQL数据表 runoob_tbl 中读取数据。
实例
以下是我们将 runoob_tbl 表中获取 runoob_author 字段中以 COM 为结尾的的所有记录:
SQL LIKE 语句:
mysql> use RUNOOB; Database changed
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
)
MySQL多表查询
内连接(只有一种场景)
inner join 或者join(等同于inner join)
select a.*, b.* from tablea a inner join tableb b on a.id = b.id
select a., b. from tablea a join tableb b on a.id = b.id
左连接
select * from student s left teacher t on s.sid = t.tid
select a.id aid,a.age,b.id bid,b.name
from tablea a left
join tableb b
on a.id = b.id Where b.id is null
右连接
select a.id aid,a.age,b.id bid,b.name from tablea a right join tableb b on a.id = b.id
DCL数据库控制语言
数据库的权限管理模块
视图
mysql视图的作用:
1、提高了重用性;
2、对数据库重构,却不影响程序的运行;
3、提高了安全性能,可以对不同的用户,设定不同的视图;
4、让数据更加清晰。
❗注意!
1.若视图是由两个及其以上的表构成的,改视图是无法更新的
创建视图
create view other as select a.name as username, b.name
as goodsname from user as a, goods as b, ug as c where a.id=c.userid and c.goodsid=b.id;
创建好视图后,就可以这样获取user的name和goods的name。示例:
select * from other;
索引
提高查找效率
创建索引
-- 创建索引 CREATE INDEX 索引名称 ON 表名(列名)
查看表中的索引
SHOW INDEX FROM student
删除索引
DROP INDEX 索引名称 FROM 表名
触发器
在某种条件下自动触发,检查内容的安全性,在select/updata/delete时,会自动执行我们预先设定的内容,相比于添加约束,触发器会更加的灵活
after触发器
AFTER触发器是指触发器监视的触发事件执行之后,再激活触发器,激活后所执行的操作无法影响触发器所监视的事件。
before触发器
BEFORE触发器是指触发器在所监视的触发事件执行之前激活,激活后执行的操作先于监视的事件,这样就有机会进行一些判断,或修改即将发生的操作。
Before与After区别:
before:(insert、update)可以对new进行修改,after不能对new进行修改,三者都不能修改old数据。
delete触发器
建一个触发器t_d_s,当删除表student中某个学生的信息时,同时将grade表中与该学生有关的数据全部删除。
CREATE TRIGGER trigger_t1 AFTER DELETE ON student FOR EACH ROW BEGIN DELETE FROM grade WHERE studentid = old.studentid; END
new和old
触发器不会产生new表和old表,所谓new,old只是指insert,delete,update操作执行前的所在表状态和执行后的状态
对insert而言,只有new合法,新插入的行用new来表示,行中每一列的值用new.列名来表示
对于delete而言,只有old合法,删除的行用old来表示,行中每一列的值用old.列名来表示
对于update而言,被修改的行,修改前的数据,用old来表示,old.列名;修改后的数据,用new来表示,new.列名
UPDATE
创建一触发器t_u_s,实现在更新学生表的学号时,同时更新grade表中的相关记录的studentid值。
CREATE TRIGGER t_u_s AFTER UPDATE ON student for EACH ROW BEGIN UPDATE grade SET studentid = new.studentid WHERE studentid = old.studentid; END
INSERT
创建一个存储过程,根据student表中数据,一次性更新class表中每个班的人数
建一个触发器t_d_t,插入教师信息时,如果教师工资小于3000,则自动调整成3000
#给teacher表创建一个列, salary列,记录教师的工资 ALTER table teacher ADD salary int; #建一个触发器tdt,插入教师信息时,如果教师工资小于3000,则自动调整成3000 CREATE TRIGGER tdt BEFORE INSERT ON teacher for each ROW BEGIN if new.salary <3000 THEN SET new.salary = 3000; END if; END; INSERT INTO teacher(TeacherID,Teachername,sex,salary) VALUES('123','zhangsan','女',2989); INSERT INTO teacher(TeacherID,Teachername,sex,salary) VALUES('124','lisi','男',6666);
事务
事务的特性(ACID):
1)原子性
构成事务的操作要么同时成功,要么同时失败
2)一致性
事务执行之前和事务执行之后,数据的一致性(如:卖票系统,卖完一张后,费用扣除、余票减一。“一致”是指数据库中的数据是正确的,不存在矛盾)
3)隔离性
两个事务之间互不干扰。一个事务在执行过程中,不能看见其他事务运行的中间过程。
4)持久性
事务提交后,此事务对数据的更改操作会被持久化到数据库中,并且不会被回滚
事务的类型:
1)扁平事务
最常见的,在这期间的所有操作要么全部提交成功,要么全部提交失败(回滚)
2)带有保存点的扁平事务
在扁平事务的内部设置了保存点,回滚时,可以回滚到该位置
3)链式事务
链式事务是在带有保存点的事务的基础上,自动将当前事务的上下文隐式的传递给下一个事务。上一个事务的提交操作和下一个事务的开始操作具备原子性。
4)嵌套事务
多个事务嵌套,共同完成一个任务,最外层的顶层事务控制着所有的内部事务,内部事务提交后,整体事务并不会提交,只有当最外层的顶层事务提交后,整个事务才算提交完成。
5)分布式事务
事务的参与者、事务所在的服务器、涉及的资源服务器以及事务管理器等分别位于不同的分布式系统的不同服务或数据库的节点
begin; # 开启事务 rollback; #回滚事务 savepoint ;#添加回滚点 rollback to; #回滚到指定回滚点 commit; #提交事务,一旦提交无法回滚
浙公网安备 33010602011771号