一、基本操作
1、索引 ------》加快查询速度
1.1 建立索引的两种语句格式
alter table tbl_name add index idx_name(col);
create index idx_name on tbl_name(col);
1.2 查看新建的索引
show index from tbl_name;
2、视图
视图从一个或多个表中导出来的表,是一种虚拟存在的表。
创建视图的格式为:
create view view_name(cola,colb,colc) as select col1,col2,col3 from tbl_name;
eg:create view v_temp(v_name,v_age) as select name,age from employee;
3、导入:把一个文件里的数据保存进一张表
load data infile '文件路径和文件名' into table tbl_name;
4、导出:把数据库中的某个表中数据保存到一个文件之中
select col1,col2 into outfile '文件路径和文件名' from tbl_name;
load data infile '/tmp/SQL6/in.txt' into table employee;
select * from into outfile '/tmp/out.txt' from employee;
5、备份
备份与导出的区别:导出的文件只是保存数据库中的数据;而备份,则是把数据库的结构,包括数据、约束、索引、视图等全部另存为一个文件。
mysqldump是MySQL用于备份数据库的实用程序。它主要产生一个SQL文件,其中包括从头重新创建数据库所必需的命令create
table insert等。
$mysqldump -u root 数据库名 > 备份文件名; //备份整个数据库
$mysqldump -u root 表名字 > 备份文件名; //备份整个表
eg:mysqldump -u root mysql_shiyan > bak.sql
6、恢复
用备份文件回复数据库
①mysql -u root
create database test; //新建一个名为test的数据库
②输入以下语句进行回复,将备份文件bak.sql恢复到数据库test
mysql -u root test < bak.sql
如果不想执行正在输入过程中的一个命令,输入\c取消它;
mysql>select
->USER()
->\c //切换到mysql>
mysql>
二、进阶
1、计算行数:COUNT(*)函数计算行数
计算动物数目的查询应为:
SELECT COUNT(*) FROM pet;
如果你想要知道每个主人有多少宠物:
select owner,COUNT(*) from pet Group BY owner;
查看每种动物的数量:
SELECT species, COUNT(*) FROM pet GROUP BY species;
查看每种性别的动物数量:
SELECT sex, COUNT(*) FROM pet GROUP BY sex;
按种类和性别组合分类的动物数量:
SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
若使用COUNT(*),你不必检索整个表。例如, 当只对狗和猫进行查询时,应为:
SELECT species, sex, COUNT(*) FROM pet
WHERE species = 'dog' OR species = 'cat'
GROUP BY species, sex;
或,如果你仅需要知道已知性别的按性别分组的动物数目:
SELECT species, sex, COUNT(*) FROM pet
WHERE sex IS NOT NULL
GROUP BY species, sex;
2、获取数据库和表的信息
为了找出当前选择了哪个数据库,使用DATABASE()函数:
SELECT DATABASE();
如果你还没选择任何数据库,结果是NULL。
3、操作符
① = 等于:
mysql> SELECT 1 = 0;
mysql> SELECT '0' = 0;
mysql> SELECT '0.01' = 0;
对于行比较,(a, b) = (x, y)相当于:(a = x) AND (b = y)。
②<=> 空值安全的等号:
这个操作符与=操作符执行相同的比较操作,不过在两个操作码均为NULL时,其返回至为1而不为NULL,而当一个操作码为NULL时,其所得值为0而不为NULL。
mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
对于行比较,(a, b) <=> (x, y)相当于:(a <=> x) AND (b <=> y)。
③<> 或 != 不等于:
mysql> SELECT '.01' <> '0.01';
mysql> SELECT .01 <> '0.01';
mysql> SELECT 'zapp' <> 'zappp';
对于行比较,(a, b) <> (x, y)相当于:(a <> x) OR (b <> y)。
④<= 小于等于:
mysql> SELECT 0.1 <= 2;
对于行比较,(a, b) <= (x, y)相当于:(a <= x) AND (b <= y)。
⑤> 大于:
mysql> SELECT 2 > 2;
对于行比较,(a, b) > (x, y)相当于:(a > x) AND (b > y)。
⑥IS boolean_value和IS NOT boolean_value:根据一个布尔值来检验一个值,在这里,布尔值可以是TRUE、FALSE或UNKNOWN。
mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN;
# IS NULL 和 IS NOT NULL 检验一个值是否为 NULL。
mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;
mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;
⑦expr BETWEEN min AND max 假如expr大于或等于min且expr小于或等于max, 则BETWEEN的返回值为1,否则是0。若所有参数都是同一类型,则上述关系相当于表达式 :min <= expr AND expr <= max。其它类型的转换 根据本章开篇所述规律进行,且适用于3种参数中任意一种。
mysql> SELECT 1 BETWEEN 2 AND 3;
mysql> SELECT 'b' BETWEEN 'a' AND 'c';
mysql> SELECT 2 BETWEEN 2 AND '3';
⑧expr NOT BETWEEN min AND max这相当于NOT(expr BETWEEN min AND max)。
COALESCE(value,...) 返回参数列表当中的第一个非NULL值,在没有非NULL值的情况下返回值为NULL。
mysql> SELECT COALESCE(NULL,1);
mysql> SELECT COALESCE(NULL,NULL,NULL);
⑨GREATEST(value1,value2,...)当有2个或2个以上参数时,返回值为最大(最大值的)参数。比较参数所依据的规律同LEAST()相同。
mysql> SELECT GREATEST(2,0);
mysql> SELECT GREATEST('B','A','C');
在所有参数为NULL的情况下,GREATEST()的返回值为NULL。
⑩expr IN (value,...)若expr为IN列表中的任意一个值,则其返回值为1, 否则返回值为0。假如所有的值都是常数,则其计算和分类根据 expr的类型进行。这时,使用二分搜索来搜索信息。如果IN值列表全部由常数组成,则意味着IN的速度非常快。如果expr是一个区分大小写的字符串表达式,则字符串比较也按照区分大小写的方式进行。
mysql> SELECT 2 IN (0,3,5,'wefwf');
mysql> SELECT 'wefwf' IN (0,3,5,'wefwf');
尝试输入上述语句并分析结果,思考第二条语句的可行性。
IN列表中所列值的个数仅受限于max_allowed_packet值。
为了同SQL标准相一致,在左侧表达式为NULL的情况下,或是表中找不到匹配项或是表中一个表达式为NULL的情况下,IN的返回值均为NULL。
IN()语法也可用于书写某些类型的子查询。
⑪expr NOT IN (value,...)这与NOT (expr IN (value,...))相同。
ISNULL(expr)如果expr为NULL,那么ISNULL()的返回值为1,否则返回值为0。
mysql> SELECT ISNULL(1+1);
mysql> SELECT ISNULL(1/0);
通常使用ISNULL()来判断一个值是否为NULL。(使用=比较符对比一个值与NULL值是错误的)。
⑫INTERVAL(N,N1,N2,N3,...)假如N < N1,则返回值为0;假如N < N2 等,则返回值为1;假如N为NULL,则返回值为-1。所有的参数均按照整数处理。为了这个函数的正确运行,必须满足N1 < N2 < N3 < ……< Nn 。其原因是使用了二分查找(极快速)。
mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);
mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);
mysql> SELECT INTERVAL(22, 23, 30, 44, 200);
4、控制流程函数
①CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
在上面第一条语句返回的是value=compare-value的结果。而第二条语句的返回结果是第一条语句的真正的结果。如果没有匹配的结果值,则返回结果为ELSE语句后的结果,如果没有ELSE部分,则返回值为NULL。
mysql> SELECT CASE 1 WHEN 1 THEN 'one'
-> WHEN 2 THEN 'two' ELSE 'more' END;
mysql> SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END;
mysql> SELECT CASE BINARY 'B'
-> WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;
一个CASE表达式的默认返回值类型是任何返回值的兼容类型,但具体情况视其所在语境而定。如果用在字符串语境中,则返回结果为字符串类型。如果用在数字语境中,则返回结果为十进制值、实数值或整数值。
②IF(expr1,expr2,expr3)
如果expr1是TRUE(expr1 <> 0 and expr1 <> NULL),则IF()的返回值为expr2; 否则返回值则为expr3。IF()的返回值是否为数字值或字符串值,具体情况视其所在语境而定。
mysql> SELECT IF(1>2,2,3);
mysql> SELECT IF(1<2,'yes ','no');
mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
如果expr2或expr3中只有一个表达式是NULL值,则IF()函数的结果类型 为非NULL表达式的结果类型。
expr1必须作为一个整数值进行评估,也就是说,假如你正在验证浮点值或字符串值,那么应该使用比较运算进行检验。
mysql> SELECT IF(0.1,1,0);
-> 1
mysql> SELECT IF(0.1<>0,1,0);
-> 1
观察并对比上述语句的返回结果,发现在上述的第一个例子中,IF(0.1)的返回值为1,原因是IF(0.1)检验为真。在第二个例子中,比较检验了原始浮点值,目的是为了了解是否其为非零值,对比的结果是0.1确实不等于0,那么第一个表达式的结果就是整数1,因此返回结果为1。
③IFNULL(expr1,expr2)
假如expr1不为NULL,则IFNULL()的返回值为 expr1;否则其返回值为expr2。IFNULL()的返回值是否为数字或是字符串,具体情况取决于其所使用的语境。
mysql> SELECT IFNULL(1,0);
mysql> SELECT IFNULL(NULL,10);
mysql> SELECT IFNULL(1/0,10);
IFNULL(expr1,expr2)的默认结果值为两个表达式中数据类型更加“通用”的一个,顺序为STRING、REAL或INTEGER。假设有一个表中含有该表达式,或MySQL必须在内存储器中储存IFNULL()的返回值到一个临时表中:
CREATE TABLE tmp SELECT IFNULL(1,'test') AS test;
DESCRIBE tmp;
在这个例子中,测试列的类型为字符串类型CHAR(4)。
④NULLIF(expr1,expr2)
如果expr1 = expr2成立,那么返回值为NULL,否则返回值为expr1。这和CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END语句的原理相同。
mysql> SELECT NULLIF(1,1);
mysql> SELECT NULLIF(1,2);
注意:如果参数不相等,则MySQL会评估expr1两次。
5、字符串函数
返回值为字符串str的最左字符的数值。假如str为空字符串,则返回值为 0。假如str为NULL,则返回值为NULL。ASCII()用于从0到255的 数值的字符。
mysql> SELECT ASCII('2');
mysql> SELECT ASCII(2);
mysql> SELECT ASCII('dx');
返回值为N的二进制值的字符串表示,其中N为一个longlong (BIGINT)型数字。等同于CONV(N,10,2)。假如N为NULL,则返回值为NULL。
mysql> SELECT BIN(12);
返回值为二进制的字符串str 长度。
mysql> SELECT BIT_LENGTH('text');
CHAR()将每个参数N理解为一个整数,其返回值为一个由这些参数转换为字符后组成的字符串。其中NULL值被省略。
mysql> SELECT CHAR(77,121,83,81,'76');
mysql> SELECT CHAR(77,77.3,'77.3');
大于255的CHAR()参数被转换为多个字符。 例如,CHAR(256)相当于 CHAR(1,0), 而CHAR(256*256)则相当于CHAR(1,0,0):
mysql> SELECT HEX(CHAR(1,0)), HEX(CHAR(256));
mysql> SELECT HEX(CHAR(1,0,0)), HEX(CHAR(256*256));
CHAR()的返回值为一个二进制字符串。可选择使用USING语句产生一个给定的字符集中的字符串:
mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));
mysql> SELECT CHARSET(CHAR(0x65)), CHARSET(CHAR(0x65 USING utf8));
如果USING已经被给定,而结果字符串不符合给出的字符集,则会发出警告。同样,如果严格的SQL模式被激活,则CHAR()的结果会是NULL。
返回值为字符串str的长度,长度单位为字符,一个多字节字符算作一个单字符。对于一个包含五个二字节字符集,LENGTH()返回值为10,而CHAR_LENGTH()的返回值为5。
CHARACTER_LENGTH(str)
CHARACTER_LENGTH()等价于CHAR_LENGTH()。
返回结果为连接参数产生的字符串。如有任何一个参数为NULL,则返回值为 NULL。 如果所有参数均为非二进制字符串,则结果为非二进制字符串。 如果自变量中含有任意一个二进制字符串,则结果为一个二进制字符串。一个数字参数将被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型cast转换, 例如:
SELECT CONCAT(CAST(int_col AS CHAR), char_col)
mysql> SELECT CONCAT('My', 'S', 'QL');
mysql> SELECT CONCAT('My', NULL, 'QL');
mysql> SELECT CONCAT(14.3);
CONCAT_WS()代表CONCAT With Separator(使用分隔符连接),是CONCAT()的特殊形式。 第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为NULL。函数会忽略任何分隔符参数后的NULL值。
mysql> SELECT CONCAT_WS(',','First name','Second name','Last Name');
mysql> SELECT CONCAT_WS(',','First name',NULL,'Last Name');
CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的NULL)。
若N = 1,则返回值为str1,若N = 2,则返回值为tr2,以此类推。 若N小于1或大于参数的数目,则返回值为NULL(突然觉得这个函数好神奇)。
mysql> SELECT ELT(1, 'ej', 'Heja', 'hej', 'foo');
mysql> SELECT ELT(4, 'ej', 'Heja', 'hej', 'foo');
返回值为字符串。bits中的比特值按照从右到左的顺序接受检验 (低位比特到高位比特的顺序)。字符串被分隔字符串分开(默认为逗号','),按照从左到右的顺序被添加到结果中。其中number_of_bits会给出被检验的二进制位数 (默认为64)。
mysql> SELECT EXPORT_SET(5,'Y','N',',',4);
mysql> SELECT EXPORT_SET(6,'1','0',',',10);
返回值为str1, str2,str3,……列表中的str所在位置。在找不到str的情况下,返回值为0。如果所有FIELD()的参数均为字符串,则所有参数均按照字符串进行比较。如果所有的参数均为数字,则按照数字进行比较。否则,参数按照双精度类型进行比较。如果str为NULL值,则返回值为0,原因是NULL不能同任何值进行同等比较。
mysql> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
mysql> SELECT FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
假如字符串str在由N子字符串组成的字符串列表strlist中,则返回值的范围在1到N之间。一个字符串列表就是一个由一些被‘,’符号分开的子字符串组成的字符串。如果第一个参数是一个常数字符串,而第二个是SET类型的数据,则FIND_IN_SET()函数将被使用比特计算优化。如果str不在strlist或strlist为空字符串,则返回值为0。如果任意一个参数为NULL,则返回值为NULL。 该函数在第一个参数就包含逗号(‘,’)时将无法正常运行。
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
将数字X的格式设置为'#,###,###.##',以四舍五入的方式保留到小数点后D位, 返回结果为一个字符串。
如果N_OR_S是一个数字,则返回一个十六进制值N的字符串表示,其中,N是一个longlong(也就是BIGINT)类型的数。如果N_OR_S是一个字符串,则返回值为一个N_OR_S的十六进制字符串表示,其中字符串N_OR_S 里的每个字符都被转化为两个十六进制数字。
mysql> SELECT HEX(255);
mysql> SELECT 0x616263;
mysql> SELECT HEX('abc');
INSERT(str,pos,len,newstr)
返回字符串str中起始于pos位置被字符串newstr替换长度为len 后的字符串。如果pos不在字符串长度范围内,则返回值为原始字符串。 假如len的长度大于剩下的字符串的长度,则从位置pos开始替换。若任何一个参数为null,则返回值为NULL。
mysql> SELECT INSERT('Quadratic', 3, 4, 'What');
mysql> SELECT INSERT('Quadratic', -1, 4, 'What');
mysql> SELECT INSERT('Quadratic', 3, 100, 'What');
返回字符串str中子字符串substr第一次出现的位置。
mysql> SELECT INSTR('foobarbar', 'bar');
mysql> SELECT INSTR('xbar', 'foobar');
返回从字符串str左边数前len个字符。
mysql> SELECT LEFT('foobarbar', 5);
返回值为字符串str的长度,单位为字节。对于一个包含5个2字节字符的字符串,LENGTH()的返回值为10,而CHAR_LENGTH()的返回值则为5。
mysql> SELECT LENGTH('text');
读取文件并将这一文件按照字符串的格式返回。文件的位置必须在服务器上,你必须为文件制定路径全名,而且你还必须拥有FILE权限。文件必须可读,文件容量必须小于max_allowed_packet字节。若文件不存在,或因不满足上述条件而不能被读取,函数返回值为 NULL。
mysql> UPDATE tbl_name
-> SET blob_column=LOAD_FILE('/tmp/picture')
-> WHERE id=1;
LOCATE(substr,str,pos)在没有参数pos时,返回为字符串str中子字符串substr的第一次出现的位置。反之,返回字符串str中以起始位置为pos开始的子字符串substr的第一次出现的位置。如若substr不在str中,则返回值为0。
mysql> SELECT LOCATE('bar', 'foobarbar');
mysql> SELECT LOCATE('xbar', 'foobar');
mysql> SELECT LOCATE('bar', 'foobarbar',5);
返回字符串str根据最新的字符集(默认为cp1252 Latin1)映射表转换为小写字母的字符 。
mysql> SELECT LOWER('QUADRATICALLY');
返回字符串str的左边由字符串padstr填补到len字符长度后的字符串。假如str的长度大于len, 则返回值从右边开始被缩短至len字符。
mysql> SELECT LPAD('hi',4,'??');
mysql> SELECT LPAD('hi',1,'??');
LTRIM(str)
返回删除左侧空格后的字符串str。
mysql> SELECT LTRIM(' barbar');
MAKE_SET(bits,str1,str2,...)
返回一个(一个包含被‘,’号分开的字符串)由在bits集合中具有相应的比特的字符串组成的设定值。str1对应比特0,str2对应比特1,以此类推。str1, str2,...中的NULL值不会被添加到返回结果中。
mysql> SELECT MAKE_SET(1,'a','b','c');
mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');
mysql> SELECT MAKE_SET(1 | 4,'hello','nice',NULL,'world');
mysql> SELECT MAKE_SET(0,'a','b','c');
返回N的八进制值的字符串表示,其中N是一个longlong(BIGINT)数。若N为NULL,则返回值为NULL。
mysql> SELECT OCT(12);
OCTET_LENGTH(str) OCTET_LENGTH()等价于LENGTH()。
若字符串str的最左边的字符是一个多字节字符,则返回该字符的代码,代码的计算通过使用以下公式计算其组成字节的数值而得出:
(1st byte code)+(2nd byte code × 256)+(3rd byte code × 256 × 256) ...
如果最左边的字符不是一个多字节字符,那么ORD()和函数ASCII()返回相同的值。
mysql> SELECT ORD('2');
QUOTE(str)通过引用字符串str,产生一个在SQL语句中可用作完全转义数据值的结果。返回的字符串由单引号标注,每例都带有单引号(')、反斜线符号(\)、ASCII NUL以及前面有反斜线符号的Control-Z。如果自变量的值为NULL,则返回不带单引号的单词NULL。
mysql> SELECT QUOTE('Don\'t!');
mysql> SELECT QUOTE(NULL);
返回一个由重复的字符串str组成的字符串,字符串str重复的数目为count。若count <= 0,则返回一个空字符串。若str或count为NULL,则返回NULL。
mysql> SELECT REPEAT('MySQL', 3);
返回所有被字符串to_str替代成字符串from_str后的str。
mysql> SELECT REPLACE('www.shiyanlou.com', 'w', 'Ww');
返回和字符正常顺序相反的str。
mysql> SELECT REVERSE('abc');
返回str中从最右开始数len个字符。
mysql> SELECT RIGHT('foobarbar', 4);
str返回一个soundex字符串。 两个具有几乎同样发音的字符串应该具有同样的soundex字符串。一个标准的soundex字符串的长度为4个字符,然而SOUNDEX()函数会返回一个任意长度的字符串。可使用SUBSTRING()来得到一个标准soundex 字符串结果。在str中,会忽略所有未按照字母顺序排列的字符。所有不在A-Z范围之内的国际字母符号被视为元音字母。
mysql> SELECT SOUNDEX('Hello');
mysql> SELECT SOUNDEX('Quadratically');
注意:这个函数执行原始的Soundex算法,而非更加流行的加强版本算法。其区别在于原始版本首先会删去元音,其次是去除重复字符,而加强版则首先删去重复字符,而后删去元音字符。
不带有len参数的情况,返回一个起始于位置pos的子字符串;带有len参数的情况,返回一个起始于位置 pos长度同len相同的子字符串;使用 FROM的格式为标准SQL语法;也可能对pos使用一个负值,假若这样,则子字符串的位置起始于字符串结尾的第pos个字符,而不是字符串的开头位置。请输入以下语句检验该函数的结果:
mysql> SELECT SUBSTRING('Quadratically',5);
mysql> SELECT SUBSTRING('foobarbar' FROM 4);
mysql> SELECT SUBSTRING('Quadratically',5,6);
mysql> SELECT SUBSTRING('Sakila', -3);
mysql> SELECT SUBSTRING('Sakila', -5, 3);
mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
注意:如果len使用的是一个小于1的值,则结果始终为空字符串。
若count为正值,则返回str中第count个定界符delim(从左边开始)左边的一切内容。若count为负值,则返回定界符(从右边开始)右边的一切内容。
mysql> SELECT SUBSTRING_INDEX('www.shiyanlou.com', '.', 2);
mysql> SELECT SUBSTRING_INDEX('www.shiyanlou.com', '.', -2);
返回字符串str,其中所有remstr前缀或后缀都已被删除。若分类符BOTH、LEADING或TRAILING中没有一个被指定,则假设为BOTH。remstr为可选项,在未指定情况下,删除空格。
mysql> SELECT TRIM(' bar ');
mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
6、①查看表详细结构语句show create table
可以查看表的字段、字段的数据类型、完整性约束条件
show create table tbl_name tbl_name \G; //大写显示美观一些
②更改表的存储引擎
alter table tbl_name engine=存储引擎名
③删除表的外键约束
alter table tbl_name drop foreign key 外键别名;
7、索引
①索引分类
普通索引、唯一索引、全文索引、单列索引、多列索引、空间索引
②创建普通索引
create table index1(id int, name varchar(20),sex boolean, INDEX(id));
或 alter table tbl_name add index idx_name(col);
查看是否被引用:Explain select *from index1 where id=1 \G;
③创建唯一索引
create table index2(id int unique, name varchar(20), unique index index2_is(id asc));
④创建全文索引
create table index3(id int, info varchar(20), FULLTEXT INDEX index_info(info)) ENGINE=MyISAM;
⑤创建单列索引
create table index4(id int, subject varchar(20), INDEEX index4_st(subject(10)));
⑥创建多列索引
create table index5(id int, name varchar(20), sex char(4), INDEX index5_ns(name,sex));
⑦创建控件索引
create table index6(id int, space GEOMETRY not null,SPATIAL INDEX index6_sp(space)) ENGINE=MyISAM;
8、触发器
触发器室友时间来出发某个操作,这些事件包括insert,update,delete语句。
当数据库系统执行这些事件时就会激活触发器执行相应的操作。
8.1 创建触发器
①创建只有一个执行语句触发器
create trigger 触发器名 before|after 触发事件 on 表名 for each row 执行语句
eg:create trigger dept_trig1 before insert on department for each row insert into trigger_time values(Now());
②创建有多个执行语句的触发器
create trigger 触发器名 before|after 触发事件
on 表名 for each row
BEGIN
执行语句
END
DELIMITER&&
create trigger dept_trig2 after delete on department for each row
BEGIN
INSERT INTO trigger_time values('21:01:01');
INSERT INTO trigger_time values('22:01:01');
END
&&
mysql>DELIMITER ; //将结束符号变为;
当在department表中执行delete操作后,
delete from department where d_id=1003;
select * from trigger_time;
8.2 查看触发器
①show triggers 语句查看触发器信息
show triggers \G;
②在triggers表中查看触发器信息
select *from information_schema. triggers \G;
8.3 触发器的使用
#创建before insert触发器
create trigger before_insert before insert on department for each row insert into trigger_test values(null,"before_insert");
#创建after insert触发器
create trigger after_insert after insert on department for each row insert into trigger_test values(null,"after_insert");
8.4 删除触发器
drop trigger 触发器名
drop trigger dept_trig1;
9、连接查询
①内连接查询
select num,name,employee.id,age,sex,d_name,function from employee,department where employee.id=department.id
②外连接查询
select 属性名列表 from tbl_name1 left|right join tbl_name2 on tbl_name1.属性名1=tbl_name2.属性名2;
③符合条件连接查询
select num,name,employee.id,age,sex,d_name,function from employee,department
where employee.id=department.id and age >24;
10、子查询
①带in关键字的子查询
select * from employee where d_id in (select d_id from department);
②带比较运算符的子查询
select id,name,score from computer_stu where score>=(select score from scholarship where level=1);
③带exists关键字的子查询
select * from employee where exists(select d_name from department where d_id=1003);
④带ANY关键字的子查询
select * from computer_stu where score>=ANY(select score from scholarship);
⑤带ALL关键字的子查询
select * from computer_stu where score>=ALL(select score from scholarship);
合并查询:
select 语句1 union|union all select 语句2 union|union all select 语句n;
11、使用正则表达式查询
正则表达式是用某种模式匹配一类字符串的一个方式
属性名 REGEXP `匹配方式`
select * ffrom info where name REGEXP `^L`; //以字母L开头的记录
select * ffrom info where name REGEXP `fy$`; //以fy结尾的记录
12、存储过程和函数
①创建存储过程
create procedure sp_name(proc_parmeter[...]) [characteristic ...] routine_body
eg:
mysql>DELIMITER &&
mysql>create procedure num_from_employee(in emp_id int, out count_num int) reads SQL DATA
BEGIN
SELECT COUNT(*) INTO count_num FROM employee WHERE d_id=emp_id;
END &&
mysql>DELIMITER ;
②创建存储函数
create function sp_name(func_parameter[...]) RETURNS type[characteristic ...] routine_body;
mysql>DELIMITER &&
mysql>CREATE FUNCTION name_from_employee(emp_id int) RETURNS varchar(20)
BEGIN
RETURN(SELECT name from employee where num=emp_id);
END &&
mysql>DELIMITER ;
③变量的使用
a.定义变量
DECLARE var_name[...] type[DEFAULT value]
eg:declare my_sql int default 10;
b.为变量赋值
SET var_name=expr [,var_name2=expr2]...
eg:set my_sql=30;
④定义条件和处理程序
a.定义条件
DECLARE condition_name CONDITION FOR condition_value
condition_value:
SQLSTATE[VALUE] sqlstate_value|mysql_error_code
eg:方法一:使用sqlstate_value
declare can_not_find condition for SQLSTATE '42S02';
方法二:使用mysql_error_value
declare can_not_find condition for 1146;
b.定义处理程序
declare handler_type HANDLE FOR condition_value[...] sp_statement
handler_type:
continue1|exit|undo
condition_value:
SQLSTATE sqlstate_value|condition_name|SQLWARNING|NOTFOUND|SQLEXCEPTION|mysql_error_code
⑥调用存储过程和函数
a.调用存储过程
call sp_name(parameter[...]);
如:call num_from_employee(1002,@n);
mysql>select @n; //查询存储过程的输出值
b.调用存储函数
mysql>select name_from_employee(3);
⑦查看存储过程和函数
a.show status语句查看存储过程和函数的状态
show {procedure|function} status {like `pattern`};
eg:show procedure status like `num_from_employee` \G;
b.show create 语句查看存储过程和函数的定义
show create {procedure|function} sp_name;
c.从information_schema,Routines表中查看存储过程和函数信息
select* from information_schema,Routines where routines_name='num_from_employee';
⑧修改存储过程和函数
alter {PROCEDURE|FUNCTION} sp_name [characteristic...];
⑨删除存储过程和函数
drop {PROCEDURE|FUNCTION} sp_name;
=============================================================================
limit用法:从0开始
select * from table limit m,n; \\取出第m+1条开始的n条数据记录
对varchar类型排序
select * from gb_country_isdcode order by(isdcode+0) asc; \\isdcode+0转换成整数
假如是汉字:
select * from tbl_name order by convert(column_name using gbk); \\按照拼音排序
批量删除大量数据
delete from syslog where status=1 order by=1 order by status id limit 10000; \\每10000条进行一次删除
==================================================================================
事务四大特性(ACID):
原子性(A):事务是最小的单位,不可再分
一致性(C):事务要求所有的DML语句操作的时候,必须保证同时成功或同时失败
隔离性(I):事务A与事务B具有隔离性
持久性(D):是事务的保证,事务的终结的标志