从一个MysqL的例子来学习查询语句数据库教程

时间:2023-04-11 07:51:52 其他范文 收藏本文 下载本文

从一个MysqL的例子来学习查询语句数据库教程(锦集9篇)由网友“异火”投稿提供,下面是小编给大家带来从一个MysqL的例子来学习查询语句数据库教程,一起来阅读吧,希望对您有所帮助。

从一个MysqL的例子来学习查询语句数据库教程

篇1:从一个MysqL的例子来学习查询语句数据库教程

mysql|语句

自上学这么多年以来,得出了从一个例子入手来学习是最快最有效,并能培养出很强的实践能力,这是一种很

好的学习方法,不访试试。比如看一本书的时候从各章节的例子入手,找出不了解的以及不懂的还是新知识,

进而有针对性的学习。看看下面的例子:

$ip = getenv(“REMOTE_ADDR”);

//echo “$ip”;

$conn=mysql_connect('ip','root','****');

mysql_select_db('db',$conn);

$sql=“select *from counter where ip=\”$ip\“;”;

$result=mysql_query($sql,$conn);

$num=mysql_num_rows($result);

$count=mysql_query(“select*from counter”,$conn);

$count=mysql_num_rows($count);

//echo “$num”;

//echo “$count”;

if($num==0)

{

$sum=1;

$count++;

$sql=“insert into counter(ip,sum,countdata)values('$ip','1','$count')”;

mysql_query($sql,$conn);

mysql_close($conn);

//echo “$count”;

}

else

{

$my=“select sum from counter where ip='$ip'”;

$bbbbbb=mysql_query($my) or die(mysql_error);

$row=mysql_fetch_Array($bbbbbb);

@$sum=$row[sum];

//echo “$sum”;

$sum++;

$sql=“update counter set sum='$sum' where ip='$ip'”;

mysql_query($sql);

mysql_close($conn);

}

$str_count=strval($count);

$str_count=Chop($str_count);

$count_len=strlen($str_count);

$image_count=“”;

if($count_len<6)

{for($j=0;$j<6-$count_len;$j++)

{$image_count=$image_count.“”;

}

}

for($i=0;$i<$count_len;$i++)

{

$nom=substr($str_count,$i,1);

$image_count = $image_count.“

$image_count = $image_count.$nom;

$image_count = $image_count.”.gif'>“;

}

echo”$image_count

“;

print”这是你的第“.$sum.”次访问“;

?>

从上面的一个小小的计数器例子来看,

已经包括了查询、插入、修改的知识。可以实现功能。记录每一个IP的

访问量及总的访问次数。总量不支刷新

一、查询:

SELECT被用来检索从一个或多个表中精选的行。select_expression指出你想要检索的列。SELECT也可以用

来检索不引用任何表的计算行

1、select*from table1;

2、select field1,field2 from table1;

3、select count(*)from table2;

4、select table1.filed1,table2.filed2 from table1,table2 where table1.field1='valed1';

5、select *from table1 where field1='valed1' and fiels2='valed2' orded by field1;

6、select*from table1 where filed1='valed1' order byfiled1 desc linit n;

7、select *from table2 where name like '%$lin%';(模糊)

8、sub_selects(高级)

select *from table1 where id In(select id from table2......);

9、select ...into table...(高级)

(可用select...into outfile...;insert...selkect...替代)

10、SELECT MAX(field1) AS field1 FROM table1 列的最大值

其中:表:table \字段:field

二、修改:

”update table1 set field1='value1',field2=value2'where fiels3='values3“;

UPDATE用新值更新现存表中行的列,SET子句指出哪个列要修改和他们应该被给定的值,WHERE子句,如果

给出,指定哪个行应该被更新,否则所有行被更新。

三、插入:

1、insert into table1 values('field1',field2',...);

INSERT ... VALUES形式的语句基于明确指定的值插入行.

2、replace into tbl_name(1,2,3)values('1','2','3');

REPLACE功能与INSERT完全一样,除了如果在表中的一个老记录具有在一个唯一索引上的新记录有相同的值

,在新记录 入之前,老记录被删除。

四、删除:

$a=”delet from table1 where field1='$value1' and field2='$value2'“;

DELETE从tbl_name表中删除满足由where_definition给出的条件的行,并且返回删除记录的个数。如果你执

行一个没有WHERE子句的DELETE,所有行都被删除。

篇2:经典MySQL的limit查询优化数据库教程

以下的文章主要是对MySQL limit查询优化的具体内容的介绍,我们大家都知道MySQL数据库的优化是相当重要的,其他最为常用也是最为需要优化的就是limit。MySQL的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。

同样是取10条数据

select * from yanxue8_visit limit 10000,10select * from yanxue8_visit limit 0,10

就不是一个数量级别的。

网上也很多关于limit的五条优化准则,都是翻译自MySQL手册,虽然正确但不实用。今天发现一篇文章写了些关于limit优化的,很不错。

文中不是直接使用limit,而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。(测试环境win2033+p4双核 (3GHZ) +4G内存MySQLlimit查询)

1、offset比较小的时候

1.select * from yanxue8_visit limit 10,10

多次运行,时间保持在0.0004-0.0005之间

Select * From yanxue8_visit Where vid >=(Select vid From yanxue8_visit Order By vid limit 10,1  ) limit 10

多次运行,时间保持在0.0005-0.0006之间,主要是0.0006

结论:偏移offset较小的时候,直接使用limit较优,

这个显然是子查询的原因。

2、offset大的时候

select * from yanxue8_visit limit 10000,10

多次运行,时间保持在0.0187左右

Select * From yanxue8_visit Where vid >=(Select vid From yanxue8_visit Order By vid limit 10000,1  ) limit 10

多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。

以后要注意改正自己的limit语句,优化一下MySQL了

推荐人评论

MySQL的优化是非常重要的。其他最常用也最需要优化的就是limit。MySQL的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。

以上的相关内容就是对MySQLlimit查询优化 的介绍,望你能有所收获。

篇3:SQL查询语句使用简要数据库教程

精华|语句

一、简单查询

简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句,它们分别说明所查询列、查询的

表或视图、以及搜索条件等。

例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。

SELECT nickname,email

FROM testtable

WHERE name='张三'

(一) 选择列表

选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变

量和全局变量)等构成。

