Mysql简单入门教程

Mysql简单入门教程

4 (28人评价)
  • 课时:(22)

  • 学员:(1390)

  • 浏览:(67243)

  • 加入课程
  • 第1课 数据库概述的笔记

    1 数据是如何储存2什么规则 最低要求第一范式 3什么时候使用

  • 第7课 索引的笔记

    一、创建表的时候创建索引1、普通索引CREATE TABLE 表名 (属性名 数据类型【完整性约束条件】,。。。。INDEX( 要创建索引的属性名));2、唯一性索引CREATE TABLE 表名 (属性名 数据类型【完整性约束条件】,。。。。UNIQUE INDEX 索引名( 要创建索引的属性名  排序方式));3、全文索引CREATE TABLE 表名 (属性名 数据类型【完整性约束条件】,。。。。FULLTEXT INDEX 索引名( 要创建索引的属性名))ENGINE=MyISAM;4、单列索引CREATE TABLE 表名 (属性名 数据类型【完整性约束条件】,。。。。INDEX 索引名(要创建索引的属性名(索引的长度)));5、多列索引CREATE TABLE 表名 (属性名 数据类型【完整性约束条件】,。。。。INDEX 索引名(要创建索引的属性名1,要创建索引的属性名2,...));6、空间索引CREATE TABLE 表名 (属性名 数据类型【完整性约束条件】,。。。。SPATIAL INDEX 索引名( 要创建索引的属性名))ENGINE=MyISAM;二、在已存在的表上创建索引CREATE [UNIQUE|FULLTEXT|SPATIAL]INDEX 索引名 ON 表名 (属性名{(长度)}【ASC|DESC】);三、用ALTER TABLE 语句来创建索引ALTER TABLE 表名 ADD [UNIQUE|FULLTEXT|SPATIAL]INDEX 索引名 (属性名{(长度)}【ASC|DESC】);

  • 第6课 创建、修改和删除表的笔记

    一、表的创建1、创建表CREATE TABLE 表名 (字段 数据类型,...., );2、查看表SHOW TABLES 表名;3、主键单字段主键 PRIMARY KEY多字段主键 PRIMARY KEY(字段名。。。)4、外键CONSTRAINT 外键别名 FOREIGN KEY(属性1.1,属性1.2,.......属性1.n)REFERENCES 表名(属性2.1,属性2.2,......属性2.n)5、非空约束NOT NULL6、唯一性约束字段 数据类型  UNIQUE7、自动增长字段名 数据类型  AUTO_INCREMENT8、默认值字段名 数据类型 DEFAULT 默认值9、查看表的结构DISCRIBE 表名;(查看表结构)SHOW CREATE TABLE 表名 /G(查看表的详细结构) 二、表的修改1、表名的修改ALTER TABLE 旧表名 RENAME[TO] 新表名2、数据类型的修改ALTER TABLE 表名 MODIFY 属性名 数据类型;3、字段名的修改ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型;4、字段的增加ALTER TABLE 表名 ADD  新属性名 新数据类型 条件;5、字段的删除ALTER TABLE 表名 DROP  属性名6、字段的排列顺序ALTER TABLE 表名 MODIFY 属性名1 数据类型 FIRST|AFTER 属性名2;7、表存储引擎的修改ALTER TABLE 表名 ENGINE=存储引擎名;三、表的删除1、表的删除DROP TABLE 表名;2、外键的删除ALTER TABLE 表名 DROP FOREIGN KEY 外键别名; 

  • 第6课 创建、修改和删除表的笔记

    一、表的创建1、创建表CREATE TABLE 表名 (字段 数据类型,...., );2、查看表SHOW TABLES 表名;3、主键单字段主键 PRIMARY KEY多字段主键 PRIMARY K...[展开全文] 小学员_sz主键 primary key 外键 foreign key 非空 not null 唯一 unique 自增长 auto_increment 默认值 default 修改表名称 alter table table_name remane table_newname;  修改表中指定的字段 alter table user modify name varchar(30);

  • 第9课 触发器的笔记

    一、触发器的创建1、单条执行语句CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROE 执行语句2、多条执行语句CREATE TRIGGER 触发器 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROE 执行语句BEGIN执行语句一;执行语句二;END结束符号的转换DELIMITE 结束符号二、触发器的查看1、SHOW TRIGGERS;2、SELECT*FROM information_scheme.trtggers;三、触发器的删除DROP TRIGGER 触发器名;

  • 第4课 Mysql数据类型的笔记

    mysql中哪些类型能存储路径?答:char,varchar、text等字符串类型可以存储路径,遇到"/"是用“\”或者"//"将"/"过滤掉 mysql中如何使用bool类型?在mysql中将bool类型转换成tinyint类型来存储,长度为1 mysql中如何存储mp3和jpg?BLOB类型

  • 第13课 Mysql函数的笔记

    MySQL函数是提供的内部函数,这些内部函数可以帮助用户更加方便的处理表中的数据。SELECT语句及其条件表达式都可以使用这些函数。同时,INSERT,UPDATE,DELECT语句及条件表达式也可以使用这些函数。例如,表中某个数据时复数。现在需要将这个数据显示为正数。这就可以使用绝对值函数。从上面可以知道,MySQL函数可以对表中数据进行相应的处理,以便得到用户希望得到的数据。一、数学函数主要用于处理数字,包括绝对值函数、正弦函数,余弦函数、获取随机数的函数等。1、绝对值函数ABS(X)和返回圆周率的函数PI()二、字符串函数主要用于处理字符串,其中包括字符串连接函数、字符串比较函数、将字符串的字母都变成小写或大写字母的函数、获取子串的函数等三、日期和时间函数主要用于处理日期和时间,其中包括获取当前时间的函数、获取当前日期的函数、返回年份的函数、返回日期的函数等四、条件判断函数主要用于在sql语句中控制条件选择,其中包括IF语句、CASE语句、WHEN语句等五、系统信息函数主要用于获取MySQL数据库的系统信息,其中包括获取数据库名的函数、获取当前用户的函数、获取数据库版本的函数等六、加密函数主要用于对字符串进行加密解密。其中包括字符串加密函数、字符串揭秘函数七、格式化函数

  • 第12课 Mysql运算符的笔记

    mysql运算符用来连接表达式中各个操作的符号,其作用是用来指明对操作数所进行的运算。mysql数据库支持使用运算符。通过运算符,可以使数据的功能更强大。而且,可以更加灵活的使用表中的数据。mysql运算符包括四类:一、算数运算符包括加、减、乘、除、求余这几种算数运算符,这类运算符主要是在数值上,其中,求余运算符也称为模运算。加法运算 +  x1+x2+...+xn 减法运算 -  x1-x2-....-xn 乘法运算 *  x1*x2*...*xn 除法运算,返回x1除以x2的商  /  x1/x2除法运算,返回商  DIV x1 DIV X2求余运算,返回x1除以x2的余数  x1%x2求余运算,返回余数  MOD(x1,x2)e.g 下面将t1表中字段a的值进行加法、减法、和乘法运算。SELECT a,a+5+2,a-5-2,a*5*2 FROM t1;下面将t1表中字段a的值进行除法和求余运算。SELECT a,a/3,a DIV 3,a%3,MOD(a,3) FROM t1;下面将除法和求余运算的操作数x2设置为0SELECT  5/0,5 DIV 0,5%0,MOD(5,0);二、比较运算符包括大于、小于、等于、不等于、为空等比较运算,主要用于数值的比较,字符串的匹配等方面,尤其值得注意的是,之前介绍过LIKE、IN、BETWEEN AND、IS NULL等都是比较运算符,还有用于使用正则表达式的REGEXP也是比较运算符。=、<> !=、<=>、>、>=、<、<=、IS NULL、BETWEEN AND、IN 判断某个数是否落在某个集合中、LIKE 是否匹配字符串、REGEXP是否与正则表达式匹配1、运算符=可以用来判断数字、字符串、表达式等是否相等。如果相等,结果返回1,不相等,结果返回0.空值(NULL)不能使用=来判断。<=>可以判断空值。SELECT a,a=24,a=20 FROM t1;SELECT 'b'='b','b'='c',NULL=NULL;SELECT 'b'<=>'b','b'<=>'c',NULL<=>NULL;2、运算符>可以用来判断左边的操作数是否大于右边的。如果大于,结果返回1,不不大于,结果返回0.空值(NULL)不能使用>来判断。SELECT a,a>24,a>20 FROM t1;SELECT 'b'>'c','bc'>'bb',NULL>NULL;SELECT 'b'<=>'b','b'<=>'c',NULL<=>NULL;3、运算符REGEXP用来匹配字符串,但其是使用正则表达式进行匹配。表达式“x1 REGEXP 正则表达式中",如果x1满足正则表达式,结果将返回1,如果不满足,结果将返回0SELECT s,s REGEXP '^b',s REGEXP 'g$',s REGEXP 'y' FROM t2;三、逻辑运算符包括与&&/AND、或||/OR、非!/NOT、异或XOR等逻辑运算,这种运算的结果只返回真值(1或者TRUE)和假值(0或者FALSE)如果操作数中不包含非0的数字,但包含NULL时,结果返回NULL,如果操作数中只有0时,结果返回0。四、位运算符包括按位与&、按位或|、按位取反~、按位异或^、按位左移<<和按位右移>>等位运算。这些运算都必须先数值变为二进制,然后再二进制数上进行操作的。e.g &表示按位与,进行该运算时,数据库系统会先将十进制的数转换为二进制的数然后对应操作数的每个二进制位上进行与运算。1和1相与得1,与0相与得0.运算完成后再将二进制数转变成十进制数。SELECT 5&6,5&6&7;按位左移与按位右移“<<”表示按位左移。“m<<n”表示m的二进制数向左移n位。右边补上n个0.例如,二进制数001左移1位后将变成0010.“>>”表示按位右移。”m>>n“表示m的二进制数向右移n位,左边补上n个0,二进制数011右移一位后变成001,最后一个1被移出去了,直接不要了。五、运算符的优先级从左到右开始运算,哪个运算符的优先级高,哪个先算。优先级               运算符1                      !2                      ~3                       乘除4                       加减5                     >>,<<6                         &7                         |8                      比较大小9                   BETWEEN AND,CASE,WHEN,THEN,ELSE 10                     NOT11                  &&,AND12                 ||,OR.XOR13                     =

  • 第11课 插入、更新和删除数据的笔记

    插入、更新与删除数据一、插入数据向表中插入新的记录。通过这种方式可以为表中增加新的数据。MySQL中,通过INSERT语句来插入新的数据。使用INSERT语句可以同时为表的所有字段插入新的数据,也可以为表的制定字段插入数据。INSERT语句可以同时插人多条记录,还可以将一个表中查询出来的数据插入到另一个表中。1、为表的所有字段插入数据插入的新记录要包含表的所有字段。INSERT语句有两种方式可以同时为表的所有字段插入数据。第一种方式是不指定具体的字段名。第二种方式是列出表的所有字段。a、INSERT语句中不指定具体的字段名INSERT INTO 表名 VALUES(值1,值2,.....,值n);e.g 下面向product表中插入记录。INSERT INTO product VALUES(1001,'ABC 药物','治疗感冒','ABC 制药厂','北京市昌平区');b、INSERT语句中列出所有字段INSERT INTO 表名(属性1,属性2,......,属性n)  VALUES(值1,值2,.....,值n);e.g 下面向product表中插入记录。INSERT INTO product(id,name,function,company,address) VALUES(1002,'BCD 药物','治疗头痛','BCD 制药厂','北京市海淀区');e.g 下面向product表中插入一条新记录。INSERT语句中字段的顺序与表定义时的顺序不同。INSERT INTO product(id,function,name,address,company) VALUES(1003,'治疗癌症','AB 康复丸','北京市顺义区','AB 康复制药厂');2、为表的指定字段插入数据如果上一节中讲解的INSERT语句只是指定部分字段,这就可以为表中的部分字段插入数据了。INSERT INTO 表名(属性1,属性2,属性3,......,属性m) VALUES(值1,值2,....,值m);e.g 下面向product表中id、name和company这三个字段插入数据。INSERT INTO product(id,name,company) VALUES(1004,'EF 咳嗽灵','EF 北京制药厂');e.g 下面向product表的id,name和company字段插入数据,这三个字段的顺序可以任意排列。INSERT INTO product(id,company,name) VALUES(1004,'北京制药厂','OK 护嗓药');3、同时插入多条记录用户可以使用上面两个小节中的方法逐条插入记录。但是,每次都要写一个新的INSERT语句,这样比较麻烦。MySQL中,一个INSERT语句可以同时插入多条记录。INSERT INTO 表名[(属性列表)] VALUES(取值列表1),(取值列表2),...,(取值列表n);e.g 下面向product表中插入三条新记录。INSERT INTO product VALUES('1006','头痛灵1','治疗头痛','DD制药厂','北京市房山区'),('1007','头痛灵2','治疗头痛','DD制药厂','北京市房山区'),('1007','头痛灵3','治疗头痛','DD制药厂','北京市房山区');e.g 下面向product表的id,name和company这三个字段插入数据,总共插入三条记录。INSERT INTO product(id,name,company) VALUES('1009','护发1号','北京护发素厂'),('1010','护发2号','北京护发素厂'),('1011','护发3号','北京护发素厂');4、将查询结果插入到列表中INSERT语句可以将一个表中查询出来的数据插入到另一表中。这样,可以方便不同表之间进行数据交换。INSERT INTO 表名1(属性列表1) SELECT 属性列表2 FROM 表名2 WHERE 条件表达式;e.g 下面将medicine表中所有数据查询出来,然后插入到product表中。INSERT INTO product(id,function,name,address,company) SELECT id,function,name,address,company FROM medicine; 二、更新数据是更新表中已经存在的记录。可以改变表中已经存在的数据。例如,学生表中某个学生的家庭住址改变了,这就需要在学生表中该修改同学的佳通地址。MySQL中,通过UPDATE语句来更新数据。UPDATE 表名 SET 属性名1=取值1,属性名2=取值2,....,属性名n=取值n WHERE 条件表达式;e.g 下面更新product表中id值为1001的记录,将name字段的值变成“AAA 感冒药”,将address字段的值变为“北京市朝阳区”。UPDATE product SET name='AAA 感冒药',address='北京市朝阳区' WHERE id=1001;e.g 下面更新product表中id未1009到1011的记录,将function字段的值变成“护理头发”,将address字段的值变为“北京市昌平区”,先用SELECT语句查询id值从1009到1011的记录。UPDATE product SET function='护理头发',address='北京市昌平区' WHERE id>=1009 AND id<=1011;三、删除数据删除表中已经存在的记录。可以删除表中不再使用的记录。例如,学生表中某个学生退学了,就需要从学生列表中删除该同学的信息。MySQL中,通过DELETE语句来删除数据。DELETE FROM 表名 [WHERE 条件表达式];e.g 下面删除product表中id值为1001记录。DELETE FROM product WHERE id=1001;e.g 下面删除product表中address值为“北京市顺义区”的记录。DELETE FROM product WHERE address='北京市顺义区';e.g 删除product表中所有记录DELETE FROM product; 

  • 第10课 查询数据的笔记

     查询数据一、查询语句的基本语法通过数据可得查询,用户可以从数据库中获取需要的数据。数据库中可能包含着无数的表,表中可能包含着无数的记录。因此,要获取所需的数据并非易事。MySQL中可以使用select语句来查询数据。根据查询的条件的不同。数据库系统图会找到不同的数据。通过select语句可以很方便的获取所需的信息。MySQL中,select的基本语法形式如下:SELECT 属性列表FROM 表名和视图列表[WHERE 条件表达式1][GROUP BY 属性名1 [HAVING 条件表达式2]][ORDER BY 属性名2 [ASC\DESC]]其中,“属性列表”参数表示需要查询的字段名;“表名和视图列表”参数表示从此处指定的表或者视图中查询数据,表和视图可以有多个。“条件表达式1”参数指定查询查询条件;“属性名1”参数指按该字段中的数据进行分组;“条件表达式2”参数表示满足该表达式的数据才能输出;“属性名2”参数指按该字段中的数据进行排序、排序方式由“ASC”和“DESC”两个参数指出。“ASC”参数表示按升序排序,是默认参数。“DESC”参数表示按降序排序。如果有WHERE子句,就按照“条件表达式1”指定的条件进行查询,如果没有WHERE子句,就查询所有记录。如果有GROUP BY子句,就按照“属性名1”指定的字段进行分组,如果GROUP BY子句后带着HAVING关键字,那么只有满足“条件表达式2”中指定的条件的才能够输出,GROUP BY子句通常和COUNT()、SUM()等聚合函数一起使用。如果有ORDER BY 子句,就按照“属性名2”指定的字段进行程序。排序方式由“ASC”和“DESC”两个参数指出,默认的情况下是“ASC”。 二、在单表上查询数据查询数据时,可以从一张表中查询数据,也可以从多张表中同时查询数据。两者的查询方式上有一定的区别。因为单表查询只在一张表上进行操作,所以查询比较简单。1、单表上查询所有的字段a、列表中所有的字段查询employee表中的所有字段e.g SELECT num,d_id,name,age,sex,homeaddr FORM employee;b、使用“*”查询所有字段e.g SELECT*FORM employee;2、查询指定的字段可以在SELECT语句的“属性列表”中列出所需查询的字段。e.g 下面查询employee表中num、name、sex和homeaddr这四个字段的数据。按顺序排列。SELECT num,name,sex,homeaddr FROM employee;3、查询指定记录用户可以根据自己的需要来设置查询条件,按条件进行查询。查询的结果必须满足查询条件。e.g 用户需要查找d_id为1001的记录,那么可以设置“d_id=1001”这个条件,这样查询的结果中的记录就都会满足这个条件。WHERE子句可以用来指定查询条件。WHERE 条件表达式a.g SELECT * FORM employee WHERE d_id=1001;查询条件比较 =,<,<=,>,>=,!=,!<,!>,指定范围 BETWEEN AND,NOT BETWEEN AND指定集合 IN,NOT IN匹配字符 LIKE,NOT LIKE是否为空值 is NULL,is NOT NULL多个查询条件 AND,OR4、带IN关键字的查询IN关键字可以判断某个字段的值是否在指定的集合中。如果字段值在集合中,则满足查询条件,该记录将被查询出来。如果不在集合中,则不满足查询条件。[NOT] IN (元素1,元素2,...... ,元素n)e.g SELECT * FROM employee WHERE d_id IN(1001,1004);SELECT * FROM employee WHERE name NOT IN(‘张三’,‘李四’);5、带BETWEEN AND的范围查询可以判读某个字段的值是否在指定的范围内。如果字段的值在指定的范围内,则满足查询条件,该记录被查询出来,如果不在指定范围内,则不满足查询条件。[NOT] BETWEEN 取值1 AND 取值2e.g SELECT * FROM employee WHERE age BETWEEN 15 AND 25;SELECT * FROM employee WHERE age NOT BETWEEN 15 AND 25;6、带LIKE的字符匹配查询可以匹配字符串是否相等。[NOT] LIKE '字符串'e.g SELECT * FROM employee WHERE name LIKE 'Aric';SELECT * FROM employee WHERE name='Aric';SELECT * FROM employee WHERE homeaddr LIKE '北京%'”%“通配符,表示任意一串字符,模糊查询。不能用”=“。SELECT * FROM employee WHERE name LIKE 'Ar_c';"_"通配符,表示任意一个字符。SELECT * FROM employee WHERE name NOT LIKE '张%'; //查询所有不姓张的7、查询空值可以用来判断字段的值是否是空值。IS [NOT] NULL其中,”NOT“是可选参数,加上NOT表示字段不是空值时满足条件。E.g SELECT * FROM work WHERE info IS NULL;SELECT * FROM work WHERE info IS  NOT NULL;8、带AND的多条件查询可以用来联合多个条件进行查询。使用AND关键字时,只有同时满足所有查询条件的记录会被查询出来,如果不满足这些查询条件的其中一个,这样的记录将被排除掉。条件表达式1 AND 条件表达式2 [..... AND 条件表达式n]其中,AND 可以连接两个条件表达式。而且,可以同时使用多个AND关键字,这样可以连接更多的条件表达式。e.g SELECT * FROM employee WHERE d_id=1001 AND sex LIKE '男';SELECT * FROM employee WHERE d_id<1004 AND age<26 AND sex='男';9、带OR的多条件查询可以用来联合多个条件进行查询,但是与AND关键字不同。使用OR关键字时,只要满足这几个查询条件的其中一个,这样的记录将会被查询出来。如果不满足这些查询条件中的任何一个,这样的记录将被排除掉。条件表达式1 OR 条件表达式2 [... OR 条件表达式n]其中,OR可以用来连接两个条件表达式。而且,可以同时使用多个OR关键字,这样可以连接更多的条件表达式。e.g SELECT * FROM employee WHERE d_id=1001 OR sex LIKE '男';SELECT * FROM employee WHERE num IN(1,2,3) OR age BETWEEN 24 AND 25 OR homeaddr LIKE '%北京市%';SELECT * FROM employee WHERE num IN(1,2,3) AND age=25 OR sex='女';10、查询结果不重复如果表中的某些字段上没有唯一性约束,这些字段可能存在着重复的值。SELECT DISTINCT d_id FROM employee;11、给查询结果排序从表中查询出来的数据可能是无序的,或者其排列顺序不是用户所期望的顺序。为了使查询结果的顺序满足用户的要求,可以使用ORDER BY关键字对记录进行排序。ORDER BY 属性名[ASC/DESC]SELECT * FROM employee ORDER BY age DESC;SELECT * FROM employee ORDER BY d_id ASC,age DESC;多个时,首先使用第一个字段排序,若第一个里面有一样的数值,再用第二个字段排序。12、分组查询GROUP BY关键字可以将查询结果按某个字段或者多个字段进行分组。字段中值相等的为一组。GROUP BY 属性名[HAVING 条件表达式][WITH ROLLUP]a、单独使用GROUP BY 关键字来分组e.g SELECT * FROM employee GROUP BY sex;b、GROUP BY 关键字与GROUP_CONCAT()函数一起使用e.g SELECT sex, COUNT(sex) FROM employee GROUP BY sex;sex字段取值相同的为一组,然后对每一组使用集合函数COUNT()进行计算,求出每一组的记录数。c、GROUP BY 关键字与集合函数一起使用d、GROUP BY关键字与HAVING一起使用e.g SELECT sex, COUNT(sex) FROM employee GROUP BY sex HAVING COUNT(sex)>=3;按employee表的sex字段进行分组查询,然后显示记录数大于等于3的分组。e、按多个字段进行e.g SELECT * FROM employee GROUP BY d_id,sex;按照d_id和sex进行分组。f、GROUP BY 关键字与WITH ROLLUP一起使用SELECT sex, COUNT(sex) FROM employee GROUP BY sex WITH ROLLUP;ROLLUP上面所有记录的总和。13、用LIMIT限制查询结果的数量可以用来指定查询结果从哪条记录开始显示,还可以指定一共显示多少条记录。a、不指定初始位置e.g SELECT * FROM employee LIMIT 2;限制只显示其中两条。不指定初始位置。b、指定初始位置e.g SELECT * FROM employee LIMIT 0,2;只显示前两条,指定初始位置。‘0’指第一条位置。 三、使用聚合函数查询数据集合函数包括COUNT()、SUM()、AVG()、MAX()和MIN()。其中,COUNT()用来查询字段的最大值;AVG()用来计算字段的值的平均值;MAX()用来查询字段的最大值;MIN()用来查询字段的最小值。当需要对表中的记录求和、求平均值、查询最大值、查询最小值等操作时,可以使用集合函数。例如,需要计算学生成绩表中平均成绩,可以使用AVG()函数。GROUP BY关键字通常需要与集合函数一起使用。1、COUNT()函数用来统计记录的条数。如果要统计employee表中有多少条记录,可以使用COUNT()函数。如果要统计employee表中不同部门的人数,也可以使用COUNT()函数。e.g 下面使用COUNT()函数统计employee表中的记录数,SELECT COUNT(*) FROM employee;e.g 下面使用COUNT()函数统计employee表中不同d_id值的记录数。SELECT d_id,COUNT(*) FROM employee GROUP BY d_id; 2、SUM()函数求和函数。可以求出表中某个字段取值的综合。e.g 下面使用SUN()函数统计grade表中学号为1001的同学的总成绩。SELECT num,SUM(score) FROM grade WHERE num=1001;e.g 下面将grade表按照num字段进行分组,然后,使用SUM()函数统计个分组的总成绩。SELECT num,SUM(score) FROM grade GROUP BY num;3、AVG()函数是求平均值的函数。使用AVG()函数可以求出表达中某个字段取值的平均值。e.g 下面使用AVG()函数计算employee表中平均年龄(age)。SELECT AVG(age) FROM employee;e.g 下面使用AVG()函数计算grade表中不同科目的平均成绩。SELECT course,AVG(score) FROM grade GROUP BY course;4、MAX()函数求最大值。e.g 下面使用MAX()函数查询grade表中不同科目的最高成绩。SELECT MAX(age) FROM employee;e.g 下面使用MAX()函数查询grade表中不同科目的最高成绩SELECT num,course,MAX(score) FROM grade GROUP BY coures;e.g 下面使用MAX()函数查询work表中name字段的最大值。SELECT MAX(name) FROM work;比较字符串。5、MIN()函数求最小值。e.g 下面使用MIN()函数查询employee表中的最小年龄。SELECT MIN(age) FROM employee;e.g 下面使用MIN()函数查询grade表中不同科目的最低成绩。SELECT course,MIN(score) FROM grade GROUP BY course; 四、多表上连接查询是将两个或两个以上的表按某个条件连接起来,从中选取需要的数据。连接查询是同时查询两个或者两个以上的表时使用的。当不同的表中存在表示相同意义的字段时,可以通过该字段来连接这几个表。例如,学生表中有段来表示课程号。那么,可以通过学生表中的course_id字段与课程表中的num字段来进行连接查询。连接查询包括内连接查询和外连接查询。1、内连接查询可以查询两个或者两个以上的表。当两个表中存在表示相同意义的字段时,可以通过该字段来连接这两个表。当该字段的值相等时,就查询出该记录。e.g 下面使用内连接查询的方式查询employee表和department表,在执行内连接查询之前,先分别查看employee表和department表中的记录,以便进行比较。SELECT num,name,employee.d_id,age,d_name,function FROM employee,department WHERE employee.d_id=department.d_id;2、外连接查询可以查询两个或者两个以上的表。外连接查询也需要通过制定字段来进行连接。当该字段取值相等时,可以查询出该记录。而且,该字段取值不相等的记录也可以查询出来。外连接查询包括左连接查询和右连接查询。SELECT 属性名列表FROM 表名1 LEFT/RIGHT JOIN 表名2ON 表名1.属性名=表名2.属性名2;a、左连接查询e.g 下面使用左链接查询的方式查询employee表和department,两表通过d_id字段进行连接。SELECT num,name,employee.d_id,age,sex,d_name,function FROM employee LEFT JOIN department ON employee.d_id=department.d_id;b、右连接查询 e.g 下面使用右链接查询的方式查询employee表和department,两表通过d_id字段进行连接。SELECT num,name,employee.d_id,age,sex,d_name,function FROM employee RIGHT JOIN department ON employee.d_id=department.d_id;3、符合条件连接查询在连接查询时,也可以增加其他的限制条件。通过多个条件的符合查询,可以使查询结果更加准确。例如,employee表和department表进行连接查询时,可以限制age字段的取值必须大于24.这样,可以更加准确的查询出年龄大于24岁的员工的信息。e.g 下面使用employee表中的age字段的值必须大于24。SELECT num,name,employee.d_id,age,sex,d_name,function FROM employee,department WHERE employee.d_id=department.d_id AND age>24;e.g 下面使用内连接查询的方式查询employee表和department表。并以age字段的升序方式显示查询结果。SELECT num,name,employee.d_id,age,sex,d_name,function FROM employee,department WHERE employee.d_id=department.d_id GROUP BY age ASC;五、子查询是将一个查询语句嵌套在另一个查询语句中。内层查询语句的查询结果,可以为外层查询语句提供查询条件。因为在特定情况下,一个查询语句的条件需要另一个查询语句来获取。例如,现在需要从学生成绩表中查询计算机系学生的各科成绩。那么,首先就必须知道哪些课程是计算机系学生选修的。因此,必须先查询计算机系学生选修的课程,然后根据这些课程来查询计算机系学生的各科成绩。通过子查询,可以实现多表之前的查询。子查询中可能包括IN、NOT IN、ANY、ALL、EXISTS、NOT EXISTS等关键字。子查询中还可能包含比较运算符,如=、!=、>、<等。1、带IN关键字的子查询一个查询语句的条件可能落在另一个SELECT语句的查询结果中。这可以通过IN关键字来判断。例如,要查询哪些同学选择了计算机系开设的课程。先必须从课程表中查询出计算机系开设了哪些课程。然后再从学生表中进行查询。如果学生选修的课程在前面查询出来的课程中,则查询出该同学的信息。这可以用带IN关键字的子查询来实现。e.g 下面查询employee表中的记录,这些记录的d_id字段必须在department表中出现过。SELECT * FROM employee WHERE d_id IN (SELECT d_id FROM department);e.g 下面查询employee表中的记录,这些记录的d_id字段必须没有在department表中出现过。SELECT * FROM employee WHERE d_id NOT IN (SELECT d_id FROM department);2、带比较运算符的子查询这些比较运算符包括=、!=、>、<、<=、>=、<>等。其中,<>与!=是等价的。在子查询时使用的非常广泛。e.g 下面从employee_stu表中查询获得一等奖学金的学生的学号、姓名和分数,各个等级的奖学金的最低分存储在scholarship表中。SELECT id,name,score FROM computer_stu WHERE score>=(SELECT score FROM scholarship WHERE level=1);e.g 下面在department表中查询那些部门没有年龄为24岁的员工,员工的年龄存储在employee表中。先查询一下employee表和department表,以便进行对比。SELECT d_id,d_name FROM department WHERE d_id!=(SELECT d_id FROM employee WHERE age=24);SELECT d_id,d_name FROM department WHERE d_id<>(SELECT d_id FROM employee WHERE age=24);3、带EXISTS关键字的子查询表示存在。使用此关键字时,内层查询语句不返回查询的记录。而是返回一个真假值。如果内层查询语句查询到满足条件的记录,就返回一个真值(true)。否则,将返回一个假值(false)。当返回的值是真值时,外层查询语句将进行查询。当返回值是假值时,外层查询语句不进行查询或者查询不出任何记录。e.g 下面如果department表中存在d_id取值为1003的记录,则查询employee表的记录。SELECT * FROM employee WHERE EXISTS (SELECT d_name FROM department WHERE d_id=1003);e.g 下面如果department表中存在d_id取值为1003的记录,则查询employee表中age大于24的记录。SELECT * FROM employee WHERE age>24 AND EXISTS (SELECT d_name FROM department WHERE d_id=1003);e.g 下面如果department表中不存在d_id取值为1003的记录,则查询employee表的记录。SELECT * FROM employee WHERE NOT EXISTS (SELECT d_name FROM department WHERE d_id=1003);4、带ANY关键字的子查询表示满足其中任一条件。使用ANY关键字时,只要满足内层查询语句返回的结果中的任何一个,就可以通过该条件来执行外层查询语句。例如,需要查询哪些同学能够获得奖学金。那么,首先必须从奖学金表中查询出各种奖学金要求的最低分。只要一个同学的成绩高于不同奖学金最低返的任何一个,这个同学就可以获得奖学金。通常与比较运算符一起使用。e.g 下面从computer_stu表中查询出哪些同学可以获得奖学金,奖学金的信息存储在scholarship表中。先查看一下computer_stu表和scholarship表。SELECT * FROM computer_stu WHERE score>=ANY (SELECT score FROM scholarship);5、带ALL关键字的子查询满足所有条件。只有满足内层查询语句返回的所有结果,才可以执行外层查询语句。例如,需要查询哪些同学能够获得一等奖学金。首先必须从奖学金表中查询出各种奖学金要求的最低分。因为一等奖学金的分数最高。只有当同学的成绩高于所有奖学金最低分时。这个同学才能获得一等奖学金。e.g 下面从computer_stu表中查询出哪些同学可以获得一等奖学金。奖学金的信息存储在scholarship表中,先需要从scholarship表中查询出各种奖学金的最低分,然后,从computer_stu表中查询哪些人的分数高于所有奖学金的最低分。SELECT * FROM computer_stu WHERE  score>=ALL(SELECT score FROM scholarship); 六、合并查询结果是将多个SELECT语句的查询结果合并到一起。某种情况下,需要将几个SELECT语句查询出来的结果合并起来显示。例如,现在需要查询公司甲和公司乙这两个公司所有员工的信息。这就需要从公司甲中查询出所有员工的信息,再从公司乙中查询出所有员工的信息,然后将这两次的查询结果合并到一起。进行合并操作使用UNION和UNION ALL关键字,使用UNION关键字时,数据库系统会将所有的查询结果合并到一起,然后去除掉相同的记录,而UNION ALL关键字则只是简单的合并到一起。SELECT语句1UNION/UNION ALL SELECT语句2UNION/UNION ALL .....SELECT语句nUNION/UNION ALL e.g 下面从department表和employee表中查询d_id字段的取值。然后通过UNION关键字将结果合并到一起。首先,先看看department表和employee表中d_id字段的取值。SELECT d_id FROM  department UNION SELECT d_id  FROM employee;SELECT d_id FROM  department UNION ALL SELECT d_id  FROM employee; 七、为表和字段取别名 在查询的时候可能为表和字段取一个别名。这个别名可以代替其指定的表和字段。 1、为表区别名 当表的名称特别长时,在查询中直接使用表名很不方便。这时可以为表取一个别名。用这个别名来代替表的名称。例如,电力软件中变压器表的名称为power_system_transform。如果要使用该表下面的字段id,但同时查询的其他表中也有id字段。这样就必须指明是哪个表下的id字段,如power_system_transform.id。因为变压器表的名字太长,使用起来不是很方便。为了解决这个问题,可以将变压器表取一个别名为t,那么t就代表了变压器表。t.id就与power_system_transform.id表示的意思相同了。 表名 表的别名e.g 下面为department表取个别名d,然后查询表中d_id字段取值为1001的记录 SELECT * FROM department d WHERE d.d_id=1001; 2、为字段取别名当查询数据时,MySQL会显示每个输出列的名词,默认情况下,显示的列名是创建表示定义的列名。例如。department表的列名分别是d_id、d_name、function和address。当查询department表时,就会相应显示这几个列表。有时为了显示结果更加直观,需要一个更加直观的名字来表示这一列。如department_name可以很直接知道是部门名称。这时就需要将d_name字段取别名为department_name。 属性名 [AS] 别名 e.g 下面为department表中d_id字段取别名为department_id,d_name字段取别名为department_name。 SELECT d_id AS department_id,d_name AS department_name FROM department; e.g 下面为department表中d_id字段取别名为department_id,d_name字段取别名为department_name。为department表取个别名d。 SELECT d_id AS department_id,d_name AS department_name FROM department d WHERE d.d_id=1001; 八、使用正则表达式查询正则表达式是用某种模式去匹配一类字符串的一个方式。例如,使用正则表达式可以查询出包含A\B\C其中任一字母的字符串。正则表达式的查询能力比通配字符的查询能力更强大,而且更加灵活。正则表达式可以应用于非常复杂查询。MySQL中,使用REGEXP关键字来匹配查询正则表达式。属性名 REGEXP ’匹配方式’正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 3.1 普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。 3.2 非打印字符字符含义\cx匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。\f匹配一个换页符。等价于 \x0c 和 \cL。\n匹配一个换行符。等价于 \x0a 和 \cJ。\r匹配一个回车符。等价于 \x0d 和 \cM。\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。\t匹配一个制表符。等价于 \x09 和 \cI。\v匹配一个垂直制表符。等价于 \x0b 和 \cK。3.3 特殊字符所谓特殊字符,就是一些有特殊含义的字符,如上面说的”*.txt”中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。特别字符说明$匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 \$。( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。*匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。+匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。.匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。[标记一个中括号表达式的开始。要匹配 [,请使用 \[。?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。\将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\\’ 匹配 “\”,而 ‘\(’ 则匹配 “(”。^匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。{标记限定符表达式的开始。要匹配 {,请使用 \{。|指明两项之间的一个选择。要匹配 |,请使用 \|。构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。 3.4 限定符限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。正则表达式的限定符有:字符描述*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。+匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。?匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。{n}n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。{n,}n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 3.5 定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。 3.6 选择用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。 3.7 后向引用对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 ‘\n’ 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。可以使用非捕获元字符 ‘?:’, ‘?=’, or ‘?!’ 来忽略对相关匹配的保存。4. 各种操作符的运算优先级相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:操作符描述\转义符(), (?:), (?=), []圆括号和方括号*, +, ?, {n}, {n,}, {n,m}限定符^, $, \anymetacharacter位置和顺序|“或”操作5. 全部符号解释 字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,’n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ‘\\’ 匹配 “\” 而 “\(” 则匹配 “(”。^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。+匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。?匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。{n}n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。{n,}n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。?当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,’o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。.匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。(pattern)匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘\(’ 或 ‘\)’。(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。(?=pattern)正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,’Windows (?=95|98|NT|2000)’ 能匹配 “Windows 2000″ 中的 “Windows” ,但不能匹配 “Windows 3.1″ 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。(?!pattern)负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如’Windows (?!95|98|NT|2000)’ 能匹配 “Windows 3.1″ 中的 “Windows”,但不能匹配 “Windows 2000″ 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始x|y匹配 x 或 y。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。[xyz]字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。[^xyz]负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p'。[a-z]字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。[^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。\b匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。\B匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。\cx匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。\d匹配一个数字字符。等价于 [0-9]。\D匹配一个非数字字符。等价于 [^0-9]。\f匹配一个换页符。等价于 \x0c 和 \cL。\n匹配一个换行符。等价于 \x0a 和 \cJ。\r匹配一个回车符。等价于 \x0d 和 \cM。\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。\t匹配一个制表符。等价于 \x09 和 \cI。\v匹配一个垂直制表符。等价于 \x0b 和 \cK。\w匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。\W匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。\xn匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,’\x41′ 匹配 “A”。’\x041′ 则等价于 ‘\x04′ & “1″。正则表达式中可以使用 ASCII 编码。.\num匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,’(.)\1′ 匹配两个连续的相同字符。\n标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。\nm标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。\nml如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。\un匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。6. 部分例子正则表达式说明/\b([a-z]+) \1\b/gi一个单词连续出现的位置/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/将一个URL解析为协议、域、端口及相对路径/^(?:Chapter|Section) [1-9][0-9]{0,1}$/定位章节的位置/[-a-z]/A至z共26个字母再加一个-号。/ter\b/可匹配chapter,而不能terminal/\Bapt/可匹配chapter,而不能aptitude/Windows(?=95 |98 |NT )/可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次7. 正则表达式匹配规则 7.1 基本模式匹配一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:^once这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串”once upon a time”匹配,与”There once was a man from NewYork”不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。bucket$这个模式与”Who kept all of this cash in a bucket”匹配,与”buckets”不匹配。字符^和$同时使用时,表示精确匹配(字符串与模式一样)。例如:^bucket$只匹配字符串”bucket”。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式once与字符串There once was a man from NewYork Who kept all of his cash in a bucket.是匹配的。在该模式中的字母(o-n-c-e)是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符(空格、制表符等),要用到转义序列。所有的转义序列都用反斜杠(\)打头。制表符的转义序列是:\t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式:^\t类似的,用\n表示“新行”,\r表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用\\表示,句号.用\.表示,以此类推。 7.2 字符簇在INTERNET的程序中,正规表达式通常用来验证用户的输入。当用户提交一个FORM以后,要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:[AaEeIiOoUu]这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如:[a-z] //匹配所有的小写字母 [A-Z] //匹配所有的大写字母 [a-zA-Z] //匹配所有的字母 [0-9] //匹配所有的数字 [0-9\.\-] //匹配所有的数字,句号和减号 [ \f\r\t\n] //匹配所有的白字符同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如”z2″、”t6″或”g7″,但不是”ab2″、”r2d3″ 或”b52″的话,用这个模式:^[a-z][0-9]$尽管[a-z]代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字:^[^0-9][0-9]$这个模式与”&5″、”g7″及”-2″是匹配的,但与”12″、”66″是不匹配的。下面是几个排除特定字符的例子:[^a-z] //除了小写字母以外的所有字符 [^\\\/\^] //除了(\)(/)(^)之外的所有字符 [^\”\’] //除了双引号(”)和单引号(’)之外的所有字符特殊字符”.” (点,句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式”^.5$”与任何两个字符的、以数字5结尾和以其他非“新行”字符开头的字符串匹配。模式”.”可以匹配任何字符串,除了空串和只包括一个“新行”的字符串。PHP的正规表达式有一些内置的通用字符簇,列表如下:字符簇含义[[:alpha:]] 任何字母 [[:digit:]] 任何数字 [[:alnum:]] 任何字母和数字 [[:space:]] 任何白字符 [[:upper:]] 任何大写字母 [[:lower:]] 任何小写字母 [[:punct:]] 任何标点符号 [[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F] 7.3 确定重复出现到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。字符簇 含义 ^[a-zA-Z_]$ 所有的字母和下划线 ^[[:alpha:]]{3}$ 所有的3个字母的单词 ^a$ 字母a ^a{4}$ aaaa ^a{2,4}$ aa,aaa或aaaa ^a{1,3}$ a,aa或aaa ^a{2,}$ 包含多于两个a的字符串 ^a{2,} 如:aardvark和aaab,但apple不行 a{2,} 如:baad和aaa,但Nantucket不行 \t{2} 两个制表符 .{2} 所有的两个字符这些例子描述了花括号的三种不同的用法。一个数字,{x}的意思是“前面的字符或字符簇只出现x次”;一个数字加逗号,{x,}的意思是“前面的内容出现x或更多的次数”;两个用逗号分隔的数字,{x,y}表示“前面的内容至少出现x次,但不超过y次”。我们可以把模式扩展到更多的单词或数字:^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串 ^[0-9]{1,}$ //所有的正数 ^\-{0,1}[0-9]{1,}$ //所有的整数 ^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的小数最后一个例子不太好理解,是吗?这么看吧:与所有以一个可选的负号(\-{0,1})开头(^)、跟着0个或更多的数字([0-9]{0,})、和一个可选的小数点(\.{0,1})再跟上0个或多个数字([0-9]{0,}),并且没有其他任何东西($)。下面你将知道能够使用的更为简单的方法。特殊字符”?”与{0,1}是相等的,它们都代表着:“0个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以简化为:^\-?[0-9]{0,}\.?[0-9]{0,}$特殊字符”*”与{0,}是相等的,它们都代表着“0个或多个前面的内容”。最后,字符”+”与 {1,}是相等的,表示“1个或多个前面的内容”,所以上面的4个例子可以写成:^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划线的字符串 ^[0-9]+$ //所有的正数 ^\-?[0-9]+$ //所有的整数 ^\-?[0-9]*\.?[0-9]*$ //所有的小数当然这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易阅读。正则表达式非常有用,查找、匹配、处理字符串、替换和转换字符串,输入输出等。而且各种语言都支持,例如.NET正则库,JDK正则包, Perl, JavaScript等各种脚本语言都支持正则表达式。下面整理一些常用的正则表达式。字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。*匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。+匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。?匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。{n}n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。{n,}n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。?当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。.匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。(pattern)匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。(?=pattern)正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。(?!pattern)负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始x|y匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。[xyz]字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。[^xyz]负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。[a-z]字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。[^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。\b匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。\B匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。\cx匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。\d匹配一个数字字符。等价于 [0-9]。\D匹配一个非数字字符。等价于 [^0-9]。\f匹配一个换页符。等价于 \x0c 和 \cL。\n匹配一个换行符。等价于 \x0a 和 \cJ。\r匹配一个回车符。等价于 \x0d 和 \cM。\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。\t匹配一个制表符。等价于 \x09 和 \cI。\v匹配一个垂直制表符。等价于 \x0b 和 \cK。\w匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。\W匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。\xn匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。\num匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。\n标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。\nm标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。\nml如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。/i使正则表达式对大小写不敏感, (?-i)是关闭大小写不敏感 (?i)te(?-i)st应该匹配TEst,但是不能匹配teST或TEST./s开启“单行模式”,即点号“.”匹配新行符/m开启“多行模式”,即“^”和“$”匹配新行符的前面和后面的位置。^[0-9]*$只能输入数字^\d{n}$只能输入n位的数字^\d{n,}$只能输入至少n位的数字^\d{m,n}$只能输入m~n位的数字^(0|[1-9][0-9]*)$只能输入零和非零开头的数字^[0-9]+(.[0-9]{2})?$只能输入有两位小数的正实数^[0-9]+(.[0-9]{1,3})?$只能输入有1~3位小数的正实数^\+?[1-9][0-9]*$只能输入非零的正整数^\-[1-9][]0-9"*$只能输入非零的负整数^.{3}$只能输入长度为3的字符^[A-Za-z]+$只能输入由26个英文字母组成的字符串^[A-Za-z0-9]+$只能输入由数字和26个英文字母组成的字符串^\w+$只能输入由数字、26个英文字母或者下划线组成的字符串^[a-zA-Z]\w{5,17}$验证用户密码:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。[^%&',;=?$\x22]+验证是否含有^%&',;=?$\"等字符^[\u4e00-\u9fa5]{0,}$只能输入汉字^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$验证Email地址^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$验证InternetURL^\d{15}|\d{18}$验证身份证号(15位或18位数字)^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$验证IP地址(\w)\1匹配两个两个重叠出现的字符 例如,"aabbc11asd", 返回结果为aa bb 11三组match<(?<tag>[^\s>]+)[^>]*>.*</\k<tag>>匹配成对的HTML标签(?!)不出现,负声明 下例演示如何取得一个<a>标签对中的全部内容,即使其中包含别的HTML tag。 string newsContent = @"url:<a href=""1.html""><img src=""1.gif"">test<span style=""color:red;""> Regex</span></a>."; Regex regEnd = new Regex(@"<\s*a[^>]*>([^<]|<(?!/a))*<\s*/a\s*>",RegexOptions.Multiline);  1. 匹配组常用的组匹配:(实用)(exp)匹配exp并且捕获到一个自动命名的组(?<name>exp)匹配exp并且捕获到组’name’(?=exp)exp出现在声明右侧,但exp不作为匹配 括号中的模式必须出现在声明右侧,但不作为匹配的一部分 ,例如: 输入: public keywod string "abc"; 正则:\b\w+(?=ing\b),返回“str”, 意思为:匹配以ing结束的单词,但ing不作为返回(?<=exp)exp出现在声明左侧,但exp不作为匹配 括号中的模式必须出现在声明左侧,但不作为匹配的一部分 ,例如: 输入: public remember string "abc"; 正则:(?<=\bre)\w+\b,返回“member”, 意思为:匹配以re开头的单词,但re不作为返回(?!exp)exp不出现在声明右侧,但exp不作为匹配 括号中的模式必须不出现在声明右侧 ,例如: 输入: remember aqa bqu "abc"; 正则:\b\w*q(?!u)\w*\b,返回“aqa”, 意思为:匹配带q后面不是跟随u的单词(?<!exp)exp不出现在声明左侧,但exp不作为匹配  输入:public string keywod = "abc"; string value = "test";目的:匹配 关键字="",例如获得关

  • 第9课 触发器的笔记

    一、触发器TRIGGER是由事件来触发某个操作。这些事件包括INSERT语句、UPDATE语句和DELETE语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样做可以保证某些操作之间的一致性。1、创建只有一个执行语句的触发器CREATE TRIGGER 触发器名 BEFORE/AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句“BEFORE”和“AFTER”参数指定了触发器执行的时间,“BEFORE”指在触发事件之前执行触发语句,“AFTER”表示在触发事件之后执行触发语句。“触发事件”指触发的条件,包括INSERT、UPDATE和DELETE"表名"指触发事件操作的表的名称“FOR EACH ROW”指任何一条记录上的操作满足触发事件都会触发该触发器“执行语句“指触发器被触发后执行的程序2、创建有多个执行语句的触发器CREATE TRIGGER 触发器名 BEFORE/AFTER 触发事件 ON 表名 FOR EACH ROWBEGIN执行列表ENDBEGIN与END的之间的”执行语句列表“表示需要执行的多个执行语句的内容,不同的执行语句之间用分号隔开。注意执行语句的执行顺序。*MySQL中更改结束符  DELEMITER &&二、查看触发器查询数据库中已存在的触发器的定义、状态和语法等信息。SHOW TRIGGERS(显示数据库中所有的触发器)语句和查询information_schema数据库下的trigger表等。1、SHOW TRIGGERS语句查询触发器信息SHOW TRIGGERS \G2、在trigger表中查看触发器信息SELECT*FROM information_schema。trigger (WHERE TRIGGER_NAME='触发器名' ) \G三、删除触发器DORP TRIGGER 触发器名;  

  • 第8课 视图的笔记

    一、视图是一种虚拟的表。视图从数据库中的一个或多个表导出来的表。视图还有从已经存在的视图的基础上来定义。数据库中只存放了视图的定义,并没有存放视图中数据。这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。二、视图是在原有的表或者视图的基础上重新定义的虚拟表,这可以从原有的表上选取对用户有用的信息。那些对用户没有用,或者用户没有权限了解的信息,都可以直接屏蔽掉。这样做即使应用简单化,也保证了系统的安全。视图起着类似筛选的作用。视图的作用归纳如下:使操作简单化  增加数据的安全性 提高表的逻辑独立性三、在单表创建视图的语法形式CREATE [ALGORITHM={UNDEFINED/MERGE/TEMPTABLE}] VIEW 视图名 [(属性清单)] AS SELECT语句 [WITH[CASCADED/LOCAL] CHECK OPTION]; ALGORITHM视图选择的算法UNDEFINED表示MySQL将自动选择所要使用的算法/MERGE表示将使用视图的语句与视图定义合并起来/ TEMPTABLE表示将视图的结果存入临时表,然后使用临时表执行语句。权限范围:WITH/CASCADED是可选参数,表示更新视图是要满足所有相关视图的表和条件,该参数为默认值。/LOCAL表示更新权限时要满足该视图本身的定义的条件即可。e.g下面在department表上创建一个简单的视图,视图的名称为department_view1.代码如下:CREATE VIEW department_view1 AS SELECT*FROM department;(*表示查询所有)代码执行如下:mysql>CREATE VIWE department_view1 ->AS SELECT*FROM department;Query OK,0 rows affected(0.03 sec)四、在多表上创建视图e.g在department表和worker表上创建一个名为worker_view1的视图。代码如下:CREATE ALGORITHM=MERGE VIEWworker_view1(name,department,sex,age,address)AS SELECT name,department.d_name,sex,2009-birthday,addressFROM department,worker WHERE worker.d_id=department.d_id WITH LOCAL CHECK OPTION; 五、查看视图查看视图是指查看数据库中已存在的视图的定义,查看视图必须要有SHOW VIEW的权限,MySQL数据库下的user表中保存着这个信息。查看视图的方法包括DESCRIBE语句、SHOW TABLE STATUS语句、SHOW CREATE VIEW语句和查询information_schema数据库下的views表等。1、DESCRIBE语句查看视图基本信息DESCRIBE 视图名;(DESC 视图名;)2、SHOW TABLE STATUS 语句查看视图基本信息SHOW TABLE STATUS LIKE ‘视图名’;其中,"LIKE"表示后面匹配的是字符串;“视图名”参数只要查看的视图的名称,需要用单引号引起来。3、SHOW CREATE VIEW语句查看视图详细信息SHOW CREATE VIEW 视图名 \c4、在views表中查看视图详细信息所有视图的定义都存在information_schema数据库下的views表中。可以查看所有的视图表。SELECT*FROM information_schema.views;其中,“*”表示查询所有的列的信息;“information_schema.views”表示information_schema数据库下面的views表。六、修改视图1、通过CREATE OR REPLACE VIEW语句修改视图该语句的使用非常灵活。在视图已经存在的情况下,对视图进行修改;视图不存在时,可以创建视图。CREATE OR REPLACE [ALGORITHM={UNDEFINED/MERGE/TEMPTABLE}] VIEW 视图名 [(属性清单)] AS SELECT 语句 [WIYH[CASCADED/LOCAL]] CHECK OPTION];2、ALTER语句修改视图ALTER语句可以修改表的定义,可以创建索引还可以修改视图。ALTER [ALGORITHM={UNDEFINED/MERGE/TEMPTABLE}] VIEW 视图名 [(属性清单)] AS SELECT 语句 [WIYH[CASCADED/LOCAL]] CHECK OPTION];七、更新视图通过视图来插入INSERT、更新UPDATE、删除DELETE表中数据。只能更新权限范围内的数据,超出了范围就不能更新。UPDATE 试图名 SET 语句以下几种情况是不能更新视图的:1、视图中包含SUM()、COUNT()、MAX()、MIN()等函数。2、视图中包含UNION、UNION ALL、DISTINCT、GROUP BY、HAVINO等关键字。3、常量视图。4、视图中的SELECT中包含了子查询。5、由不可更新的视图导致的视图是不可更新的。6、创建视图时,ALGORITHM为TEMPTABLE类型。7、视图对应的表上存在没有默认值的列,而且该列没有包含在视图中。八、删除视图删除数据库中已存在的视图。删除时,只能删除视图的定义,不会删除数据。使用DROP VIEW语句来删除视图。但是,用户必须拥有DROP权限。查询权限:SELECT Drop_priv FROM mysql.user WHERE user='root'DROP VIEW [IF EXISTS] 视图名列表 [RESTRICT/CASCADE]“视图名列表”表示可以是多个视图 

  • 第7课 索引的笔记

    索引由数据库表中一列或多列的值进行排序的一种结构。可以调高查询速率,提高检索数据的速度。 普通索引、唯一性索引UNIQUE、全文索引FULLTEXT、单列索引、多列索引、空间索引SPATIAL索引设计原则: 选择唯一性索引、为经常需要排序分组和联合操作的字段建立索引、为常作为查询条件的字段建立索引、限制索引的数目、尽量使用数据量少的索引、尽量使用前缀来索引、删除不再使用或者很少使用的索引一、创建索引1、创建表的时候创建索引CREATE TABLE 表名(属性名 数据类型[完整性约束条件],属性名 数据类型[完整性约束条件],.....)普通索引:INDEX(属性名)唯一性索引:UNIQUE INDEX索引名(属性名 索引方式) 全文索引:FULLTEXT INDEX 索引名(属性名) 只有MyISAM引擎才能用全文索引 单列索引:INDEX 索引名(属性名(索引长度)) 多列索引:INDEX 索引名(属性名1,属性名2)查询时必须使用第一个字段查询,才能使用该索引。 空间索引:SPATIAL INDEX 索引名(属性名)引擎必须是MyISAM 2、在已经存在的表上创建索引 CREATE [UNIQUE/FULLTEXT/SPATIAL] INDEX 索引名ON 表名(属性名[(长度)][ASC/DESC]); 普通索引:CREATE INDEX 索引名 ON 表名(属性名); 唯一索引:CREATE UNIQUE INDEX 索引名 ON 表名(属性名); 全文索引:CREATE FULLTEXT 索引名 ON 表名(属性名); 单列索引:CREATE INDEX 索引名 ON 表名(属性名(索引长度)); 多列索引:CREATE INDEX 索引名 ON 表名(属性名1,属性名2); 空间索引:CREATE SPATIAL INDEX 索引名 ON 表名(属性名); 3、使用ALTER TABLE语句来创建索引 ALTER TABLE 表名 ADD [UNIQUE/FULLTEXT/SPATIAL] INDEX 索引名(属性名[(长度)][ASC/DESC]); 三、删除索引 DROP INDEX 索引名 ON 表名;

  • 第6课 创建、修改和删除表的笔记

    一、创建表CREATE TABLE 表名(属性名 数据类型[完整性约束条件],属性名 数据类型[完整性约束条件]......属性名 数据类型);e.g CREATE TABLE example0      id INT.完整性约束条件primary key 标识该属性为该表的主键,可以唯一的标识对应的元组foreign key 标识该属性为该标的外键,是与之联系的某表的主键not null 标识该属性不能为空unique 标识该属性的值是唯一的auto_increment 标识该属性的值自动增加,这是MySQL的SQL语句的特色default 为该属性设置默认值1、主键(唯一的,任意两条记录的主键字段的值不能相同,主键的值是非空值。主键可以是单一的字段,也可以是多个字段。)单字段 -> stu_id INT PRIMARY KEY,多字段 -> stu_id INT         -> course_id INT         -> grade FLOAT         -> PRIMARY KEY<stu_id,course_id>         ->>;2、外键(可以为空)CONSTRAINT 外键别名 FOREIGN KEY(属性1.1,属性1.2,.......属性1.n)REFERENCES 表名(属性2.1,属性2.2,......属性2.n)3、非空约束属性名 数据类型 NOT NULL4、表的唯一性的约束唯一性是指所有记录中该字段的值不能重复出现。属性名 属性类型 UNIQUE5、表的属性值自动增加AUTO_INCREMENT是MySQL数据库中一个特殊的约束条件。其主要用于为表中插入的新纪录自动生成唯一的ID。一个表只能有一个字段使用AUTO_INCREMENT约束的字段,且该字段必须为主键的一部分。AUTO_INCREMENT约束的字段可以是任何整数类型(TINYINT,SMALLINT,INT,BIGINT等)。默认的情况下,该字段的值是从1开始增加。属性名 数据类型 AUTO_INCREMENT6、表的属性默认值属性名 数据类型 DEFAULT 默认值7、查看表结构是指查看数据库中已经存在的表的定义。查看表结构的语句也包括DESCRIBE语句和SHOW CREATE TABLE 语句。可以查看标的字段名、字段的数据类型、完整性约束条件等。DESCRIBE 表名  (查看表结构)SHOW CREATE TABLE 表名 \c(查看详细结构)二、修改表1、修改表名ALTER TABLE 旧表名 RENAME [TO] 新表名;2、修改字段的数据类型(整数型、符点属型、字符串型、二进制类型、日期和时间类型)ALTER TABLE 表名 MODIFY 属性名 数据类型;3、修改字段名ALTER TABLE 表名 CHANGE 旧属性名 新属性名 新数据类型;“新数据类型”参数修改后的数据类型,如不修改,则将新数据类型设置成与原来一样。4、添加字段AKTER TABLE 表名 ADD 属性名1 数据类型 [完整性约束条件] [FIRST/AFTER 属性名2]; a、增加无完整性约束条件的字段无后面[][]里的内容,默认位置为表的最后b、增加有完整性约束条件的字段有[完整性约束条件]无后一个[]c、表的第一个位置增加字段[FIRST]d、表的制定位置之后增加字段[AFTER 属性名2]5、删除字段ALTER TABLE 表名 DROP 属性名;6、修改字段的排列位置ALTER TABLE 表名 MODIFY 属性名1 数据类型 FIRST/AFTER 属性名2;“属性名1”参数指需要修改位置的字段的名称;“数据类型”参数指“属性名1”的数据类型;“FIRST”参数指定位置为表的第一个位置;"AFTER 属性名2"参数指定“属性名1”插入在“属性名2”之后。7、更改表的存储引擎MySQL存储引擎是指MySQL数据库中表的存储类型。包括InnoDB、MyISAM、MEMORY等。(MyISAM不支持外键,若要改变引擎需先删除外键。)ALTER TABLE 表名 ENGINE=存储引擎名;8、删除表的外键约束外键是一个特殊的字段,其将某一表与其父表建立关联关系。ALTER TABLE 表名 DROP FOREIGN KEY 外键别名;三、删除表(注意父表的删除)删除没有被关联的普通表和被其他表关联的父表的方法。没有被关联的普通表DROP TABLE 表名;被关联的父表,先删除关联外键,再删除表。 

  • 第4课 Mysql数据类型的笔记

    基本的数据类型及java连接数据库的知识

  • 第6课 创建、修改和删除表的笔记

    主键 primary key外键 foreign key非空 not null唯一 unique自增长 auto_increment默认值 default修改表名称 alter table table_name remane table_newname; 修改表中指定的字段 alter table user modify name varchar(30);create table student(num int(10) not null unique primary key,name varchar(20) not null,sex varchar(4) not null,birthday datetime,address varchar(50)); create table deparment( d_id int(4) not null unique primary key, d_name varchar(20) not null unique, function varchar(50), address varchar(50)); create table worker( id int (4) not null unique primary key auto_increment, num int(10) not null unique, d_id int(4), name varchar(20) not null, sex varchar(4) not null, birthday date, address varchar(50), constraint worker_fk foreign key(d_id) references deparment(d_id) );

  • 第8课 视图的笔记

     select select_priv, Create_view_priv from mysql.user where user='root'; create table department( d_id int not null primary key auto_increment, d_name varchar(20), function varchar(50), address varchar(50), index index_dn(d_name) );create table worker(num int(10) not null primary key,d_id int(4),name varchar(20) not null,sex varchar(4) not null,birthday datetime,homeaddress varchar(50),index index_dn(d_id));select * from information_schema.views\G create or replace algorithm=temptable view department_view1(department,function,location) as select d_name,function,address from department;

你感兴趣的课程

2万+浏览/ 158学员/ 5评分
免费
2万+浏览/ 421学员/ 0评分
免费
1万+浏览/ 390学员/ 4.6评分
免费