SQL分类:
DDL—数据定义语言( CREATE , ALTER , DROP , DECLARE )
DML—数据操纵语言( SELECT , DELETE , UPDATE , INSERT )
DCL—数据控制语言( GRANT , REVOKE , COMMIT , ROLLBACK )
首先,简要介绍基础语句:
1 、创建数据库
CREATE DATABASE database - name
2 、删除数据库
drop database dbname
3 、备份sql server
-- - 创建 备份数据的 device
USE master
EXEC sp_addumpdevice ’ disk ’, ’testBack’, ’c:\mssql7backup\MyNwind_1.dat’
-- - 开始 备份
BACKUP DATABASE pubs TO testBack
4 、创建新表
create table tabname(col1 type1 [ not null ] [ primary key ] ,col2 type2 [ not null ] ,..)
根据已有的表创建新表:
A: create table tab_new like tab_old (使用旧表创建新表)
B: create table tab_new as select col1,col2… from tab_old definition only
5 、删除新表 drop table tabname
6 、增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7 、添加主键: Alter table tabname add primary key (col)
删除主键: Alter table tabname drop primary key (col)
8 、创建索引: create [ unique ] index idxname on tabname(col….)
删除索引: drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9 、创建视图: create view viewname as select statement
删除视图: drop view viewname
10 、几个简单的基本的sql语句
选择: select * from table1 where 范围
插入: insert into table1(field1,field2) values (value1,value2)
删除: delete from table1 where 范围
更新: update table1 set field1 = value1 where 范围
查找: select * from table1 where field1 like ’ % value1 % ’ -- -like的语法很精妙,查资料!
排序: select * from table1 order by field1,field2 [ desc ]
总数: select count * as totalcount from table1
求和: select sum (field1) as sumvalue from table1
平均: select avg (field1) as avgvalue from table1
最大: select max (field1) as maxvalue from table1
最小: select min (field1) as minvalue from table1
11 、几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL ),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 ( EXCEPT ALL ),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 ( INTERSECT ALL ),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12 、使用外连接
A、 left outer join :
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B: right outer join :
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C: full outer join :
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
其次,大家来看一些不错的sql语句
1 、复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一: select * into b from a where 1 <> 1
法二: select top 0 * into b from a
2 、拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3 、跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:.. from b in ’" & Server.MapPath(".") & "\data.mdb" & "’ where ..
4 、子查询(表名1:a 表名2:b)
select a,b,c from a where a IN ( select d from b ) 或者: select a,b,c from a where a IN ( 1 , 2 , 3 )
5 、显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,( select max (adddate) adddate from table where table .title = a.title) b
6 、外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7 、在线视图查询(表名1:a )
select * from ( SELECT a,b,c FROM a) T where t.a > 1 ;
8 、between的用法,between限制查询数据范围时包括了边界值, not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
9 、 in 的使用方法
select * from table1 where a [ not ] in (‘值1’,’值2’,’值4’,’值6’)
10 、两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1 = table2.field1 )
11 、四表联查问题
select * from a left inner join b on a.a = b.b right inner join c on a.a = c.c inner join d on a.a = d.d where ...
12 、日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff (’minute’,f开始时间, getdate ()) > 5
13 、一条sql 语句搞定数据库分页
select top 10 b. * from ( select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc ) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
14 、前10条记录
select top 10 * form table1 where 范围
15 、选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a = ( select max (a) from tablename tb where tb.b = ta.b)
16 、包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
( select a from tableA ) except ( select a from tableB) except ( select a from tableC)
17 、随机取出10条数据
select top 10 * from tablename order by newid ()
18 、随机选择记录
select newid ()
19 、删除重复记录
Delete from tablename where id not in ( select max (id) from tablename group by col1,col2,...)
20 、列出数据库里所有的表名
select name from sysobjects where type = ’U’
21 、列出表里的所有的
select name from syscolumns where id = object_id (’TableName’)
22 、列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case
select type, sum ( case vender when ’A’ then pcs else 0 end ), sum ( case vender when ’C’ then pcs else 0 end ), sum ( case vender when ’B’ then pcs else 0 end ) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23 、初始化表table1
TRUNCATE TABLE table1
24 、选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
mysql -uroot -p111111 -h127.0.0.1
求助数据库连接:ERROR 1045 (28000): Access denied for user (using password: YES)??
其实只要加上主机ip就ok了。
后面需要加-h ServerIPAddr
如:
mysql -u xx -p -h 192.168.1.1然后输入密码,就OK了
随便附上mysql常用的命令(以下内容转载自: 原文地址 http://engyy.com/?act
mysql命令行常用命令
第一招、mysql服务的启动和停止
net stop mysql
net start mysql
第二招、登陆mysql
语法如下: mysql -u用户名 -p用户密码
键入命令mysql -uroot -p, 回车后提示你输入密码,输入12345,然后回车即可进入到mysql中了,mysql的提示符是:
mysql>
注意,如果是连接到另外的机器上,则需要加入一个参数-h机器IP
第三招、增加新用户
格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"
如,增加一个用户user1密码为password1,让其可以在本机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:
grant select,insert,update,delete on *.* to user1@localhost Identified by "password1";
如果希望该用户能够在任何机器上登陆mysql,则将localhost改为"%"。
如果你不想user1有密码,可以再打一个命令将密码去掉。
grant select,insert,update,delete on mydb.* to user1@localhost identified by "";
第四招: 操作数据库
登录到mysql中,然后在mysql的提示符下运行下列命令,每个命令以分号结束。
1、 显示数据库列表。
show databases;
缺省有两个数据库:mysql和test。 mysql库存放着mysql的系统和用户权限信息,我们改密码和新增用户,实际上就是对这个库进行操作。
2、 显示库中的数据表:
use mysql;
show tables;
3、 显示数据表的结构:
describe 表名;
4、 建库与删库:
create database 库名;
drop database 库名;
5、 建表:
use 库名;
create table 表名(字段列表);
drop table 表名;
6、 清空表中记录:
delete from 表名;
7、 显示表中的记录:
select * from 表名;
第五招、导出和导入数据
1. 导出数据:
mysqldump --opt test > mysql.test
即将数据库test数据库导出到mysql.test文件,后者是一个文本文件
如:mysqldump -u root -p123456 --databases dbname > mysql.dbname
就是把数据库dbname导出到文件mysql.dbname中。
2. 导入数据:
mysqlimp
不用解释了吧。
3. 将文本数据导入数据库:
文本数据的字段数据之间用tab键隔开。
use test;
load da
第六招、乱码问题
MySQL 的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。
查看系统的字符集和排序方式的设定可以通过下面的两条命令:
查看字符集:
1. mysql> SHOW VARIABLES LIKE 'character_set_%';
显示字符集设置如下:
1. +--------------------------+----------------------------+
2. | Variable_name | Value |
3. +--------------------------+----------------------------+
4. | character_set_client | latin1 |
5. | character_set_connection | latin1 |
6. | character_set_database | latin1 |
7. | character_set_results | latin1 |
8. | character_set_server | latin1 |
9. | character_set_system | utf8 |
10. | character_sets_dir | /usr/share/mysql/charsets/ |
11. +--------------------------+----------------------------+
查看排序方式(Collation)
1. mysql> SHOW VARIABLES LIKE 'collation_%';
显示默认值:
1. +----------------------+-------------------+
2. | Variable_name | Value |
3. +----------------------+-------------------+
4. | collation_connection | latin1_swedish_ci |
5. | collation_database | latin1_swedish_ci |
6. | collation_server | latin1_swedish_ci |
7. +----------------------+-------------------+
上面列出的值就是系统的默认值。如果你奇怪系统怎么默认是latin1的瑞典语排序方式,原因是MySQL由瑞典的T.c.X.DataKonsultAB公司(目前公司名称为MySQL AB)开发,不用再多说了吧。
当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:
SET NAMES ‘utf8′;
它相当于下面的三句指令:
1. SET character_set_client = utf8;
2. SET character_set_results = utf8;
3. SET character_set_connection = utf8;
再试试看,正常了吧?
就是连接之后加个查询
1. $this->query(”SET NAMES ‘utf8'”);
character_set_client,character_set_results,character_set_connection三个运行变量是造成乱码的关键。mysql把客户端提交的查询由character_set_client转换为 character_set_connection
,由于默认网页提交的查询是gb2312(表单页面meta里可以看到),而mysql默认将其当作utf8(可以查到此时的 character_set_client=utf8),所以必然乱码。同理,mysql返回的结果是已经转换成 character_set_results编码的(与表的编码无关),同样默认是utf8,而网页页面把它当gb2312处理,所以必然有标题等由数据库读出的字段是乱码而其他部门文字不乱码的现象。