1、选择所有列

例如,下面语句显示testtable表中所有列的数据:

SELECT *

FROM testtable

2、选择部分列并指定它们的显示次序

查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。

例如:

SELECT nickname,email

FROM testtable

3、更改列标题

在选择列表中,可重新指定列标题。定义格式为:

列标题=列名

列名 列标题

如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列

标题:

SELECT 昵称=nickname,电子邮件=email

FROM testtable

4、删除重复行

SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认

为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。

5、限制返回的行数

使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是

表示一百分数,指定返回的行数等于总行数的百分之几。

例如:

SELECT TOP 2 *

FROM testtable

SELECT TOP 20 PERCENT *

FROM testtable

(二)FROM子句

FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,

它们之间用逗号分隔。

在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列

所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应

使用下面语句格式加以限定:

SELECT username,citytable.cityid

FROM usertable,citytable

WHERE usertable.cityid=citytable.cityid

在FROM子句中可用以下两种格式为表或视图指定别名:

表名 as 别名

表名 别名

(二) FROM子句

FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,

它们之间用逗号分隔。

在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列

所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应

使用下面语句格式加以限定:

SELECT username,citytable.cityid

FROM usertable,citytable

WHERE usertable.cityid=citytable.cityid

在FROM子句中可用以下两种格式为表或视图指定别名:

表名 as 别名

表名 别名

例如上面语句可用表的别名格式表示为:

SELECT username,b.cityid

FROM usertable a,citytable b

WHERE a.cityid=b.cityid

SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。

例如:

SELECT a.au_fname+a.au_lname

FROM authors a,titleauthor ta

(SELECT title_id,title

FROM titles

WHERE ytd_sales>10000

) AS t

WHERE a.au_id=ta.au_id

AND ta.title_id=t.title_id

此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。

(三) 使用WHERE子句设置查询条件

WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:

SELECT *

FROM usertable

WHERE age>20

WHERE子句可包括各种条件运算符:

比较运算符(大小比较):>、>=、=、<、<=、、!>、!<

范围运算符(表达式值是否在指定的范围):BETWEEN…AND…

NOT BETWEEN…AND…

列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)

NOT IN (项1,项2……)

模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE

空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL

逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR

1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30

2、列表运算符例:country IN ('Germany','China')

3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、

varchar、text、ntext、datetime和smalldatetime等类型查询。

可使用以下通配字符:

百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。

下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。

方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。

[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。

例如:

限制以Publishing结尾,使用LIKE '%Publishing'

限制以A开头:LIKE '[A]%'

限制以A开头外:LIKE '[^A]%'

4、空值判断符例WHERE age IS NULL

5、逻辑运算符:优先级为NOT、AND、OR

(四)查询结果排序

使用ORDER BY子句对查询返回的结果按一列或多列排序,

ORDER BY子句的语法格式为:

ORDER BY {column_name [ASC|DESC]} [,…n]

其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排

序。

例如:

SELECT *

FROM usertable

ORDER BY age desc,userid ASC

另外,可以根据表达式进行排序。

二、联合查询

UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联

合查询。UNION的语法格式为:

select_statement

UNION [ALL] selectstatement

[UNION [ALL] selectstatement][…n]

其中selectstatement为待联合的SELECT查询语句。

ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一

行。

联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语

句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。

在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选

择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类

型,系统将低精度的数据类型转换为高精度的数据类型。

在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:

查询1 UNION (查询2 UNION 查询3)

三、连接查询

通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型

数据库管理系统的一个标志。

在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在

一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带

来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行

查询。

连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于

将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

SQL-92标准所定义的FROM子句的连接语法格式为:

FROM join_table join_type join_table

[ON (join_condition)]

其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一

个表操作的连接又称做自连接。

join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比

较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用

的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。

外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)

和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹

配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的

数据行。

交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的

数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑

运算符等构成。

无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接

连接。例如:

SELECT p1.pub_id,p2.pub_id,p1.pr_info

FROM pub_info AS p1 INNER JOIN pub_info AS p2

ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

(一)内连接

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分

三种:

1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接

表中的所有列,包括其中的重复列。

2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些

运算符包括>、>=、<=、<、!>、!<和>。

3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询

结果集合中所包括的列,并删除连接表中的重复列。

例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:

SELECT *

FROM authors AS a INNER JOIN publishers AS p

ON a.city=p.city

又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):

SELECT a.*,p.pub_id,p.pub_name,p.country

FROM authors AS a INNER JOIN publishers AS p

ON a.city=p.city

(二)外连接

内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件

的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外

连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。

如下面使用左外连接将论坛内容和作者信息连接起来:

SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b

ON a.username=b.username

下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:

SELECT a.*,b.*

FROM city as a FULL OUTER JOIN user as b

ON a.username=b.username

(三)交叉连接

交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数

据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等

于6*8=48行。

SELECT type,pub_name

FROM titles CROSS JOIN publishers

ORDER BY type

篇4:SQL查询语句使用数据库教程

语句

作者:任我行一、简单查询

简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句,它们分别说明所查询列、查询的

表或视图、以及搜索条件等。

例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。

SELECT nickname,email

FROM testtable

WHERE name='张三'

(一)选择列表

选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变

量和全局变量)等构成。

1、选择所有列

例如,下面语句显示testtable表中所有列的数据:

SELECT *

FROM testtable

2、选择部分列并指定它们的显示次序

查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。

例如:

SELECT nickname,email

FROM testtable

3、更改列标题

在选择列表中,可重新指定列标题。定义格式为:

列标题=列名

列名 列标题

如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列

标题:

SELECT 昵称=nickname,电子邮件=email

FROM testtable

4、删除重复行

SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认

为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。

5、限制返回的行数

使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是

表示一百分数,指定返回的行数等于总行数的百分之几。

