MySQL学习

mac中登录mysql命令行 cd /usr/local/mysql/bin/ mysql -u root -p
1.数据库基本操作语句
登录数据库
mysql -u root -p;
查看数据库:
show databases;
进入某个数据库
use 数据库名;
查看某个数据库下面的表
show tables;
创建数据库表
create table 表名(字段 类型,字段 类型......);
插入数据
insert into 表名 values(字段值,字段值........);
查询数据
查询所有数据:select * from 表名;
查询固定条数的数据:select * from 表名 limit 开始的行数,查询的行数;
分组查询:select * from 表名 group by 字段名;
更改数据:
update 表名 set 字段名=字段值 where 查询条件;
更改表:
alter table 表名
例如:

alter table vender
add column name char(20)         给表vender添加一列name
alter table vender
drop column name;     //删除表中的列name

删除某一行的数据:
delete from 表名 where 查询条件;
删除表:
drop table 表名;
删除表中所有的数据:
truncate table 表名; delete删除不加where子句的时候表示删除表中所有的行,与truncate table 表名的功能相同,但是truncate的速度更快。

  1. and、or、not(<>)、in操作符
    在and和or操作符同时使用的时候,如果不加括号,and的优先级更高。
    使用通配符进行过滤:
    %:表示任何字符出现任何次数,
    _:下划线通配符表示只匹配单个字符
    []:表示匹配指定位置的一个字符,例如‘[JM]%’表示匹配以J或者M开头的,如果用否定的话[^JM]表示匹配不以J或M开头的。
    通配符搜索比其他的过滤搜索要耗时,使用通配符时要注意,不要过度使用通配符,如果其他操作符能够达到相同的效果,就使用其他通配符。在确实需要通配符的时候,尽量不要将通配符置于开始的位置。
    分组:group by
    过滤分组:使用HAVING,而where用于过滤行,HAVING用于过滤分组。
    连接表:
    内连接:INNER JOIN ON
    l例如:
select product_name,payment 
from mmall_order_item INNER JOIN mmall_order 
ON mmall_order_item.order_no = mmall_order.order_no;
等价于:
select product_name,payment 
from mmall_order_item,mmall_order 
where mmall_order_item.order_no = mmall_order.order_no;

左连接:LEFT JOIN ON
例如:

select username,order_no 
from mmall_user left join mmall_order 
on mmall_user.id = mmall_order.user_id;
输出为:
+--------------+---------------+
| username     | order_no      |
+--------------+---------------+
| admin        | 1491753014256 |
| admin        | 1491830695216 |
| admin        | 1492089528889 |
| admin        | 1492090946105 |
| admin        | 1492091003128 |
| admin        | 1492091051313 |
| admin        | 1492091061513 |
| admin        | 1492091069563 |
| admin        | 1492091076073 |
| admin        | 1492091083720 |
| admin        | 1492091089794 |
| admin        | 1492091096400 |
| admin        | 1492091102371 |
| admin        | 1492091110004 |
| admin        | 1492091141269 |
| geely        |          NULL |
| rosen        |          NULL |
| soonerbetter |          NULL |
+--------------+---------------+
18 rows in set (0.00 sec)
从上面的输出结果中可以看出列出了左边表中的所有的用户名,右边订单表中没有对应用户的订单号为NULL。

右连接:RIGHT JOIN ON
右连接和左连接一样,只是右连接输出右边表中的所有行,左边表中没有与之匹配的行输出值为NULL。
使用带有聚合的连接:
例如:

select username,order_no,count(*) 
from mmall_user left join mmall_order 
on mmall_user.id = mmall_order.user_id 
group by username;
输出为:
+--------------+---------------+----------+
| username     | order_no      | count(*) |
+--------------+---------------+----------+
| admin        | 1491753014256 |       15 |
| geely        |          NULL |        1 |
| rosen        |          NULL |        1 |
| soonerbetter |          NULL |        1 |
+--------------+---------------+----------+

使用连接的时候需要注意:
一定要带上连接条件,不然会得到笛卡尔积
组合查询:
UNION:将多条sql语句用union连接,与多个where子句组成的一个select查询完成的工作相同。
例如:

select order_no,user_id 
from mmall_order where user_id = 1 
union 
select order_no,user_id 
from mmall_order where shipping_id = 26;
相当于查询
select order_no,user_id 
from mmall_order 
where user_id = 1 or shipping_id = 26;

输出为:
+---------------+---------+
| order_no      | user_id |
+---------------+---------+
| 1491753014256 |       1 |
| 1491830695216 |       1 |
| 1492089528889 |       1 |
| 1492090946105 |       1 |
| 1492091003128 |       1 |
| 1492091051313 |       1 |
| 1492091061513 |       1 |
| 1492091069563 |       1 |
| 1492091076073 |       1 |
| 1492091083720 |       1 |
| 1492091089794 |       1 |
| 1492091096400 |       1 |
| 1492091102371 |       1 |
| 1492091110004 |       1 |
| 1492091141269 |       1 |
+---------------+---------+

使用union时需要注意,每个select中必须包含相同的查询列、表达式或聚集函数。
union会将多个select查出来的相同列取消,只包含一列,如果需要包含查出来的所有列(包括相同列)就需要使用union all
例如:

