上篇地址:MySQL数据库学习(一)
12、子查询
子查询实际上嵌套在其他查询中的查询,例如两张表,物品表 orderitems 中,保存订单号,客户ID,订单日期。customers表中保存客户信息。(两张表互不相连,需要查询两次)
如果要找到物品 TNT2 的所有客户,需要采用下列步骤:
- 查找包含物品 TNT2 的所有订单的编号;
- 查找前一步骤列出的订单编号的所有客户的 ID;
- 查找前一步骤返回的所有客户 ID 的客户信息;
所以 可以执行下列操作:
>select order_num from orderitems where prod_id='TNT2'; //查到为4,6
>select cust_id from orders where order_num in (4,6);
13、表联结
关系型数据库的强大在于关系表,关系表的设计原则时保证把信息分解为多个表,一类数据一个表,各个表通过某些常用的值互相关联,比如两个表之间通过外键来关联。(外键是某个表中的一列,它又是另外一个表的主键值。)
表联结的优点:
- 数据信息不重复,从而不浪费时间和空间,伸缩性好(scale well)
- 如果某个数据信息变动,可以只更新该表中的某个记录,相关表数据不用变更
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)
可以采用下列方式:
- 插入完整的行;
- 插入行的一部分;
- 插入多行;
- 插入某些查询结果;
前面中有使用插入操作进行,插入一个学生的数据
>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';
(只赋予select
和update
)
1、all privileges
:表示将所有权限授予给用户。也可指定具体的权限,如:SELECT
、CREATE
、DROP
等。
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';