例如:

SELECT TOP 2 *

FROM testtable

SELECT TOP 20 PERCENT *

FROM testtable

(二)FROM子句

FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图,

它们之间用逗号分隔。

在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列

所属的表或视图。例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应

使用下面语句格式加以限定:

SELECT username,citytable.cityid

FROM usertable,citytable

WHERE usertable.cityid=citytable.cityid

在FROM子句中可用以下两种格式为表或视图指定别名:

表名 as 别名

表名 别名

例如上面语句可用表的别名格式表示为:

SELECT username,b.cityid

FROM usertable a,citytable b

WHERE a.cityid=b.cityid

SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。

例如:

SELECT a.au_fname+a.au_lname

FROM authors a,titleauthor ta

(SELECT title_id,title

FROM titles

WHERE ytd_sales>10000

) AS t

WHERE a.au_id=ta.au_id

AND ta.title_id=t.title_id

此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。

(三)使用WHERE子句设置查询条件

WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:

SELECT *

FROM usertable

WHERE age>20

WHERE子句可包括各种条件运算符:

比较运算符(大小比较):>、>=、=、<、<=、、!>、!<

范围运算符(表达式值是否在指定的范围):BETWEEN…AND…

NOT BETWEEN…AND…

列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……)

NOT IN (项1,项2……)

模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE

空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL

逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR

1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30

2、列表运算符例:country IN ('Germany','China')

3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char、

varchar、text、ntext、datetime和smalldatetime等类型查询。

可使用以下通配字符:

百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。

下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。

方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。

[^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。

例如:

限制以Publishing结尾,使用LIKE '%Publishing'

限制以A开头:LIKE '[A]%'

限制以A开头外:LIKE '[^A]%'

4、空值判断符例WHERE age IS NULL

5、逻辑运算符:优先级为NOT、AND、OR

(四)查询结果排序

使用ORDER BY子句对查询返回的结果按一列或多列排序。ORDER BY子句的语法格式为:

ORDER BY {column_name [ASC|DESC]} [,…n]

其中ASC表示升序,为默认值,DESC为降序。ORDER BY不能按ntext、text和image数据类型进行排

序。

例如:

SELECT *

FROM usertable

ORDER BY age desc,userid ASC

另外,可以根据表达式进行排序,

二、联合查询

UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联

合查询。UNION的语法格式为:

select_statement

UNION [ALL] selectstatement

[UNION [ALL] selectstatement][…n]

其中selectstatement为待联合的SELECT查询语句。

ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一

行。

联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语

句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。

在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选

择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类

型,系统将低精度的数据类型转换为高精度的数据类型。

在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。例如:

查询1 UNION (查询2 UNION 查询3)

三、连接查询

通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型

数据库管理系统的一个标志。

在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在

一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带

来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行

查询。

连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于

将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

SQL-92标准所定义的FROM子句的连接语法格式为:

FROM join_table join_type join_table

[ON (join_condition)]

其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一

个表操作的连接又称做自连接。

join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比

较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用

的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。

外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)

和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹

配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的

数据行。

交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的

数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑

运算符等构成。

无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接

连接。例如:

SELECT p1.pub_id,p2.pub_id,p1.pr_info

FROM pub_info AS p1 INNER JOIN pub_info AS p2

ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

(一)内连接

内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分

三种:

1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接

表中的所有列,包括其中的重复列。

2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些

运算符包括>、>=、<=、<、!>、!<和>。

3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询

结果集合中所包括的列,并删除连接表中的重复列。

例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:

SELECT *

FROM authors AS a INNER JOIN publishers AS p

ON a.city=p.city

又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):

SELECT a.*,p.pub_id,p.pub_name,p.country

FROM authors AS a INNER JOIN publishers AS p

ON a.city=p.city

(二)外连接

内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件

的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外

连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。

如下面使用左外连接将论坛内容和作者信息连接起来:

SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b

ON a.username=b.username

下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:

SELECT a.*,b.*

FROM city as a FULL OUTER JOIN user as b

ON a.username=b.username

(三)交叉连接

交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数

据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等

于6*8=48行。

SELECT type,pub_name

FROM titles CROSS JOIN publishers

ORDER BY type

篇5:数据查询SELECT语句数据库教程

数据库是为更方便有效地管理信息而存在的人们,希望数据库可以随时提供所需要的数据信息,

数据查询SELECT语句数据库教程

。因此,对用户来说,数据查询是数据

库最重要的功能。本章将讲述数据查询的实现方法。

在数据库中,数据查询是通过SELECT 语句来完成的。SELECT 语句可以从数据库中按用户要求检索数据,并将查询结果以表格的形式返回。我们在“Transact-SQL 语言”章节及前面的章节中已经初步接触到了SELECT 语句的一些用法,在本章中将分类讲述其具体用法。

本节讲述SELECT 语句完整的锓结构U馐且桓龇浅H叱ぁ⒖菰锏墓程。读者? 以跳过本节,从第二节开始阅读,而将本节作为理解、编写查询语句的语法参考资料。 SELECT 语句完整的语法结构如下:

SELECT statement ::=

[ ORDER BY { order_by_expression | column_position [ ASC | DESC ] } [,...n] ]

[ COMPUTE { { AVG | COUNT | MAX | MIN | SUM } (expression) } [,...n]

[ BY expression [,...n] ] ]

[ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }

[ , XMLDATA ]

[ , ELEMENTS ]

[ , BINARY base64 ] }

[ OPTION ([,...n]) ]

::=

{ | () }

[UNION [ALL] ) [...n] ]

::=

SELECT [ ALL | DISTINCT ]

[ {TOP integer | TOP integer PERCENT} [ WITH TIES] ]

[ INTO new_table ]

[ FROM {} [,...n] ]

[ WHERE ]

[ GROUP BY [ALL] group_by_expression [,...n]

[ WITH { CUBE | ROLLUP } ] ]

[ HAVING ]

由于SELECT 语句特别复杂,上述结构还不能完全说明其用法,因此我们将它拆分为若干部分来讲述。

