MySQL数据库学习2

一、基本操作

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、字符串函数

  • ASCII(str)

返回值为字符串str的最左字符的数值。假如str为空字符串,则返回值为 0。假如str为NULL,则返回值为NULL。ASCII()用于从0到255的 数值的字符。

mysql> SELECT ASCII('2');

mysql> SELECT ASCII(2);

mysql> SELECT ASCII('dx');

  • BIN(N)

返回值为N的二进制值的字符串表示,其中N为一个longlong (BIGINT)型数字。等同于CONV(N,10,2)。假如N为NULL,则返回值为NULL。

mysql> SELECT BIN(12);

  • BIT_LENGTH(str)

返回值为二进制的字符串str 长度。

mysql> SELECT BIT_LENGTH('text');

  • CHAR(N,... [USING charset])

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。

  • CHAR_LENGTH(str)

返回值为字符串str的长度,长度单位为字符,一个多字节字符算作一个单字符。对于一个包含五个二字节字符集,LENGTH()返回值为10,而CHAR_LENGTH()的返回值为5。

CHARACTER_LENGTH(str)

CHARACTER_LENGTH()等价于CHAR_LENGTH()。

  • CONCAT(str1,str2,...)

返回结果为连接参数产生的字符串。如有任何一个参数为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(separator,str1,str2,...)

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)。

  • ELT(N,str1,str2,str3,...)

若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');

  • EXPORT_SET(bits,on,off[,separator[,number_of_bits]])

返回值为字符串。bits中的比特值按照从右到左的顺序接受检验 (低位比特到高位比特的顺序)。字符串被分隔字符串分开(默认为逗号','),按照从左到右的顺序被添加到结果中。其中number_of_bits会给出被检验的二进制位数 (默认为64)。

mysql> SELECT EXPORT_SET(5,'Y','N',',',4);

mysql> SELECT EXPORT_SET(6,'1','0',',',10);

  • FIELD(str,str1,str2,str3,...)

返回值为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');

  • FIND_IN_SET(str,strlist)

假如字符串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');

  • FORMAT(X,D)

将数字X的格式设置为'#,###,###.##',以四舍五入的方式保留到小数点后D位, 返回结果为一个字符串。

  • HEX(N_or_S)

如果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');

  • INSTR(str,substr)

返回字符串str中子字符串substr第一次出现的位置。

mysql> SELECT INSTR('foobarbar', 'bar');

mysql> SELECT INSTR('xbar', 'foobar');

  • LEFT(str,len)

返回从字符串str左边数前len个字符。

mysql> SELECT LEFT('foobarbar', 5);

  • LENGTH(str)

返回值为字符串str的长度,单位为字节。对于一个包含5个2字节字符的字符串,LENGTH()的返回值为10,而CHAR_LENGTH()的返回值则为5。

mysql> SELECT LENGTH('text');

  • LOAD_FILE(file_name)

读取文件并将这一文件按照字符串的格式返回。文件的位置必须在服务器上,你必须为文件制定路径全名,而且你还必须拥有FILE权限。文件必须可读,文件容量必须小于max_allowed_packet字节。若文件不存在,或因不满足上述条件而不能被读取,函数返回值为 NULL。

mysql> UPDATE tbl_name
   -> SET blob_column=LOAD_FILE('/tmp/picture')
   -> WHERE id=1;

  • LOCATE(substr,str)

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);

  • LOWER(str)

返回字符串str根据最新的字符集(默认为cp1252 Latin1)映射表转换为小写字母的字符 。

mysql> SELECT LOWER('QUADRATICALLY');

  • LPAD(str,len,padstr)

返回字符串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');

  • OCT(N)

返回N的八进制值的字符串表示,其中N是一个longlong(BIGINT)数。若N为NULL,则返回值为NULL。

mysql> SELECT OCT(12);
OCTET_LENGTH(str) OCTET_LENGTH()等价于LENGTH()。

  • ORD(str)

若字符串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);

  • REPEAT(str,count)

返回一个由重复的字符串str组成的字符串,字符串str重复的数目为count。若count <= 0,则返回一个空字符串。若str或count为NULL,则返回NULL。

mysql> SELECT REPEAT('MySQL', 3);

  • REPLACE(str,from_str,to_str)

返回所有被字符串to_str替代成字符串from_str后的str。

mysql> SELECT REPLACE('www.shiyanlou.com', 'w', 'Ww');

  • REVERSE(str)

返回和字符正常顺序相反的str。

mysql> SELECT REVERSE('abc');

  • RIGHT(str,len)

返回str中从最右开始数len个字符。

mysql> SELECT RIGHT('foobarbar', 4);

  • SOUNDEX(str)

str返回一个soundex字符串。 两个具有几乎同样发音的字符串应该具有同样的soundex字符串。一个标准的soundex字符串的长度为4个字符,然而SOUNDEX()函数会返回一个任意长度的字符串。可使用SUBSTRING()来得到一个标准soundex 字符串结果。在str中,会忽略所有未按照字母顺序排列的字符。所有不在A-Z范围之内的国际字母符号被视为元音字母。

mysql> SELECT SOUNDEX('Hello');

mysql> SELECT SOUNDEX('Quadratically');
注意:这个函数执行原始的Soundex算法,而非更加流行的加强版本算法。其区别在于原始版本首先会删去元音,其次是去除重复字符,而加强版则首先删去重复字符,而后删去元音字符。

  • SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)

不带有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的值,则结果始终为空字符串。

  • SUBSTRING_INDEX(str,delim,count)

若count为正值,则返回str中第count个定界符delim(从左边开始)左边的一切内容。若count为负值,则返回定界符(从右边开始)右边的一切内容。

mysql> SELECT SUBSTRING_INDEX('www.shiyanlou.com', '.', 2);

mysql> SELECT SUBSTRING_INDEX('www.shiyanlou.com', '.', -2);

  • TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)

返回字符串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):是事务的保证,事务的终结的标志

 

你可能感兴趣的:(MySQL)