MySQL数据库学习(二)

上篇地址:MySQL数据库学习(一)

12、子查询
子查询实际上嵌套在其他查询中的查询,例如两张表,物品表 orderitems 中,保存订单号,客户ID,订单日期。customers表中保存客户信息。(两张表互不相连,需要查询两次)
如果要找到物品 TNT2 的所有客户,需要采用下列步骤:

  1. 查找包含物品 TNT2 的所有订单的编号;
  2. 查找前一步骤列出的订单编号的所有客户的 ID;
  3. 查找前一步骤返回的所有客户 ID 的客户信息;

所以 可以执行下列操作:

>select order_num from orderitems where prod_id='TNT2'; //查到为4,6
>select cust_id from orders where order_num in (46);

13、表联结
关系型数据库的强大在于关系表,关系表的设计原则时保证把信息分解为多个表,一类数据一个表,各个表通过某些常用的值互相关联,比如两个表之间通过外键来关联。(外键是某个表中的一列,它又是另外一个表的主键值。)
表联结的优点:

  1. 数据信息不重复,从而不浪费时间和空间,伸缩性好(scale well)
  2. 如果某个数据信息变动,可以只更新该表中的某个记录,相关表数据不用变更

1、创建联结select A_name,B_name from A,B where A.A_id = B.B_id order by A_name, B_name;
(where子句指示MySQL匹配 A 表中的A_id和 B表中的 B_id 相匹配,要匹配的两列以A.A_id 和 B.B_id 完全限定表名(当引用的列可能存在二义性,必须使用完全限定表名),两个表的联结需要用到where语句,进行列过滤)

2、笛卡尔积:由没有联结条件的表关系返回的结果称为笛卡尔积(检索出的行的数目将是第一个表中的行数乘以第二个表中的行数)
select A_name,B_name from A, B order by A_name, B_name;

3、内部联结:内部联结也叫等值联结(equijoin),它基于两个表之间的相等测试,返回两个表的交集部分
例如:select A_name,B_name from A inner join B on A_name = B_name;
(这条SQL语句中,select语句与之前的相同,相较于上面的from,这里使用了inter join指定(当使用inter join时,联结条件用on子句而不是where子句,在这里on等同于where)

4、联结多个表:SQL对一条select语句中可以联结的表的数目没有限制,创建规则也基本相同(首先列出所有表,然后定义表之间的关系)
(PS:MySQL在运行时关联指定的每个表以处理联结,这样很耗费资源,因此使用中应注意,不要联结不必要的表。)
select A_name,B_name C_name from A,B where A_name=B_name and A_name=B_name;

5、使用表别名:别名除了用于列名和计算字段外,也可以给表起别名,可以缩短SQL语句,允许在单条select语句中多次使用相同的表。

> select a_name,b_name,c_num
>      from A as a, B as b, C as c
>       where A.a_name = B.b_name
>       and C.c_num = B.b_num;

6、自联结:自联结为在同一个表中做联结操作。(user_id 是 TN1,查询其user_name,最后找到user_name下其他的user_score的user_id,user_name ,最后找到的都是相同user_name下其他的user_score)

//使用子查询
>select user_id,user_name from usertable
>     where user_score=(select user_score from usertable where user_id='TN1'  
//使用自联结
>select p1.user_id, p1.user_name
>     from usertable as p1, usertable as p2
>     where p1.user_score = p2.user_score
>     and p2.user_id = 'TN1';

7、外联结:外联结分为左联结和右联结(left join on / left outer join on
左联结select A.Name from A left join B on A.id = B.id
(左(外)连接,左表的记录将会全部表示出来,而右表(b_table)只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。)

右联结select A.Name from A right join B on A.id = B.id
(与左(外)连接相反,右(外)连接,左表只会显示符合搜索条件的记录,而右表的记录将会全部表示出来。左表记录不足的地方均为NULL。)

8、创建组合查询
例如把两个查询结合在一起,使用union(union联结查询的列必须相同)

>select name from student where id=1
> union select select name from student where id=0;

14、插入操作
使用 insert 完成插入操作,insert into 表名(列名1,列名2) values(行值1,行值2)可以采用下列方式:

  1. 插入完整的行;
  2. 插入行的一部分;
  3. 插入多行;
  4. 插入某些查询结果;

前面中有使用插入操作进行,插入一个学生的数据

>insert into student(id,name,score) values(0,'zhansan',90)//插入一行
>insert into student(id,name,score) values(0,'zhansan',90),(1,'xiaowang',50)//插入多行

15、更新和删除数据
update更新表中特定的行,或者更新所有的行,后面不跟where语句。
例如:修改小王的成绩(更改一列一行) update student set score = 100 where name='xiaowang';
例如:修改小王的成绩,以及id (更改两列一个行) update student set score = 100,id=5 where name='xiaowang';
例如:更改一列下面所有行 update student set score=100

delete删除数据
delete from student where id=0; //删掉id=0这一行
drop table student;//删掉这个表


16、安全管理
mysql的安全基础是,用户对数据具有适当的访问权限
查询用户信息:>use mysql; >select user from user;

1、创建用户
create user 'user_name'@'host' IDENTIFIED BY 'password';
user_name:要创建用户的名字。
host:表示要这个新创建的用户允许从哪台机登陆,如果只允许从本机登陆,则 填localhost,如果允许从远程登陆,则填 %
password:新创建用户的登陆数据库密码,如果没密码可以不写。
重命名用户:>rename user user_name to user_name2

1、创建的用户需要赋予权限才能进行登陆操作,
> grant all privileges on *.* to 'xiaowang'@'%' identified by '123456' with grant option;
>grant select update on mydb.* tO 'username'@'localhost' identified by 'password';(只赋予selectupdate
1、all privileges:表示将所有权限授予给用户。也可指定具体的权限,如:SELECTCREATEDROP等。
2、on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写“*”表示所有数据库,所有表。如果我要指定将权限应用到test库的user表中,可以这么写:test.user
3、to:将权限授予哪个用户。格式:”用户名”@”登录IP或域名”。%表示没有限制,在任何主机都可以登录。比如[email protected].%,表示xiaowang这个用户只能在192.168.0IP段登录
4、identified by:指定用户的登录密码
5、with grant option:表示允许用户将自己的权限授权给其它用户

2、设置权限后,需要刷新权>flush privileges;

3、回收权限grant的反操作revoke,用来撤销特定权限。
收回select权限:revoke select on *.* from 'myuser'@'%'
收回所有权限:revoke all privileges,grant option from 'myuser'@'%'

4、更改用户账户的密码set password for xiaowang = password('123456789')


16、mysql数据库的维护
使用mysqldump备份程序、恢复数据库:
1mysqldump -u root -p test(备份test数据库)
2、mysqldump -u root -p test mytable(备份test数据库下的mytable表格)
3、mysql -u root -p test<c:\test.txt(备份数据库导入到数据库,导回test数据库)
4、使用桌面可视化工具备份

查看日志:
1、日志文件路径

> show variables like 'general_log_file';

2、错误日志文件路径

> show variables like 'log_error';

3、慢查询日志文件路径

> show variables like 'slow_query_log_file';

猜你喜欢

转载自blog.csdn.net/qq_37884273/article/details/82348462