10.1.1 SELECT 子句

SELECT 子句指定需要通过查询返回的表的列,其语法如下:

SELECT [ ALL | DISTINCT ]

[ TOP n [PERCENT] [ WITH TIES] ]

::=

{ *

| { table_name | view_name | table_alias }.*

| { column_name | expression | IDENTITYCOL | ROWGUIDCOL }

[ [AS] column_alias ]

| column_alias = expression

} [,...n]

各参数说明如下:

ALL

指明查询结果中可以显示值相同的列。ALL 是系统默认的。

DISTINCT

指明查询结果中如果有值相同的列,则只显示其中的一列。对DISTINCT 选项来说, Null 值被认为是相同的值。

TOP n [PERCENT]

指定返回查询结果的前n 行数据。如果PERCENT 关键字指定的话,则返回查询结果的前百分之n 行数据。

WITH TIES

此选项只能在使用了ORDER BY 子句后才能使用当指定此项时,除了返回由TOP n (PERCENT) 指定的数据行外,还要返回与TOP n (PERCENT) 返回的最后一行记录中由ORDER BY 子句指定的列的列值相同的数据行。

select_list

select_list 是所要查询的表的列的集合,多个列之间用逗号分开。

* 通配符,返回所有对象的所有列。

table_name | view_name | table_alias.*

限制通配符*的作用范围。凡是带*的项,均返回其中所有的列。

column_name

指定返回的列名

expression

表达式可以为列名、常量、函数或它们的组合。

IDENTITYCOL

返回IDENTITY 列。如果FROM 子句中有多个表含有IDENTITY 列,则在IDENTTYCOL 选项前必须加上表名,如Table1.IDENTITYCOL。

ROWGUIDCOL

返回表的ROWGUIDCOL 列。同IDENTITYCOL 选项相同,当要指定多个ROWGUIDCOL 列时,选项前必须加上表名,如Table1. ROWGUIDCOL。

column_alias

在返回的查询结果中用此别名替代列的原名。column_alias 可用于ORDER BY 子句,但不能用于WHERE GROUP BY 或HAVING 子句如果查询是游标声明命令DECLARE CURSOR 的一部分,则column_alias 还不能用于FOR UPDATE 子句(有关游标的介绍请参见“游标和视图”章节)。

10.1.2 INTO 子句

INTO 子句用于把查询结果存放到一个新建的表中。SELECT...INTO 句式不能与COMPUTE 子句一起使用。其语法如下:

INTO new_table

参数new_table 指定了新建的表的名称。新表的列由SELECT 子句中指定的列构成,新表中的数据行是由WHERE 子句指定的。但如果SELECT 子句中指定了计算列,在新表中对应的列则不是计算列,而是一个实际存储在表中的列,其中的数据由执行SELECT...INTO 语句时计算得出。如果数据库的“Select into/bulk copy” 选项设置为“True/On”,则可以用INTO 子句创建表和临时表,反之,则只能创建临时表。

10.1.3 FROM 子句

FROM 子句指定需要进行数据查询的表。只要SELECT 子句中有要查询的列,就必须使用FROM 子句。其语法如下:

FROM {} [,...n]

::=

table_name [ [AS] table_alias ] [ WITH ( [,...n]) ]

| view_name [ [AS] table_alias ]

| rowset_function [ [AS] table_alias ]

| OPENXML

| derived_table [AS] table_alias [ (column_alias [,...n] ) ]

|

::=

ON

| CROSS JOIN

|

::=

[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]

[ ]

JOIN

各参数说明如下:

table_source

指明SELECT 语句要用到的表、视图等数据源。

table_name [ [AS] table_alias ]

指明表名和表的别名。

view_name [ [AS] table_alias ]

指明视图名称和视图的别名。

rowset_function [ [AS] table_alias ]

指明行统计函数和统计列的名称。

OPENXML

提供一个XML 文档的行集合视图。

WITH ([,...n])

指定一个或多个表提示。通常SQL Server 的查询优化器会自动选取最优执行计划,除非是特别有经验的用户,否则最好不用此选项。关于表提示table_hint 的设,定请参见下一章的“删除数据”部分。

derived_table [AS] table_alias

指定一个子查询,从数据库中返回数据行。

column_alias

指明列的别名,用以替换查询结果中的列名。

joined_table

指定由连接查询生成的查询结果。有关连接与连接查询的介绍参见本章的相关章节。

join_type

指定连接查询操作的类型。

INNER

指定返回两个表中所有匹配的行。如果没有join_type 选项,此选项就为系统默认。

LEFT [OUTER]

返回连接查询左边的表中所有的相应记录,而右表中对应于左表无记录的部分,用NULL 值表示。

RIGHT [OUTER]

返回连接查询右边的表中所有的相应记录,而左表中对应于右表无记录的部分,用NULL 值表示。

FULL [OUTER]

返回连接的两个表中的所有记录。无对应记录的部分用NULL 值表示。

join_hint

指定一个连接提示或运算法则。如果指定了此选项,则INNER LEFT RIGHT 或FULL选项必须明确指定。通常SQL Server 的查询优化器会自动选取最优执行计划,除非是特别有经验的用户,否则最好不用此选项。

join_hint 的语法如下:

::= { LOOP | HASH | MERGE | REMOTE }

其中LOOP | HASH | MERGE 选项指定查询优化器中的连接是循环、散列或合并的。REMOTE 选项指定连接操作由右边的表完成。当左表的数据行少于右表,才能使用REMOTE 选项。当左表和右表都是本地表时,此选项不必使用。

JOIN

指明特定的表或视图将要被连接。

ON

指定连接的条件。

CROSS JOIN

返回两个表交叉查询的结果。10.1.4 WHERE 子句

WHERE 子句指定数据检索的条件,以限制返回的数据行。其语法如下:

WHERE |

::=

column_name { *= | =* } column_name

各参数说明如下:

search_condition

通过由谓词构成的条件来限制返回的查询结果,

old_outer_join

