一、用户权限管理
1、 连接数据库与退出
² 连接数据库的格式为:
mysql -h主机地址 -u用户名 -p用户密码;
其中,-h主机地址可以省略
---------------------------------------------
² 退出的命令为:
mysql>exit或quit;.
² 查看当前用户的命令为:
mysql>select User();
---------------------------------------------
2、 修改密码
mysqladmin -u用户名 -p旧密码 password 新密码
---------------------------------------------
3、 用户管理
在刚安装好的mysql里包含一个含空密码的root帐号和一个匿名帐号,这是一个很大的安全隐患,我们应该为root帐号设置密码和删除匿名账号。
其中,MYSQL里面的系统数据库mysql包含一个user表,我们可以通过对user表操作来完成帐户的设置,因此可以使用以下命令:
use mysql;
delete from User where User="";
update User set Password=PASSWORD('newpassword') where User='root';
flush privileges //立即更新
---------------------------------------------
用户的管理是通过操作User表来实现的,添加新用户的方法有两个:一是在User表中插入相应的行,同时设置权限;二是通过GRANT命令创建相应权限的用户,其中GRANT命令格式如下:
grant 权限1,权限2,…,权限n on 数据库名.表名 to 用户名@连接地址 identified by ‘连接口令’;
grant all on
mydb.* to NewUserName@HostName identified by "password" ;
grant usage on *.* to NewUserName@HostName identified by "password";
grant select,insert,update on mydb.* to NewUserName@HostName identified by "password";
grant update,delete on mydb.TestTable to NewUserName@HostName identified by "password";
---------------------------------------------
对于插入User表添加的用户,密码password字段要用PASSWORD()函数进入加密;
全局管理权限:
FILE: 在MySQL服务器上读写文件。
PROCESS: 显示或杀死属于其它用户的服务线程。
RELOAD: 重载访问控制表,刷新日志等。
SHUTDOWN: 关闭MySQL服务。
数据库/数据表/数据列权限:
Alter: 修改已存在的数据表(例如增加/删除列)和索引。
Create: 建立新的数据库或数据表。
Delete: 删除表的记录。
Drop: 删除数据表或数据库。
INDEX: 建立或删除索引。
Insert: 增加表的记录。
Select: 显示/搜索表的记录。
Update: 修改表中已存在的记录。
特别的权限:
ALL: 允许做任何事(和root一样)。
USAGE: 只允许登录--其它什么也不允许做。
---------------------------------------------
二、数据库操作
1、 导出导入数据库
² 导出数据库命令:
mysqldump -u 用户名 -p --default-character-set=latin1 数据库名 > 导出的文件名(数据库默认编码是latin1)
² 导出数据表命令:
mysqldump -u 用户名 -p 数据库名 表名 > 导出的文件名
² 导入数据库命令:
法一:mysql>source sql脚本,如:source my.sql;
法二:mysqldump -u username -p dbname < filename.sql;
法三:mysql -u username -p -D dbname < filename.sql;
---------------------------------------------
2、 显示和使用数据库
显示所有数据库:mysql>show databases;
使用指定数据库:mysql>use <数据库名>;
查看当前数据库:mysql>select database();
查看数据库的表:mysql>show tables;
3、 删除数据库
命令:mysql>drop database <数据库名>
---------------------------------------------
三、数据表操作
1、 创建表与删除表
² 建表命令:
create table <表名> ( <字段名1> <类型1> [,..<字段名n> <类型n>]);
mysql> create table MyClass(
> id int(4) not null primary key auto_increment,
> name char(20) not null,
> sex int(4) not null default '0',
> degree double(16,2));
² 查看表结构命令:
mysql>describe <表名>;
mysql>desc <表名>;
mysql>show columns from <表名>;
² 删除数据表命令:
mysql> drop table <表名>;
² 修改字段命令:
mysql>Alter table <表名> add column <字段名> <字段类型>[<其它>];
mysql>Alter table <表名> drop <字段名>;
mysql>Alter table <表名> add primary key(<字段名>);
mysql>Alter table <表名> drop primary key(<字段名>);
mysql>Alter table <表名> change <原字段名> <新字段名> <字段类型>;
² 修改表名:
mysql>rename table <原表名> to <新表名>;
2、 增删改操作
² 插入数据
insert into <表名> [( <字段名1>[,..<字段名n > ])] values ( 值1 )[, ( 值n )]
² 更新数据
mysql>update <表名> set <字段>=新值,… where 条件
² 删除数据
mysql>delete from <表名> where 条件
3、 查询数据表记录
一、Select的基本语法
SELECT [ ALL | DISTINCT | DISTINCTROW | TOP ]
{* | talbe.* | [table.]field1[AS alias1] [,[table.]field2[AS alias2] [,…]]}
FROM tableexpression[,…] [IN externaldatabase]
[WHERE…]
[GROUP BY…]
[HAVING…]
[ORDER BY…]
[WITH OWNERACCESS OPTION]
---------------------------------------------
说明:
用中括号([])括起来的部分表示是可选的,用大括号({})括起来的部分是表示必须从中选择其中的一个。
1 FROM子句
FROM 子句指定了SELECT语句中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开),其中的表达式可为单一表名称、已保存的查询或由 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 得到的复合结果。如果表或查询存储在外部数据库,在IN 子句之后指明其完整路径。
例:下列SQL语句返回所有有定单的客户:
SELECT OrderID,Customer.customerID
FROM Orders Customers
WHERE Orders.CustomerID=Customers.CustomeersID
2 ALL、DISTINCT、DISTINCTROW、TOP谓词
(1) ALL 返回满足SQL语句条件的所有记录。如果没有指明这个谓词,默认为ALL。
例:SELECT ALL FirstName,LastName
FROM Employees
(2) DISTINCT 如果有多个记录的选择字段的数据相同,只返回一个。
(3) DISTINCTROW 如果有重复的记录,只返回一个
(4) TOP显示查询头尾若干记录。也可返回记录的百分比,这是要用 TOP N PERCENT子句(其中N 表示百分比)
例:返回5%定货额最大的定单
SELECT TOP 5 PERCENT*
FROM [ Order Details]
ORDER BY UnitPrice*Quantity*(1-Discount) DESC
3 用 AS 子句为字段取别名
如果想为返回的列取一个新的标题,或者,经过对字段的计算或总结之后,产生了一个新的值,希望把它放到一个新的列里显示,则用AS保留。
例:返回FirstName字段取别名为NickName
SELECT FirstName AS NickName ,LastName ,City
FROM Employees
例:返回新的一列显示库存价值
SELECT ProductName ,UnitPrice ,UnitsInStock ,UnitPrice*UnitsInStock AS
valueInStock
FROM Products
二 .WHERE 子句指定查询条件
1 比较运算符
比较运算符 含义
= 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
<> 不等于
!> 不大于
!< 不小于
例:返回96年1月的定单
SELECT OrderID, CustomerID, OrderDate
FROM Orders
WHERE OrderDate>#1/1/96# AND OrderDate<#1/30/96#
注意:
Mcirosoft JET SQL 中,日期用‘#’定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时,要加上单引号’’,尾空格在比较中被忽略。
例:
WHERE OrderDate>#96-1-1#
也可以表示为:
WHERE OrderDate>Datevalue(‘1/1/96’)
使用 NOT 表达式求反。
例:查看96年1月1日以后的定单
WHERE Not OrderDate<=#1/1/96#
2 范围(BETWEEN 和 NOT BETWEEN)
BETWEEN …AND…运算符指定了要搜索的一个闭区间。
例:返回96年1月到96年2月的定单。
WHERE OrderDate Between #1/1/96# And #2/1/96#
3 列表(IN ,NOT IN)
IN 运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。
例:要找出住在 London、Paris或Berlin的所有客户
SELECT CustomerID, CompanyName, ContactName, City
FROM Customers
WHERE City In(‘London’,’ Paris’,’ Berlin’)
4 模式匹配(LIKE)
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。
LIKE运算符里使用的通配符
通配符 含义
? 任何一个单一的字符
* 任意长度的字符
# 0~9之间的单一数字
[字符列表] 在字符列表里的任一值
[!字符列表] 不在字符列表里的任一值
- 指定字符范围,两边的值分别为其上下限
例:返回邮政编码在(171)555-0000到(171)555-9999之间的客户
SELECT CustomerID ,CompanyName,City,Phone
FROM Customers
WHERE Phone Like ‘(171)555-####’
LIKE运算符的一些样式及含义
样式 含义 不符合
LIKE ‘A*’ A后跟任意长度的字符 Bc,c255
LIKE’5[*]’ 5*5 555
LIKE’5?5’ 5与5之间有任意一个字符 55,5wer5
LIKE’5##5’ 5235,5005 5kd5,5346
LIKE’[a-z]’ a-z间的任意一个字符 5,%
LIKE’[!0-9]’ 非0-9间的任意一个字符 0,1
LIKE’[[]’ 1,*
三 .用ORDER BY子句排序结果
ORDER子句按一个或多个(最多16个)字段排序查询结果,可以是升序(ASC)也可以是降序(DESC),缺省是升序。ORDER子句通常放在SQL语句的最后。
ORDER子句中定义了多个字段,则按照字段的先后顺序排序。
例:
SELECT ProductName,UnitPrice, UnitInStock
FROM Products
ORDER BY UnitInStock DESC , UnitPrice DESC, ProductName
ORDER BY 子句中可以用字段在选择列表中的位置号代替字段名,可以混合字段名和位置号。
例:下面的语句产生与上列相同的效果。
SELECT ProductName,UnitPrice, UnitInStock
FROM Products
ORDER BY 1 DESC , 2 DESC,3
四 .运用连接关系实现多表查询
从数据显示的方式来讲,主要有:内部连接和外部连接:
² 内部连接—只返回满足条件的数据
FROM table1 INNER JOIN table2 ON table1.field1 comparision
table2.field2
其中comparision 就是前面WHERE子句用到的比较运算符,其中,在一个JOIN语句中连接多个ON子句 ,
² 外部连接—除了返回满足条件的记录外,还返回左(右)表中不满足条件的记录,称为左(右)连接
左连接:FROM table1 LEFT JOIN table2 ON table1.field1 comparision
table2.field2
右连接:FROM table1 RIGHT JOIN table2 ON table1.field1 comparision
table2.field2
全连接:FROM table1 FULL JOIN table2 ON table1.field1 comparision table2.field2
² 自然连接—以两个表具有相同的字段的所有列为基础,选择两个表中那些在所有匹配的列中的值相等的行,如果列具有相同的名称,但数据类型不同,则会报错。
FROM table1 NATURAL JOIN table2 ON table1.field1 comparision table2.field2 ;
五. 分组和总结查询结果
在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。
GROUP BY 子句的语法
SELECT fidldlist
FROM table
WHERE criteria
[GROUP BY groupfieldlist [HAVING groupcriteria]]
注:Microsoft Jet数据库 Jet 不能对备注或OLE对象字段分组。
GROUP BY字段中的Null值以备分组但是不能被省略。
在任何SQL合计函数中不计算Null值。
GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。
例:在‘WA’地区的雇员表中按头衔分组后,找出具有同等头衔的雇员数目大于1人的所有头衔。
SELECT Title ,Count(Title) as Total
FROM Employees
WHERE Region = ‘WA’
GROUP BY Title
HAVING Count(Title)>1
JET SQL 中的聚积函数
聚集函数 意义
SUM ( ) 求和
AVG ( ) 平均值
COUNT ( ) 表达式中记录的数目
COUNT (* ) 计算记录的数目
MAX 最大值
MIN 最小值
VAR 方差
STDEV 标准误差
FIRST 第一个值
LAST 最后一个值
4、 视图简介
视图是一个虚拟表,其内容由查询定义,同真实的表一样,包含一系列带有真实名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在,列和行数据由来自定义视图的查询所引用的表,并且在引用视图时动态生成。
对视图的操作与对表的操作一样,可以对其进行查询、修改、删除。当通过视图对数据进行修改时,相应的基表的数据也发生变化。同时,若基表的数据发生变化,则这种变化也会自动地反应到视图中。
所以,视图是存储在数据库中的查询的sql语句,它主要出于两个原因:安全原因,视图可以隐藏一些数据;另一原因是可以使复杂的查询易于理解和使用。
² 创建视图语法
create [or replace] [algorithm = {undefined | merge | temptable}] view [db_name.] view_name [(column_list)] as select_statement [with [cascaded | local] check option]
---------------------------------------------
通过该语句可以创建视图,若给定了[or replace],则表示当已具有同名的视图时,将覆盖原视图。select_statement是一个查询语句,这个查询语句可从表或其它的视图中查询。视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。
表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复。
² 修改视图语法:
alter [algorithm = {undefined | merge | temptable}] view view_name [(column_list)] as select_statement [with [cascaded | local] check option]
----------------------------------------------
该语句用于更改已有视图的定义。其语法与create view类似。
5、 索引与优化
索引对查询速度有着至关重要的影响,它用来快速地寻找那些具有特定值的记录,可以无须扫描整个表即可得到查询目标记录的位置。
² 选择索引的数据类型的原则:
(1) 越小的数据类型通常更好:越小的数据类型占用空间小,处理起来更快;
(2) 简单的数据类型更好:整型数据比起字符,处理开销更少;
(3) 尽量避免NULL:在MYSQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引统计信息及比较运算更加复杂,你应该用0、一个特殊的值或者一个空串代替空值。
² 索引的类型
(1普通索引
a.创建索引: create index <索引名> on <表名> (<字段名>(长度));
b. 修改表结构:alter <表名> add index <索引名> on (<字段名>(长度));
c. 创建表时指定索引:
create table <表名> […], index <索引名> (<字段名>(长度));
(2唯一索引:索引列的值必须唯一
a.创建索引: create unique index <索引名> on <表名> (<字段名>(长度));
b. 修改表结构:alter <表名> add unique <索引名> on (<字段名>(长度));
c. 创建表时指定索引:
create table <表名> […], unique <索引名> (<字段名>(长度));
(3主键索引
即是定义为主键的列作为索引列,也可以有三种方式来创建。
(4全文索引
mysql从3.23.23起开始支持全文索引和全文检索,全文索引的索引类型为fulltext,可以在varchar或者text类型的列上创建。
(5删除索引:
Drop index <索引名> on <表名>;
----------------------------------------------
选择索引列,主要考虑两种情形的列:在WHERE条件中出现的列;在JOIN子句中出现的列。使用多列索引时,要注意最左前缀的影响。
索引可以提高查询的速度,但是会降低更新表的速度,因为更新表,不但要更新表的数据,而且也要更新索引文件。如果过多地定义索引,会占用很多的磁盘空间,因为建立索引会占用索引文件。
6、 存储过程
存储过程是一组为了完成特定功能SQL语句集,经编译后存储在数据库中,它可以由SQL语句和一些特殊的控制结构组成。注意,只是在MYSQL5.0中才引入存储过程。
² 创建存储过程:
Create procedure <存储过程名>([参数属性 参数 参数类型|…])
Begin
………
End
其中,参数属性可以是in、out、inout;用命令行创建时,可以使用<delimiter 字符 >设置另一个分割符来代替<;>,否则编译出错,同时创建完成后,记得使用<delimiter ; >设置为原来的分割符。
² 调用存储过程:
Call <存储过程名>();
² 删除存储过程:
Drop procedure <存储过程名>;
注意不能在一个存储过程中删除另一个存储过程,只能调用。
² 显示某个存储过程信息:
Show create procedure <存储过程名>;
7、 触发器