select order_no,user_id 
from mmall_order 
where user_id = 1 
union all 
select order_no,user_id 
from mmall_order 
where shipping_id = 26;
输出为:
+---------------+---------+
| order_no      | user_id |
+---------------+---------+
| 1491753014256 |       1 |
| 1491830695216 |       1 |       //相同的列
| 1492089528889 |       1 |
| 1492090946105 |       1 |
| 1492091003128 |       1 |
| 1492091051313 |       1 |
| 1492091061513 |       1 |
| 1492091069563 |       1 |
| 1492091076073 |       1 |
| 1492091083720 |       1 |
| 1492091089794 |       1 |
| 1492091096400 |       1 |
| 1492091102371 |       1 |
| 1492091110004 |       1 |
| 1492091141269 |       1 |
| 1491830695216 |       1 |   //相同的列
+---------------+---------+

使用union 如果对查询结果进行排序,只需要在最后一个select后面加上order by就可以,不要在每个select上加。
从一个表复制到另一个表:SELECT INTO
select * into newTableName from tablename;将旧表的内容复制到新表。

  1. 视图:视图就是虚拟的表,视图不包含任何列,是一个查询。每次使用视图的时候,是使用该查询从其他表中将数据检索回来。一次编写基础的sql,然后可以多次使用。
    使用视图的好处:
  • 简化复杂的sql查询,编写了视图之后,可以很方便重用该查询。
  • 更改数据的格式和表示
  • 只展示表的部分数据
    使用视图的时候需要注意
  • 视图必须向表名一样,有唯一的名字
  • 可以创建的视图的数目是没有限制的
  • 视图不能创建索引,也不能有关联的触发器
  • 一部分数据库将视图作为只读的查询,只能用于检索数据,不能修改数据将数据写入底层
    创建视图:create view 视图名 AS (查询语句)
    例如:
 create view user_order
 AS 
select username,order_no
 from mmall_user,mmall_order 
where mmall_user.id = mmall_order.user_id;
  1. 存储过程:为以后使用而保存的一条或多条sql语句,
    使用存储过程的好处:
  • 将一系列复杂的操作放在一个处理单元中,简化了操作。
  • 如果表名或列名等有变动,只需要修改存储过程,使用人员不需要知道这些变化。
  • 存储过程一般以编译过的形式存储,提高性能。
    创建存储过程:create procedure 存储过程名称
    例如:
delimiter //
create procedure pro_order(out cnt int) 
begin 
select count(*) into cnt 
from mmall_order 
where user_id = 1 
end //
delimiter ;   定义语句结束符为;

delimiter定义存储过程语句结束符为//
out表示输出参数
into 表示赋值

  1. 事务
    用户定义的一系列数据库操作,要么全都执行要么全都不执行,是一个不可分割的工作单元。
    为什么需要事务?
    例如:a用户向b用户转账100元,当a用户的账户金额减100之后,b账户再加100的时候执行出错或系统崩溃,导致用户账户的金额出现错误,这个时候就需要使用事务。
    事务的特性:
  • 原子性:一个事务就是一个不可分割的最小的工作单元,所有的操作要么都执行要么都不执行。
  • 一致性:事务执行的结果是使数据库从一个一致性状态变成另一个一致性状态。例如,转账前和转账后两个用户账户的总金额是不变的。
  • 隔离性:并发执行的事务之间不相互影响。例如多个账户往一个账户中打钱,总金额应该和他们依次打钱相同
  • 持久性:一旦事务提交,对数据库的更改就是持久的。
    并发事务存在的问题
  • 脏读:一个事务读取到了另一个事务未提交的数据
    例如事务1对数据进行修改,事务2读到了事务1修改后的数据,之后事务1回滚了,就导致事务2读取到了事务1没有提交的数据。
  • 不可重复读:一个事务对同一数据前后读取的结果不一致。
    事务1读取某一数据,事务2对该数据进行修改并提交,之后事务1再读取该数据发生数据和上次读取的结果不一致
  • 幻读:一个事务按照相同的查询条件去查询,发现再次查询的数据的条数发生了改变。
    事务1读取某一范围内的数据,之后事务2在该范围内插入了一条新数据,事务1再次查询该范围内的数据时,发现满足条件的条数不同了。
    不可重复读和幻读的区别在于不可重复读重点在修改,是针对某一行数据,而幻读重点在增加或删除,是针对多行数据。
    SQL为事务定义了不同的隔离级别:
    一次从低到高
    读未提交:所有事务都可以看到其他未提交事务的执行结果
    读已提交:事务只能看到其他已提交事务所做的变更
    可重复读:在同一事务中,在不修改数据的情况下,前后读取的数据是一致的。
    串行化:事务只能一个个执行,不能并发执行。
    隔离级别 脏读 不可重复读 幻读
    读未提交 是 是 是
    读已提交 否 是 是
    可重复读 否 否 是
    串行 否 否 否
    使用事务可以确保成批的sql要么全都执行,要么全都不执行,来保证数据库的完整性。
    事务
    回滚
    提交
    保留点
    开启事务start transaction
    回滚 roolback
    提交 commit
    保留点savepoint 事务回滚到特定的保留点
  1. 游标
    游标是存储在数据库中的被语句检索出来的结果集,可以对结果集进行前进、后退一行的操作。

你可能感兴趣的:(MySQL学习)