指定一个外连接。此选项是不标准的,但使用方便。它用“*=” 操作符表示左连接,用“=*” 操作符表示右连接。此选项与在FROM 子句中指定外连接都是可行的方法,但二者只能择其一。

注意:如果在WHERE子句中指定一个值为FALSE的条件,则可以用SELECT...INTO语句来创建一个表名不同,但结构和数据类型均和原表相同的表。

10.1.5 GROUP BY 子句

GROUP BY 子句指定查询结果的分组条件。其语法如下;

GROUP BY [ALL] group_by_expression [,...n]

[ WITH { CUBE | ROLLUP } ]

各参数说明如下:

ALL

返回所有可能的查询结果组合,即使此组合中没有任何满足WHERE 子句的数据。分组的统计列如果不满足查询条件,则将由NULL 值构成其数据。ALL 选项不能与CUBE或ROLLUP 选项同时使用。

GROUP BY ALL is not supported in queries that access remote tables.

group_by_expression

指明分组条件。group_by_expression 通常是一个列名,但不能是列的别名。数据类型为TEXT、NTEXT、IMAGE 或BIT 类型的列不能作为分组条件。

CUBE

除了返回由GROUP BY 子句指定的列外,还返回按组统计的行。返回的结果先按分组的第一个条件列排序显示,再按第二个条件列排序显示以此类推。统计行包括了GROUPBY 子句指定的列的各种组合的数据统计。

ROLLUP

与CUBE 不同的是,此选项对GROUP BY 子句中的列顺序敏感,它只返回第一个分组条件指定的列的统计行。改变列的顺序会使返回的结果的行数发生变化。

使用Distinct选项的统计函数,如AVG(DISTINCT column_name)、COUNT(DISTINCT column_name)、和SUM(DISTINCT column_name)等,不能在使用CUBE或ROLLUP选项时使用。

10.1.6 HAVING 子句

HAVING 子句指定分组搜索条件。HAVING 子句通常与GROUP BY 子句一起使用。TEXT、NTEXT 和IMAGE 数据类型不能用于HAVING 子句。其语法如下:

HAVING

HAVING 子句与WHERE 子句很相似,其区别在于其作用的对象不同。WHERE 子句作用于表和视图,HAVING 子句作用于组。

10.1.7 UNION 操作符

UNION 操作符将两个或两个以上的查询结果合并为一个结果集。它与使用连接查询合并两个表的列是不同的。使用UNION 操作符合并查询结果需要遵循两个基本规则:

列的数目和顺序在所有查询中必须是一致的;

数据类型必须兼容。

其语法如下:

| ()

UNION [ALL]

)

[UNION [ALL] ) [...n] ]

各参数说明如下:

| ()

指明查询的详细说明或查询表达式。

UNION

合并操作符。

ALL

合并所有数据行到结果中,包括值重复的数据行。如果不指定此选项,则重复的数据行只显示一行。

10.1.8 ORDER BY 子句

ORDER BY 子句指定查询结果的排序方式。其语法如下:

ORDER BY {order_by_expression [ ASC | DESC ] } [,...n]

各参数说明如下:

order_by_expression

指定排序的规则。order_by_expression 可以是表或视图的列的名称或别名。如果SELECT 语句中没有使用DISTINCT 选项或UNION 操作符。那么ORDER BY 子句中可以包含select list 中没有出现的列名。或别名ORDER BY 子句中也不能使用TEXT、NTEXT 和 IMAGE 数据类型。

ASC

指明查询结果按升序排列。这是系统默认值。

DESC

指明查询结果按降序排列。

注意:Null值被作为最小的值。

10.1.9 COMPUTE 子句

COMPUTE 子句在查询结果的末尾生成一个汇总数据行。其语法如下:

COMPUTE

{ { AVG | COUNT | MAX | MIN | STDEV | STDEVP |VAR | VARP | SUM }

(expression) } [,...n]

[ BY expression [,...n] ]

各参数说明如下:

AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM以上参数与对应的函数有相同的含义。这些函数均会忽略NULL 值,且DISTINCT选项不能在此使用。

expression

指定需要统计的列的名称。此列必须包含于SELECT 列表中,且不能用别名。COMPUTE子句中也不能使用TEXT、NTEXT 和IMAGE 数据类型。

BY expression

在查询结果中生成分类统计的行。如果使用此选,项则必须同时使用ORDER BY 子句。expression 是对应的ORDER BY 子句中的order_by_expression 的子集或全集。

注意:在SELECT子句中使用统计函数,会覆盖COMPUTE子句中的相应选项。在SELECTINTO语句中不能使用COMPUTE子句。

10.1.10 FOR BROWSE 子句

FOR BROWSE 子句用于读取另外的用户正在进行添加、删除或更新记录的表。其语法如下:

FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }

[ , XMLDATA ]

[ , ELEMENTS ]

[ , BINARY base64 ]

}

各参数说明如下:

BROWSE

BROWSE 选项指明当查看在使用DB-Library 的客户机应用程序中的数据时,可以更新数据。

使用此子句时对所操作的表有一些限制:

表必须包含一个timestamp 类型的时间标识列;

表必须有一个惟一索引。

注意:

在SELECT语句中:FOR BROWSE子句必须是SELECT语句的最后子句;FOR BROWSE子句不能与UNION操作符同时使用;FOR BROWSE子句不能与表提示HOLDLOCK选项同时使用。

XML

XML 选项指明查询结果以XML 文档模式返回XML。 模式分为RAW、AUTO、EXPLICIT 三种。

RAW

将查询结果每一行转换为以一个普通标识符作为元素标识XML 文档。

AUTO

以简单嵌套的XML 树方式返回查询结果。

EXPLICIT

指定查询结果的XML 树的形式被明确定义的。

XMLDATA

返回概要信息。它是附加在文档上返回的。

ELEMENTS

指明列将以子元素的方式返回。

BINARY base 64

指定查询返回的以base64 格式编码的二进制数据。

10.1.11 OPTION 子句

