数据库(RDBMS里的DB)就是一个用来存放信息的仓库。
管理系统(MS)对数据进行插入检索修改。
关系就是把两个表通过某种联系能联系起来。
SQL是标准的结构化查询语句。
MySql是客户/服务器体系结构。这样能带来的一些好处: 1.并发控制。2.不必非得在你存放数据库的那台机器上进行登录。
执行SQL语句: select now();显示当前的日期和时间。除了分好以外还有另一种方法是使用\g(表示go)。
mysql> select now(),version()\G *************************** 1. row ******** now(): 2013-06-05 15:02:32 version(): 5.1.44-community 1 row in set (0.00 sec) mysql> select now(),version()\g +---------------------+------------------+ | now() | version() | +---------------------+------------------+ | 2013-06-05 15:02:41 | 5.1.44-community | +---------------------+------------------+ 1 row in set (0.00 sec) mysql> select now(),version(); +---------------------+------------------+ | now() | version() | +---------------------+------------------+ | 2013-06-05 15:02:47 | 5.1.44-community | +---------------------+------------------+ 1 row in set (0.00 sec)
不同之处大家可以自己看出来,\G为横排显示结果,\g为竖排显示结果。
还有大家要记住一个事就是:在函数名和括号中间不能出现空格,不然会报错。
创建数据库:create database
create datebase [if not exists] db_name [db_attr];如果你没有创建该数据库的create权限,这条语句将执行失败。
如果你打算建的数据库已经存在,那么这句话将报错。如果你使用了if not exists字句,数据库将不会被创建,这条语句也不会报错。
可选的character set 和collate属性可以在数据库名之后给出,以指定一个默认的字符集和拍排序方式。Mysql将数据库的属性保存在数据库子目录的db.opt文件里。
mysql> select database(); +------------+ | database() | +------------+ | NULL | +------------+ 1 row in set (0.00 sec)
创建一个实例数据库
创建用户 create user
create user account [identified by [password] 'password']
如果给出identified by 字句,它将给新账户设置一个口令。PASSWORD一般可以省略。这条语句必须要具有create user权限。
create user sampadm1@'localhost' identified by 'sampadm1';
在查看比较结构时:这么语句的效果一样
desc table table name;
desscribe table_name;
explain table_name;
show colimns from table_name;
show fields from table_name;
创建数据表:
mysql> CREATE TABLE president -> ( -> last_name VARCHAR(15) NOT NULL, -> first_name VARCHAR(15) NOT NULL, -> suffix VARCHAR(5) NULL, -> city VARCHAR(20) NOT NULL, -> state VARCHAR(2) NOT NULL, -> birth DATE NOT NULL, -> death DATE NULL -> ); Query OK, 0 rows affected (0.07 sec) mysql> CREATE TABLE member -> ( -> member_id INT UNSIGNED NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (member_id), -> last_name VARCHAR(20) NOT NULL, -> first_name VARCHAR(20) NOT NULL, -> suffix VARCHAR(5) NULL, -> expiration DATE NULL, -> email VARCHAR(100) NULL, -> street VARCHAR(50) NULL, -> city VARCHAR(50) NULL, -> state VARCHAR(2) NULL, -> zip VARCHAR(10) NULL, -> phone VARCHAR(20) NULL, -> interests VARCHAR(255) NULL -> ); Query OK, 0 rows affected (0.10 sec)
MySIAM是不支持外键的。
插入数据:
插入一天数据:
insert into table values(values1,values2....);这些值的先后顺序要和数据表里的先后顺序保持一致。
在mysql 里面也可以一次插入多行数据 insert into table values(....),(.....);
可以对应的值 insert into table(a,b) values(avlues,bvalues);
还可以使用包含col_name -value。
insert into member set last_name ='stein',first_name='waldo';
通过文件来插入行:
字符串的比较操作通常不区分大小写。
查询多值,使用In()
Select last_name,first_name state from president where state in(‘va’,’ma’);
null值 使用方法是is null 或者is not null.
Select last_name,first_name from president where death is null;
也可以写成:
Select last_name,first_name from president where death<=>null;
order by 使用
使总统按last_name字母排列
Select last_name,first_name from president order by last_name;
如果需要降序则order by后面加desc.
总统的出生地按逆序排列,州相同的按last_name升序排列。
Select last_name,first_name,state from president order by state desc ,last_name asc;
0代表 death is null true 1代表 death is null false所以按姓名排序,将没死总统的写在前面,如下:
select last_name,first_name,death from president
order by if(death is null ,0,1),death desc;
从president 随机抽取一条数据
mysql> select last_name,first_name,death from president order by rand() limit 1; oracle 使用rownum
+-----------+------------+-------+
| last_name | first_name | death |
+-----------+------------+-------+
| Bush | George W | NULL |
+-----------+------------+-------+
1 row in set (0.00 sec)
9.对输出列进行求值和命名
select 'c',format(sqrt(12+13),3);
+---+-----------------------+
| c | format(sqrt(12+13),3) |
+---+-----------------------+
| c | 5.000 |
+---+-----------------------+
1 row in set (0.05 sec)
10. mysql> select concat(first_name,' ',last_name) ,concat(city,',',state)
-> from president;
+----------------------------------+------------------------+
| concat(first_name,' ',last_name) | concat(city,',',state) |
+----------------------------------+------------------------+
| William J Clinton | A,VA |
| George H.W Bush | B,VA |
| James E Carter | C,VA |
| George W Bush | D,VA |
| Gerald R Ford | E,VT |
| Ronald W Reagan | F,VT |
日期的加减 用date_add 和date_sub 完成
mysql> select date_add('2012-1-1',interval 20 year); +---------------------------------------+ | date_add('2012-1-1',interval 20 year) | +---------------------------------------+ | 2032-01-01 | +---------------------------------------+ 1 row in set (0.00 sec)
设置sql变量
mysql> Select @birth :=birth from president where last_name ='ford'; +----------------+ | @birth :=birth | +----------------+ | 1936-01-03 | +----------------+ 1 row in set (0.00 sec)
变量赋值的命名语法是“@变量名:=值”
distinct 使用
mysql> select distinct state from president order by state; +-------+ | state | +-------+ | VA | | VT | +-------+
delete 语句
delete [low_priority] [quick] [ignore] from table_name [where] [order by] [limit]
delete 可以删除多个表数据,同select
如: delete from t1 from t1 inner join t2 were t1.id=t2.id;
MySQL有个sql_mode的系统变量可以让你调控其SQL模式,对这个变量可以做出全局性的设置,而各个客户可以通过改变这个模式啦影响他们对自己对MySQL服务器的连接。
strict_all_tables和strict_trans_tables将启用严格模式。在接受“坏”数据将更加严格
traditional是另一种复合模式,它类似于严格模式。
ansi_quotes告诉Mysql服务器把双引号识别为一个标示符引用字符。
pipes_as_concat将导致“||”字符串被视为一个标准的SQL字符串合并操作符,而不是“OR”
ansi是一种复合模式,它将启用pipes_as_concat,ansi_quotes。和另外几种模式
查询当前的模式:
mysql> select @@global.sql_mode; +--------------------------------------------+ | @@global.sql_mode | +--------------------------------------------+ | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +--------------------------------------------+ 1 row in set (0.00 sec)
MySql标示符里的合法字符。由系统级字符集的字母和数字字符加“_”“$”组成,标示符的最大长度为64个字符,假名的最大长度128字符
SQL 关键字和函数名不区分大小写。 Select now()==seleCt noW()
数据库、数据表和视图的名字大小写看操作系统而定。Window 上不区分大小写,unix上区分大小写。
存储过程和事件的名字不区分大小写。而触发器区分大小写。
在一个语句中多次使用假名,则大小写保持一致
MySQL服务器允许使用多种字符集。你可以在服务器、数据库、数据表、数据列和舒服穿等设定字符集。cllate()函数将返回字符集是什么
mysql> show character set; +----------+-----------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+-----------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | | dec8 | DEC West European | dec8_swedish_ci | 1 | | cp850 | DOS West European | cp850_general_ci | 1 | ....................................
..................................... 36 rows in set (0.00 sec)
查看排序方式:
mysql> show collation like 'utf8%'; +--------------------+---------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +--------------------+---------+-----+---------+----------+---------+ | utf8_general_ci | utf8 | 33 | Yes | Yes | 1 | | utf8_bin | utf8 | 83 | | Yes | 1 | | utf8_unicode_ci | utf8 | 192 | | Yes | 8 | | utf8_icelandic_ci | utf8 | 193 | | Yes | 8 | ........................ +--------------------+---------+-----+---------+----------+---------+ 21 rows in set (0.00 sec)
如果想显示服务器当前的默认字符集和排
mysql> show variables like 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | +--------------------------+--------+ 7 rows in set (0.00 sec)
如果有用户想用latin1与服务器通信,如下
mysql> set character_set_client=latin1;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_re=latin1;
Query OK, 0 rows affected (0.00 sec)
mysql> set character_set_connection=latin1;
Query OK, 0 rows affected (0.00 sec)
不过用一条set names ‘latin1’更方便,相当于上面3条
MySQL6.0版本之前的Unicode支持。
- Ucs2字符集,它使用两个字节表示一个字符。这种字符集无法显示需要用两个以上的字节才能表示的字符。
- Utf8 字符集使用1-3个字节表示一个字符。
MySQL6.0版本之后的Unicode支持。
a. utf8占1-4个字节。
如果想查看现在数据库的定义
mysql> show create database sampdb1; +----------+------------------------------------------------------------------+ | Database | Create Database | +----------+------------------------------------------------------------------+ | sampdb1 | CREATE DATABASE `sampdb1` /*!40100 DEFAULT CHARACTER SET utf8 */ | +----------+------------------------------------------------------------------+ 1 row in set (0.00 sec)
数据库的删除
只要你有足够的权限
mysql> create database if not exists cyf character set utf8;
Query OK, 1 row affected (0.00 sec)
删除数据库 :drop database database;
Query OK, 0 rows affected (0.09 sec)
Drop database 如果遇到失败情况,说明那个数据哭的子目录中还包含有一些与数据库对象无关的文件。
存储引擎(storage engine):
mysql> show engines\G *************************** 1. row *************************** Engine: MyISAM 是MySQL默认的存储引擎,也可以在配置文件中修改。 Support: YES Comment: Default engine as of MySQL 3.23 with great performance Transactions: NO XA: NO Savepoints: NO *************************** 2. row *************************** Engine: CSV Support: YES Comment: CSV storage engine Transactions: NO XA: NO Savepoints: NO *************************** 3. row *************************** Engine: MRG_MYISAM Support: YES Comment: Collection of identical MyISAM tables Transactions: NO XA: NO Savepoints: NO *************************** 4. row *************************** Engine: BLACKHOLE Support: YES Comment: /dev/null storage engine (anything you write to it disappears Transactions: NO XA: NO Savepoints: NO *************************** 5. row *************************** Engine: FEDERATED Support: NO Comment: Federated MySQL storage engine Transactions: NULL XA: NULL Savepoints: NULL *************************** 6. row *************************** Engine: InnoDB Support: DEFAULT Comment: Supports transactions, row-level locking, and foreign keys Transactions: YES XA: YES Savepoints: YES *************************** 7. row *************************** Engine: ARCHIVE Support: YES Comment: Archive storage engine Transactions: NO XA: NO Savepoints: NO *************************** 8. row *************************** Engine: MEMORY 内存上不占用硬盘空间, Support: YES Comment: Hash based, stored in memory, useful for temporary tables Transactions: NO XA: NO Savepoints: NO 8 rows in set (0.00 sec)
MylSAM存储引擎室MySQL默认的存储引擎。
a.提供了键压缩的功能。数值都是按照高位的字节有限的办法来保存的。 如果想激活数值压缩功能,则在创建MyISAM数据表时使用PACK_KEY=1选项。
b.每个MySQL数据表都有一个标志,服务器或myisamchk程序在检查时会对这个标志进行设置。
c.还有一个标志用来表明该数据在上次使用后是不是被正常关闭,如果服务器意外宕机或者机器崩溃,这个标志可以用来判断数据表是否需要检查和修复。通过启动服务器时使用 –myisam-recover选项,能够让服务器每次打开一个MyISAM数据表时自动检查该数据表的标志。
d.MyISAM存储引擎支持全文检索,但这需要通过FULLTEXT索引来实现。
e.MyISAM支持空间数据类型和spatial索引。
MERGE数据表提供了一种把多个MyISAM数据表合并为一个逻辑单元的手段。这种好处是可以突破文件系统对各个MyISAM数据表大小的限制。
用来构成merge表的MyISAM表必须具有相同的表结构。
MEMORY存储引擎,把数据表保存在内存中,数据行的长度是固定不变的,这两点使数据表的检索速度快。
为什么MEMORY存储引擎检索速度非常快:
a. MEMORY使用散列索引,这种索引进行“相等比较”的速度非常快。但不适合进行“<“ ”>“比较中,所不适合在用在order by 字句中。
b. MEMORY中的数据行是固定不变的,意味着你不能使用BLOB或者是TEXT这样的长度可变的数据类型。Varchar长度可变,但在MySQL内部被当做长度固定不变的char,所以可以使用
InnoDB存储引擎:
a. 支持提交和回滚操作,确保在事务处理中万无一失,还可以通过创建保存点(savepoint)的办法来实现部分回滚。
b.在系统崩溃后能自动恢复。
c.数据行级锁定和多版本共享,这使得Innodb数据表在需要同时进行检索和更新操作的复杂查询里表现出非常好的性能。
d.在默认的情况下,InnoDB存储引擎会吧数据表存储在一个共享的表空间中。但是也可以将它配置成为各个表分别创建表空间的,此时每个数据表在它的数据库子目录中都会有一个对应的.ibd文件。
e.对外键的支持。
Falcon存储引擎:
a.支持提交和回滚操作,确保在事务处理中万无一失,还可以通过创建保存点(savepoint)的办法来实现部分回滚。
b.在系统崩溃后能自动恢复。
c.数据行级锁定和多版本共享,这使得Falcon数据表在需要同时进行检索和更新操作的复杂查询里表现出非常好的性能。
d.在存储时对数据行进行压缩,在检索时对数据行进行解压缩已节省空间。
e.在日常管理和维护方面的开销低。
FEDREATED存储引擎是访问其他MySQL服务器管理下的数据表。fedreated存储引擎的表并不在本地的服务器上。
NDB 是MySQL集群存储引擎。MySQL服务器的作用是帮助其他进程访问NDB数据表。
ARCHIVE存储引擎对数据进行归档,它最适合用来大量的保存那些“写了就不改”的数据。所以它支持的SQL语句比较少。不支持索引 在版本5.1.6后最多也只能有个带索引的auto_increment数据列。
存储引擎的可移植性对比:
a.MyISA和Innodb数据表的存储格式与机器无关,我们具备二进制可移植性-前提条件是处理器使用的是二进制补码整数算法和IEEE浮点格式。
b.MERGE数据表的可移植性取决于其成员MyISQL数据表。
c.CSV 数据表是二进制可移植的,因为它根本不包含任何内容。
d.Memory数据表不具备可移植性,因为它保存在内存中。
Falcon 可以。
对于InnoDB来说,二进制的可移植性还有另外一个条件,数据和数据表的名字应该由小写字母构成。
对于MyISAM数据表来说,如果在开始对它查询之前需要填充大量的数据,第二种策略旺旺根号,与先把数据加载到一个不带任何索引的MyISAM数据表里之后再去创建索引的做法相比,
每行插入一个数据行都刷新一个索引要慢得多。
mysql> show create table student\G *************************** 1. row *************************** Table: student Create Table: CREATE TABLE `student` ( `name` varchar(20) NOT NULL, `sex` enum('F','M') NOT NULL, `student_id` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`student_id`) ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 1 row in set (0.04 sec)
数据存储引擎,还可以使用show table status语句或者INFORMATION_SCHEMA.TABLES数据表查看。
如果你在进行批处理,使用if not exists这样如果数据表存在,将不会产生错误,继续进行。
如果在数据表创建语句上加上temporary 关键字,服务器将会创建出一个临时的数据表,它在你与服务器连接断开时自动消失。
一个tempporary数据表的名字允许与一个现有的永久性的数据表相同。只是在此期间此表用户将不能够看到那个永久性数据表。
使用temporary应该注意的几点:
- 如果与服务器连接意外断开后自动连接,上次创建的temporary表将不存在。如果此时你使用drop table 语句会把永久表给删掉。如果想避免这种情况需要使用drop temporary table来使用。
- 因为temporary只是对创建他们的连接时可见的,所以如果使用了某种连接池机制的,因为连接池机制不能保证你发出的每一条语句使用的都是统一连接。
MySQL提供两种语句帮助我们从其他的数据表或是从查询结果中创建新的数据表。
- create table like 优:能把表的结构丝毫不差的复制过来,包括索引结构。
缺:不能从原始数据表的数据列的一个子集创建出一个新的数据表,也不能使用其他数据表的数据列。
2.create table…… select 优:能从原始数据表的数据列的一个子集创建出一个新的数据表
缺:只能复制所以数据列,不能复制其属性,索引。
- 假设日志数据表当前的集合包括log_2004 log_2005 log_2006 log_2007 log_2008
这样可以创建一个MERGE数据表。
Create table log_total
(
Dt datetime not null,
Info varchar(100) not null,
Index(dt)
)engine = merge union=( log_2004 ,log_2005, log_2006 ,log_2007 ,log_2008)
Insert_method=last; 表示插入操作是对union列出文件的最后一个进行操作。
这样可以查询所有日志文件的总行数
Select count(*) from log_total;
可以查询每一年的记录项:
Select year(dt) as y ,count(*) as number from log_total group bu y;
再包含进一个日志log——2009
Alter table log_total union(log_2004 ,log_2005, log_2006 ,log_2007 ,log_2008,log_2009);
分区数据表与MERGE存储引擎的不同:
- 每个分区数据表是货真价实的数据表,而不是一个逻辑构造。
- 分区数据表能使用MyISAM意以外的存储引擎。而MERGE只能使用MyISAM存储引擎。 分区数据表的优点:
- 数据表可以分布在不同的设备上,这意味着我们通过某种I/O并行机制缩短访问时间。
- 优化器可以把检索操作限定在某个特定的分区或是同时搜索多个分区。
分区数据表
create table log_partition
(dt datetime not null,
info varchar(10) not null,
index(dt)
)
partition by range(year(dt))
(
partition p0 values less than (2005),
partition p1 values less than (2006),
partition p2 values less than (2006),
partition p0 values less than maxvalues)
Federated存储引擎可以让你访问在其他主机上的另一个MySQL服务器实际管理的数据
表。
create table federated_student
(
Name varchar(20) not null,
Sex emum(‘M’.’F’),
Student_id int unsigned not null auto_increament,
Primary key(student_id)
)engine=federated
Connection =’mysql://sampadm:a123@1.1.1.1/sampdb/student’;
这里可以通过修改federated_student表去修改远程服务器上的student表。
由于对于使用show create table 或类似的语言区查看你的federated数据表对任何人来说都是可见。从5.1.15版本开始,
可以避免这个问题了。提前用create server语句创建一个存储服务器定义(需要super)权限。
Create server corn_sampdb_server
Foreign data wrapper mysql
Option(
Use ‘sampadm’,
Password ‘a123’,
Host ‘1.1.1.1’,
Database ‘sampdb’
);
这样做更安全,因为这种定义只有那些有权访问mysql数据库的用户才能查看到。
删除数据表
Drop table student;
Drop table student,score;
如果你想要数据表存在的话你删除它: drop table if exists student;
可以用show warnings来查看警告
MySQL可以创建好几种索引:
a.唯一索引:这种索引不允许索引项本身出现重复值。
创建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
创建表的时候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );
普通索引:这种索引的有点是允许索引值出现重复。
创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );
FUlltext索引。用来进行全文检索。这种索引只适用于MyISAM数据表。
d.spatial索引。这种索引值适用于MyISAM数据表和空间数据类型。
hash索引。这是memory数据表的默认索引类型。
创建索引:
mysql> alter table student3 add fulltext student_id_ftext(sex);
mysql> alter table student add index student_id_ind(student_id);
mysql> alter table student add unique student_id_unq(student_id);
如果索引是primary key或者是spatial 索引,则带索引的数据列必须具备not null属性。
Primary key与unique索引。区别有如下:
a.每个数据表只能有一个primary key.
b.primary key不可以包含空值,而unique 可以。
除了primary key 外,其他的索引几乎都可以用create index语句来添加。
memory数据表的默认索引是hash.利用散列索引进行精确查询的速度非常快。但是要进行范围的比较,最好创建一个btree索引。如下:
create table namelist
(
Id int not null,
Name char(100);
Index using btree(id)
)engine=memory;
如果对某个字符串的数据列的前缀编索引。
Create table addresslist
(
Name char(30) not null,
Address binary(60) not null,
Index(name(10)),
Index(address(15))
);
.删除索引:
Drop index index_name on tbl_name;
mysql> drop index student_id_unq on student;
因为drop index 在MySQL内部会被当做一条alter table语句来处理。所以可以:
如果你删除了组成某个索引的数据列,MySQL将删除这个索引。
改变数据列的数据类型。
mysql> drop index student_id_unq on student;
mysql> alter table student change name name1 varchar(16);
可以为各个列指定字符集
mysql> alter table student modify name1 char(20) character set ucs2;
如果两个数据列的类型完全相同的话,比较的速度会比较快。 Char(15) 和char(15)
让数据表改用另一种存储引擎: alter table student engine=MEMORY;
转化存储引擎有几点需要注意的:
a.如果数据表包含有BLOB数据列,你将不能把它转化为MEMORY。
b.MyISAM中包含有fulltext或者spatial索引,你将不能把它转化为使用的另一种引擎,只有MyISAM支持。
c.MEMORY数据表保存在内存中,当服务器重启后将消失。
d.只有INNODB支持外键。
e.如果使用一组Merge数据表来管理一组MyISAM数据表,就应该避免使用alter table ,这样去改变个别的MyISAM数据表结构,除非其他的表也一样修改。不然会有不同的表结构。
重新命名一个数据表。
方式1:mysql> alter table student3 rename to student4 ;
方式2:mysql>rename table student4 to student5; 可以一个语句同时为多个表重命名
注:如果重命名的那个表示MyISAM,必须重新定义MERGE数据表。
左连接查询
左连接查询会为左边的数据表的每个数据行生成一个输出数据行,不管在右边表了面有没有匹配
mysql> select * from t1 left join t2 on t1.i1=t2.i2; 这边使用where是不可以的
+------+------+------+------+
| i1 | c1 | i2 | c2 |
+------+------+------+------+
| 1 | a | NULL | NULL |
| 2 | b | 2 | c |
| 3 | c | 3 | b |
+------+------+------+------+
3 rows in set (0.00 sec)
在where字句中不能使用聚合函数。
在默认情况下,union将从结果集中剔除重复的数据行。
如果你想保留重复的数据行,使用union all
创建视图:
Create view vstudent as select last_name,first_name from student;
要重新命名视图中的列
mysql> Create view vstudent2 (i,j) as select last_name,first_name from president
事务 如innodb 和falcon具备事务安全性。
6.InnoDB存储引擎提供了4中隔离级别:
READ UNCOMMITTED:
READ COMMITED:
REPEATABLE READ: MySQL不能容忍幻影数据。注:有些数据库的这个级别允许
SERIALIZBLE
明确的锁定数据表。锁定数据表
Lock tables inventory write; write锁,需要对它进行写新数据库
解除锁: unlock tables;
外键可以帮我们维护数据的一致性。
12. on delete字句:
On delete cascade字句,是在删除父表数据行时,字表想关联的数据行也被删除。
On delete set null: 是在删除父表数据行时,字表想关联的数据行被设置为空null。
键关系:
a. 字表必须存在一个索引
b. 父表和子表索引里的对应数据列必须是兼容的数据类型。
c.你不能对外键关系里字符串数据列的前缀编制索引。
查看外键关系:mysql> show engine innodb status;
想要对摸个数据进行全文搜索,必须事先先为它创建一个FULLTEXT索引。这种索引只能在MyISAM数据表中创建。
自然语言搜索:
Select * from apothegm where march(列名) against(‘字符串’);
布尔模式:
Select * from apothegm where match(attribution,phrase)
Against(‘“bell book and candle“’ in Boolean mode); 如果搜索的是一个短语,需要用双引号,而且要按顺序。
存储程序主要是:
a.存储函数
b.存储过程
c.触发器
d.事件
.存储函数、.存储过程开始支持与5.0.0版本。对触发器是5.0.2 对事件是5.1.6
存储程序的优点:
a.存储程序对象的可执行部分可以用复合语句来编写。
b.存储过程被保存在服务器端,所以程序只在他们被创建的时候使用一次,这大大减少了网络开销。
c.它们可以把复杂的计算封装为程序单元,可以简单的通过名字来调用。
d.它们可以用来实现“标准化的操作计算”。
e.它们提供了错误处理机制。
.在复合语句中必须要考虑和解决这个问题:复合语句必须以分号(;)隔开,但是;是mysql的分隔符。
Delimiter命令把mysql程序重定义为另一个字符或者字符串,这样存储程序就会将整个对象作为一条语句传递给服务器。
例:
mysql> delimiter $ 使用$作为结束符。
mysql> create procedure show_time() 创建存储过程
-> begin 为了保持风格统一,使用begin end
-> select 'local time is:',current_timestamp;
-> end $
Query OK, 0 rows affected (0.06 sec)
存储函数:
mysql> delimiter $
mysql> create function count_born_in_year
-> returns int
-> reads sql data
-> begin
-> return(select count(*) from presid
-> end $
Query OK, 0 rows affected (0.07 sec)
注:在函数中无法返回多个值,可以编写任意多个函数来实现返回多个值。
如果定了了一个与MySQL内建函数同名的函数,你需要用数据库名来指明你使用的是那个函数;
建议:不要使用与内建函数同名的函数名。
存储函数与存储过程都属于数据库,要想要创建存储过程或存储函数,必须拥有那个数据库的create routine权限
如果你不想使用这种自动化的权限授予机制,那automatic_sp_privileges系统变量设置为0
6. 存储过程的参数分为3种类型
a.in:调用者把一个值传递给过程,过程可以对这个值进行修改,但任何修改在过程返回后对调用者是不可见的。
b.out :调用者把一个值传递给过程,任何修改在过程返回后对调用者是可见的
c.inout:允许调用者想过程传递一个值。然后在取回一个值。
注:要想明确指定参数的类型,只要在前面加上就可以,默认为in
是与特定数据表相关联的存储过程,当相应的数据表被insert、delete或update语句修改的时候,触发器将自动的执行。
触发器的一些好处:
- 触发器可以检查或修改将被插入或用来更新数据行的新数据值。
- 触发器可以把表达式的结果赋值给数据列作为其默认值。
- 触发器可以在删除或者修改数据行之前先检查它的当前内容。
create trigger bi_t before insert on t
-> for each row begin
-> set new.dt=current_timestamp;
-> if new.precent<0 then
-> set new.precent=0;
-> elseif new.precent>100 then
-> set new.precent=100;
-> end if;
-> end$
Query OK, 0 rows affected (0.07 sec)
.事件:在MySQL5.1.6之后就有了一个事件调度器,它可以使我们科数据库操作安排在预订的事件执行。
9.事件是一个与时间相关的存储程序,事件表用来定义事件发生的事件、次数、以及何时消失。
非常适合用来执行各个无人值守的系统管理任务。
如果想禁用某个事件,让它不再定期执行,
Alter event event_name disable;
Alter event event_name enable;
.Create event expire_web_session
On schedule every 4 hour
Do
Delete from web_session
Where last_visit<current_timestamp-interval 1day;
创建一个存储程序,也就是创建了一个将在未来的某个时刻执行的对象。 如果我把p()的execute权限授予给你,你就可以使用call p()来调用该过程去访问我的数据表。这样的安排上下文即有好处,也有坏处:
好处是:精心编写的存储程序可以把数据表开放给那些无权直接访问它的用户,开放程度由程序的创建者控制。
坏处是:如果一个用户创建了一个存储程序来访问敏感数据,可以调用这个对象的其他人将获得与该对象的定义者相同的数据访问权限。
可以在create 语句中使用一个definer = account字句来明确指定该存储程序或视图的定义者。
如果把一个存储程序或试图定义为宜definer的权限运行,但在其定义里definer账户并不存在,MySQL在执行该存储程序或试图时将抛出一个错误。
也可以使用 SQLSECURITY INVOKER 这样的话即使他执行了,这个视图,也不会看到他不应该看到的东西。
create sql security invoker view v as select concat (user,'@',host)as account,password from mysql.user
事件和触发器都是由服务器自动调用的,所以“调用者”的概念不适合他们。