OPTION 子句用于指定在整个查询过程中的查询提示(Query Hint)。通常,用户不必使用OPTION 子句,因为查询优化器会自动选择一个最佳的查询计划。OPTION 子句必须由最外层的主查询来指定。各查询提示之间应使用逗号隔开。其语法如下:

OPTION ([,...n] )

::=

{ { HASH | ORDER } GROUP

| { CONCAT | HASH | MERGE } UNION

| { LOOP | MERGE | HASH } JOIN

| FAST number_rows

| FORCE ORDER

| MAXDOP number

| ROBUST PLAN

| KEEP PLAN

| KEEPFIXED PLAN

| EXPAND VIEWS

}

各参数说明如下:

{HASH | ORDER} GROUP

指定在GROUP BY 或COMPUTE 子句中指定的查询使用散列法或排序法。所谓散列法是指为存储和检索数据项或数据,把搜索关键字转换为一个地址的一种方法。该方法常作为数据集内的记录的一种算法,可以使记录分组均匀,减少搜索时间。

{MERGE | HASH | CONCAT} UNION

指定所有的UNION 操作符采用合并(Merge)、散列(Hash) 或连接(Concatenate)的方法执行操作。如果指定了多个UNION 提示,查询优化器会挑选一个最佳的提示方案。

{LOOP | MERGE | HASH |} JOIN

指定查询过程中的所有连接操作采取循环连接(Loop Join)、合并连接(Merge Join)或散列连接(Hash Join) 的方法。如果指定了多个JOIN 提示,查询优化器会挑选一个最佳的提示方案。

FAST number_rows

指定查询优化只用于迅速返回前number_rows 行数据,在number_rows 行以后的数据采用原查询方法。

FORCE ORDER

指定在查询语法中说明的连接顺序在查询优化的过程中保持不变。

MAXDOP number

忽略由Sp_configure 设定的针对查询的最大并行线程数目。

ROBUST PLAN

强制查询优化器尝试使用最大行容量的计划。

KEEP PLAN

强制查询优化器放松重新编译查询的阈值。指定此选项可以让一个表被多次更新而不必频繁地重新编译查询。

KEEPFIXED PLAN

强制查询优化器不重新编译查询。这样只有当表的概要改变或执行Sp_recompile 存储过程时,才会重新编译查询。

EXPAND VIEWS

扩展索引化视图(当一个视图的名称在查询文本中被视图定义替换时称这个视图被扩展了),并且查询优化器不再将索引化视图作为查询的某部分的替代品。如果视图使用了WITH (NOEXPAND) 说明,则不能被扩展。注意:SELECT语句中各子句的排列次序是很重要的,子句必须依相应的次序来使用。

当用SELECT命令读取TEXT和IMAGE类型数据时,一次所能读取的数据受限于@@TE-XTSIZE全局变量的值。

可以用SET TEXTSIZE命令来更改它。@@TEXTSIZE的初始值为4K,最大为231-1(2,147,483,647)个字节。

篇6:什么是mysql左链接查询 如何使用?数据库教程

MySQL左连接查询是连接查询中的一种方式,下面就为您介绍MySQL左连接查询中的一些问题谈论,如果您感兴趣的话,不妨一看,

我这里所说的主表是指在连接查询里MySQL以哪个表为主进行查询。比如说在MySQL左连接查询里,一般来说左表就是主表,但这只是经验之谈,很多时候经验主义是靠不住的,为了说明问题,先来个例子,建两个演示用的表categories和posts:

CREATETABLEIFNOTEXISTS `categories` (`id`int(10) unsignedNOTNULLAUTO_INCREMENT,`name`varchar(15)NOTNULL,`created` datetimeNOTNULL,PRIMARYKEY(`id`),KEY`name` (`name`));CREATETABLEIFNOTEXISTS `posts` (`id`int(10) unsignedNOTNULLAUTO_INCREMENT,`category_id`int(10) unsignedNOTNULL,`title`varchar(100)NOTNULL,`content`varchar(200)NOTNULL,`created` datetimeNOTNULL,PRIMARYKEY(`id`),KEY`category_id` (`category_id`),KEY`created` (`created`),KEY`category_id_created` (`category_id`, `created`));

先注意一下每个表的索引情况,以后会用到,记得随便插入一点测试数据,不用太多,但怎么也得两行以上,然后执行以下

SQL:EXPLAIN SELECT *FROM postsLEFT JOIN categories ONposts.category_id=categories.idWHERE categories.name LIKE 'foobar%'ORDER BY posts.created DESC

结果如下所示:

table      key         Extracategories name        Using where; Using temporary; Using filesortposts      category_id

在join查询的explain的结果中,第一行表示的表就是主表,

所以说在此查询里categories是主表,而在我们的经验里,LEFT JOIN查询里,左表(posts表)才应该是主表,这产生一个根本的矛盾,MySQL之所以这样处理,是因为在我们的WHERE部分,查询条件是按照categories表的字段来进行筛选的,且categories表刚好存在合适的索引,所以在查询时把categories表作为主表更有利于缩小结果集。

那explain结果中的Using temporary; Using filesort又是为什么呢,为什么created或category_id_created索引无效呢?这是因为主表是categories表,从表是posts表,而我们使用从表的字段去ORDER BY,这通常不是一个好选择,最好改成主表字段。不过很多时候改不了,那就没招了。

再看一个比较怪异的例子:

EXPLAIN SELECT *FROM postsLEFT JOIN categories ONposts.category_id=categories.idWHEREcategories.id= ‘一个已经存在的ID’ORDER BY posts.created DESC

这个例子里posts表仍然是从表,但是按照从表排序的结果却没有出现文件排序和临时表,这是因为已经确定了categories.id,所以主表相当于一个只有一行数据的常量表了,从表根据category_id_created索引在连接的同时自然就得到排序后的结果。但换个角度看,既然categories.id都是确定的了,那类似这样的需求,我们一般就不会再使用LEFT JOIN查询了,而会分成两个独立的查询去检索categories和posts才对。

主观上一旦搞错了主表,可能怎么调整索引都得不到高效的SQL,所以在写SQL时,比如说在写MySQL左连接查询时,如果希望左表是主表,那么就要保证在WHERE语句里的查询条件尽可能多的使用左表字段,进而,一旦确定了主表,也最好只通过主表字段去ORDER BY。

注意:大多数情况下,使用从表字段去排序都是低效的,我最初的例子误导了大家,已更正。

篇7:6个有用的MySQL语句数据库教程

今天给大家介绍六条比较有用的MySQL的SQL语句,可能很多人都通过PHP来实现这些功能,

1. 计算年数

你想通过生日来计算这个人有几岁了。

SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(now) - TO_DAYS(@dateofbirth)), '%Y') + 0;

2. 两个时间的差

取得两个 datetime 值的差。假设 dt1 和 dt2 是 datetime 类型,其格式为 ‘yyyy-mm-dd hh:mm:ss’,那么它们之间所差的秒数为:

UNIX_TIMESTAMP( dt2 ) - UNIX_TIMESTAMP( dt1 )

除以60就是所差的分钟数,除以3600就是所差的小时数,再除以24就是所差的天数。

3. 显示某一列出现过N次的值

SELECT id

FROM tbl

GROUP BY id

HAVING COUNT(*) = N;

4. 计算两个日子间的工作日

所谓工作日就是除出周六周日和节假日。

SELECT COUNT(*)

FROM calendar

WHERE d BETWEEN Start AND Stop

AND DAYOFWEEK(d) NOT IN(1,7)

AND holiday=0;

5. 查找表中的主键

SELECT k.column_name

FROM information_schema.table_constraints t

JOIN information_schema.key_column_usage k

USING (constraint_name,table_schema,table_name)

WHERE t.constraint_type='PRIMARY KEY'

AND t.table_schema='db'

AND t.table_name=tbl'

6. 查看你的数据库有多大

SELECT

table_schema AS 'Db Name',

Round( Sum( data_length + index_length ) / 1024 / 1024, 3 ) AS 'Db Size (MB)',

Round( Sum( data_free ) / 1024 / 1024, 3 ) AS 'Free Space (MB)';

FROM information_schema.tables

GROUP BY table_schema ;

篇8:从一个圈套For循环来谈软件设计[]数据库教程

设计|循环|原创

从一个圈套For循环来谈软件设计

武汉华中师范大学信管系 谢刚

摘要:就自己的一次实际经历来谈谈软件设计过程中应该注意的一些细节

关键字:软件设计 需求分析

前段时间,跟外面公司设计一个MIS系统(使用工具是PB8.0+MSSQL),是一个关于安全生产的,为了体现我们设计人员的高质量服务,我在《需求说明》之外又帮他们设计了一个功能,就是:在每次这个功能窗口打开时,到数据库中去自动检测看看有没有冲突数据;也就是说,两个一模一样的器材是否被安装了到了两个不同的机器上。这个功能,我相信很多朋友都会写,就是两个循环一圈套就完了。是的,我当时的确是用两个FOR圈套来写的。

不错,设计的和想的都很不错。并且是做的《需求说明》之外的事,开始也得到了公司的一点点“点头”。后来发生的事,就叫我苦笑不得了:

昨天,当将他们公司的实际数据导到我们的MS SQL-Server中以后,(一共是9983条记录,每条记录是20来个字段);发现我的那个功能窗口打不开了。死活是进不去啊!当场无奈。

今天下午经过“黑盒”和“白盒”测试后,经过无数次测验,才发现原来是这个10000*10000的自动检测出了毛病,

就是说,在执行这个10000*10000的循环时,一般的机子本来就有点吃不开,在这个情况下,还在数据库中做了大量的比较工作和验证。所以,就算是AMD1500的双CPU和1024M的内存也有点累的说。

总结:

1,只要是《需求说明》上面没写的功能一律不要自作聪明加上去,因为这样你顶多只会得到公司的一点点“点头”,没有什么实际好处。相反,时刻会给你埋下个定时炸弹

2,设计程序时,一定要考虑算法,正所谓:程序=数据结构+算法,的确如此

3,讲究代码效率的同时,考虑程序执行效率

4,书写详细的注释和说明(这个习惯是非常重要的)。

5,每次修改都做修改记录,每次测试都记下测试结果和测试数据类型和方法。

6,认真体会《软件工程》知识,不要片面的认为其无用。

以上是偶的一点点想法,今天比较高兴,感慨到此。不对的地方还望兄弟姐妹们斧正。xiegang亲笔与.06.04下午;虽然不是什么优秀文章,但是请大家转帖时请注名出处。谢谢合作

篇9:从四个细节出发做好MySQL查询优化数据库教程

众所周知,在任何一个数据库中,查询优化都是不可避免的一个话题,对于数据库工程师来说,优化工作是最有挑战性的工作。MySQL开源数据库也不例外。其实笔者认为,数据库优化并没有大家所想象的那么苦难。通常情况下,大家可以从以下四个细节出发来做好MySQL数据库的查询优化工作。

一、利用EXPLAIN关键字来评估查询语句中的缺陷

如下图所示,现在笔者在数据库中执行了一条简单的Select查询语句,从一个表格中查询所有信息。现在数据库管理员想知道,数据库在执行这条语句时,做了哪些工作?或者说想知道,这条查询语句有没有进一步优化的可能。如果要了解这个信息的话,就可以在查询语句中加入一个Explain关键字。

通过Select查询语句可以从数据库中查询某个表中的数据。但是这条语句执行的效率如何?是否还有优化的余地?这些内容是无法从上面这个简单的查询语句中获得的。为了了解更加详细的信息,需要加入Explain关键字。如下图所示:    加入Explain关键字之后,系统并没有查询出表格中的数据,而只是显示了查询过程中的一些信息。这些信息对于我们后续进行数据库查询优化非常有帮助。从上面这个信息中我们可以看出,用户只是进行来一个简单的查询。在这个查询中,没有用到任何索引、关键字等内容,也没有用到Where条件语句。为此这个查询语句并不是很合理。虽然其可以找到最后正确的结果,不过其查询效率可能并不是很明显。为此数据库专家可以根据上面显示的信息来进行优化。如果我们现在在查询语句中加入一条Where语句,那么又会有什么样的结果呢?如下图所示。    此时在最后一个Extra字段中,系统就会显示已经使用了Where语句。在进行数据库优化中,我们需要抓住结果中的NULL字段或者空白内容的字段。这些地方往往是我们进行优化的重点。如上图所示,我们可以给这条Select语句进行如下的优化:在表中设置关键字或者索引,来提高查询的效率。

二、数据比较时采用相同类型的列以提高查询效率

在数据查询时,有时候会在条件语句中加入判断的条件。如现在有两张表:用户基本信息表和用户权限表,两者通过用户编号作为关联。现在需要查询出每个用户对应什么样的权限,此时就要通过用户编号作为查询条件来进行查询。现在假设用户基本信息表中的用户编号字段为CHAR类型的;而用户权限表中的用户编号是VARCHAR类型的。这两个数据类型虽然都是字符型,但是不是同一种类型。现在对这连个表执行关联查询,其查询的效率如何呢?首先需要确定的一点是,虽然他们两个是不同类型的字符型数据,不过是相互兼容的。最后仍然可以得到正确的结果。明确了这一点之后,我们再来考虑,能否对这个查询语句进行优化呢?

我们再假设一下。现在这两个表的用户编号的数据类型都是CHAR,

现在再对这两个表进行关联查询,得到的结果是否相同呢?我们测试的结果是,查询的结果是相同的,但是其所花费的时间是不同的。而且随着数据量的增加,两个查询所相差的时间会越来越长。从这里可以知道,虽然这两个查询语句是等价的,但是其查询的效率不同。

在MySQL数据库中,虽然相互兼容的数据类型可以进行相互比较。但是其查询的效率会有所影响。从提高数据库查询效率的角度出发,笔者建议在查询条件语句中最好比较具有相同类型的列。在同等条件下,相同的列类型比不同类型的列能够提供更好的性能。特别是在数据量比较多的数据库中,这尤其重要。

不过这个优化需要涉及到数据表的列类型。为此在数据表进行设计时,就需要考虑这一点。如针对上面这个案例,我们可以在两个表中专门设置一个用户ID列。可以使用整数类型的序列,让系统进行自动编号。然后在查询时通过这个用户ID列来进行比较,而不是通过原来的用户编号列进行比较。相对来说,这么操作查询的效率会更高。

三、在Like关键字的起始处通配符要谨慎使用

在实际工作中,笔者发现不少数据库管理员有一个不好的习惯。他们在使用Like等关键字时,通配符会乱用。如现在用户需要查找所有以“LOOK”为前缀的产品信息。用户在查询时,会习惯性的使用下面的语句进行查询:like “%LOOK%”。这个条件语句会查询出所有品名中有LOOK这个单词的纪录,而不是查询出以LOOK为前缀的产品信息。

虽然最终的结果可能是相同的。但是两者的查询效率不同。其实这很大一部分原因是客户端应用程序设计不当所造成的。如在客户端应用程序设计时,系统会默认显示一个%符号。如下图所示。

这么设计的本意是好的,让系统能够支持模糊查询。但是用户在实际操作起来,就可以有问题。如用户在查询时,不会在%号前面输入LOOK这个单词,而是在%后面输入LOOK这个单词。因为在查询时,光标会自动定位到%号后面。通常情况下,用户在输入时不会再去调整光标的位置。此时就出现了上面所说的这种情况。

为此笔者建议,在Like等关键字后面如果需要用到通配符的话,要非常的谨慎。特别是从大量数据中查找纪录时,这个通配符的位置一定要用对地方。在起始处能够不同通配符的话,尽量不要使用通配符。

四、尽量使用其它形式来代替Like关键字

上面提到在使用Like关键字时需要注意通配符的位置。其实从查询效率来看,我们不仅需要注意通配符的位置,而且能够不用Like关键字最好就不用。其实在SQL语句中,可以利用其他方式来代替Like关键字。如现在有一个产品表,其编号为6位。现在需要查询以9开头的产品编号。这该怎么操作呢?

一是可以通过使用Like关键字,如LIKE “9%”。注意这个通配符的位置。这个条件语句可以查到所需要的结果。但是从性能优化的角度看,这条语句不是很好的处理方式。我们还可以通过一些折中的方式来实现。

二是通过比较符号来实现。如可以使用Value>=900000 and Value<=999999这种方式来实现。虽然两者的查询的结果是相同的。但是查询的时间这条语句要比上面这个采用Like符号的语句要短的多。

如何恢复MYSQL实体文件MYI,MYD到数据库中数据库教程

拼音处理数据库教程

跟踪标记全攻略数据库教程

MySQL文件系统先睹为快数据库

Perl 脚本的特点数据库教程

小技巧:用批处理对MySQL进行数据操作数据库教程

了解一下NULLs怎样影响IN和EXISTS数据库教程

确保PHP应用程序的安全[2]WEB安全

浅谈mssql access数据库 top分页方法

ACCESS数据库中Field对象的caption属性读写数据库教程

从一个MysqL的例子来学习查询语句数据库教程
《从一个MysqL的例子来学习查询语句数据库教程.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【从一个MysqL的例子来学习查询语句数据库教程(锦集9篇)】相关文章:

Listen Software解决方案 “How To” 系列2:存储过程数据库教程2023-08-07

如何保护MySQL 中的重要数据2023-05-25

网数据库的代码集合2022-12-27

如何学好Access数据库编程2023-04-30

CorelDRAW9中立体工具的使用方法介绍2023-01-15

如何设置ACCESS(运行时)的宏安全性级别数据库教程2023-03-01

用 INNER JOIN语法联接多个表建记录集数据库教程2023-09-17

如何防范网站数据库入侵2022-11-30

调优日志切换(Tuning Log Switches)数据库教程2022-04-30

php实习报告2022-10-05

点击下载本文文档