注意:
[1]下面一~五都可以使用下面的两点的方法解决。
[2]可以按照我的另一篇文章《ubuntu windows mysql workbench 安装探索》,在windows下安装mysql,然后点击开始-->MySQL Command Line Client Unicode-->Enter password:(输入密码)。这样就直接登录到本机的数据库了。这些登录方法是针对这种情况:客户端是Linux系统,使用客户端连接服务器数据库。
[3]如果是windows下的mysql数据库服务器,那么可以使用《ubuntu windows mysql workbench 安装探索》的方法修改用户账号和密码
一、登陆数据库
[root@ghw hw]# mysql -h 192.168.99.80 –u root –p
Enter password: (输入密码)
[1]如果登陆本机数据库且用root用户,不需要-h 192.168.99.80
[2]刚安装好就有一个root用户。注意:这个root用户不是Linux的系统用户。进入数据库后,可以自己添加用户
[3]一开始root没有密码,所以不要-p,不需要输入密码就可以进入数据库。
[4]如果root用户没有密码,普通用户不需要-h。如果root用户有密码,普通用户一定要-h
二、修改密码
(1)root用户修改密码
[root@ghw hw]# mysqladmin -u root -p password rootadmin
输入这个命令后,需要输入root的原密码,然后root的密码将改为rootadmin。
[1]如果root没有密码,不要-p ,不需要输入密码。这种方法只适合root用户
[2]如果修改不成功,systemctl status mysqld.service看看。如果是failed的话,只能重启了。
重启后,systemctl status mysqld.service看看。如果是active,那么一定能修改成功清除mysql的root密码
[root@ghw hw]# systemctl stop mysqld.service #注意要使用linux系统的root用户
[root@ghw hw]# mysqld_safe --skip-grant-tables --skip-networking &
[root@ghw hw]# mysql
mysql> use mysql;
mysql> update user set password="" where user='root';
mysql> exit;
[root@ghw hw]# systemctl restart mysqld.service
三、增加mysql用户
[root@ghw hw]# mysql -u root –p #增加用户必须使用mysql的root用户
Enter password: (输入密码)
mysql> create user 'alex'@'192.118.1.1' identified by '123'; # 指定ip:192.118.1.1的mjj用户登录
mysql> create user 'alex'@'192.118.1.%' identified by '123'; # 指定ip:192.118.1.开头的mjj用户登录
mysql> create user 'alex'@'%' identified by '123'; # 指定任何ip的mjj用户登录
四、查询用户
[root@ghw hw]# mysql -h 192.168.99.80 -u test_mysql -p
mysql> select user(); #查询登录用户
mysql> SELECT DISTINCT CONCAT('User:''',user,'''@''',host,''';') AS query FROM mysql.user; #查看MYSQL数据库中所有用户
mysql> show grants for 'user_1'@'%'; #查看数据库中具体某个用户的权限 注意:创建user_1用户时是这样:user_1@"%",所以这里也只能用%
mysql> show grants for 'user_2'@'localhost'; #注意:创建user_1用户时是这样:user_2@" localhost ",所以这里也只能用localhost
mysql> select * from mysql.user where user='user_1' \G #详细列出用户的权限
mysql> select * from mysql.user where user='user_2' \G
五、删除用户
[root@ghw hw]# mysql -u root –p #登录mysql的普通用户也行
Enter password:(rootadmin)
mysql> delete from mysql.user where user='user_12' and Host='localhost'; # mysql.user的mysql是数据库,user是表
mysql> drop user 'user_10'@'%'; #要正确输入时%还是localhost,如果不清楚可以先用SELECT DISTINCT CONCAT查询
mysql> drop user 'user_14'@'localhost';
mysql> use mysql;
Database changed
mysql> delete from user where user='user_13' and Host='localhost'; #如果执行了use mysql;,就可以直接用user
六、修改用户
mysql> rename user '用户名'@'IP地址' to '新用户名'@'IP地址'; #修改用户
七、普通用户修改密码
方法一、
[root@ghw hw]# mysql -u root -p
Enter password:(rootadmin)
mysql> use mysql;
mysql> update user set password=PASSWORD('123456') where user='test_mysql';
mysql> flush privileges; #重载权限
mysql>exit;
[root@ghw hw]# mysql -h 192.168.99.80 -u test_mysql -p
Enter password:(123456) #(123456)是新密码。如果不执行这个flush privileges;输入原来的密码,重启数据后才能用新密码。重启方法是:systemctl restart mysqld.service
方法二、
[root@ghw hw]# mysql -u root -p
Enter password:(rootadmin)
mysql> set password for test_mysql=PASSWORD('123456');
mysql> exit;
[root@ghw hw]# mysql -h 192.168.99.80 -u test_mysql –p
Enter password:(123456) #(123456)是新密码。
注意:上面要加-p 否则会出下面的问题:ERROR 1045 (28000): Access denied for user 'hw_analyse'@'localhost' (using password: NO)
如果还出现:执行下面两步:
第一步:
[root@ghw hw]# mysql -h 192.168.99.80 -u test_mysql -p
Enter password:(123456)
如果想让192.168.10.83能够连接到本地的这个数据库,要让数据库给其分配权限,登录mysql,执行:(username 和 password是登录mysql的用户名和密码)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'username'@'192.168.10.83' IDENTIFIED BY 'password' WITH GRANT OPTION;
如果要想所有的外部ip地址都能够访问使用mysql,可以执行下面: 注意:username和password要填写自己的真实的账号和密码。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
之后执行刷新数据库:
flush privileges;
第二步:
[root@ghw hw]# sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
注释:bind-address = 127.0.0.1
八、修改属性
#查看权限
mysql> show grants for '用户'@'IP地址'; #同样:如果创建时是create user 'user_1'@'%' identified by '123'; 那么这里是:show grants for 'user_1'@'%'; 否则会出错!
mysql> grant select ,insert,update on db1.t1 to "alex"@'%'; #授权 mjj用户仅对db1.t1文件有查询、插入和更新的操作
mysql> grant all privileges on db1.t1 to "alex"@'%'; # 表示有所有的权限,除了grant这个命令,这个命令是root才有的。mjj用户对db1下的t1文件有任意操作
mysql> grant all privileges on db1.* to "alex"@'%'; #mjj用户对db1数据库中的文件执行任何操作
mysql> grant all privileges on *.* to "alex"@'%'; #mjj用户对所有数据库中文件有任何操作
#取消权限
mysql> revoke all on db1.t1 from 'alex'@"%"; # 取消mjj用户对db1的t1文件的任意操作
mysql> revoke all on db1.* from 'alex'@"%"; # 取消来自远程服务器的mjj用户对数据库db1的所有表的所有权限
mysql> revoke all privileges on *.* from 'alex'@'%'; #取消来自远程服务器的mjj用户所有数据库的所有的表的权限
九、数据库操作
[root@ghw hw]# mysql -u root –p #登录mysql的普通用户也行
Enter password:(rootadmin)
mysql> show databases; #显示数据库
mysql> create database test_db; #建库
mysql> use test_db; #操作数据库前,一定要先执行这个
Database changed
mysql> drop database test_db; #删库
十、数据库备份
mysql> mysqdump -u root db1 > db1.sql -p # 备份:数据表结构+数据
mysql> mysqdump -u root -d db1 > db1.sql -p # 备份:数据表结构
#导入现有的数据到某个数据库
mysql> create database db10; #1.先创建一个新的数据库
mysql> mysqdump -u root -d db10 < db1.sql -p # 2.将已有的数据库文件导入到db10数据库中
十一、表
[root@ghw hw]# mysql -u root –p #登录mysql的普通用户也行
Enter password:(rootadmin)
mysql> use test_db; #使用test_db库,如果没有先按上面方法创建
mysql> show tables; #显示数据库中的表
mysql> create table name (id int(3) auto_increment not null primary key, xm char(8),xb char(2),csny date); #建表
mysql> describe name; #显示数据表的结构
mysql> desc test_db.name; #功能和上面一样,不同的是:可以用desc,指定数据库
mysql> drop table name; #删表
八、表操作
[root@ghw hw]# mysql -u root –p
Enter password:(rootadmin)
mysql> use test_db; # test_db库中已经有一个用上面方法创建的表name。name是表名称
mysql> insert into name values('','zhangsan','nan','1971-10-01'); #插入第一条
mysql> insert into name values('','baiyun','nv','1972-05-20'); #插入第二条
mysql> insert into name(id, xm) values('100','buzhidao'); #只插入其中两个字段,其他将会是NULL值
mysql> select * from name; #显示表中全部记录
mysql> select id,xm from name; #只显示id,xm字段
mysql> select * from name where id > 2; #显示id大于2的
mysql> update name set csny='1971-01-10' where xm='zhangsan'; #修改纪录
mysql> delete from name where xm='zhangsan'; #删除纪录
mysql> delete from name where id > 2; #删除id大于2的
mysql> mysql> delete from name; #清空表
九、linux mysql目录
1、数据库目录 库中创建了test_mysql_db和test_db,这个目录下就有相应的文件
[root@ghw hw]# ls /var/lib/mysql
ghw.err ib_logfile1 mysql-bin.000003 mysql-bin.000007 mysql-bin.000011 mysql.sock test_mysql_db
ghw.pid mysql mysql-bin.000004 mysql-bin.000008 mysql-bin.000012 performance_schema
ibdata1 mysql-bin.000001 mysql-bin.000005 mysql-bin.000009 mysql-bin.000013 test
ib_logfile0 mysql-bin.000002 mysql-bin.000006 mysql-bin.000010 mysql-bin.index test_db
2、配置文件
[root@ghw hw]# ls /usr/share/mysql #(mysql.server命令及配置文件)
myspell/ mysql/ mysql-test/ mysql-workbench/
[root@ghw hw]# ls /usr/share/mysql
charsets dutch german my-huge.cnf mysql_system_tables.sql romanian ukrainian
config.huge.ini english greek my-innodb-heavy-4G.cnf mysql_test_data_timezone.sql russian
config.medium.ini errmsg-utf8.txt hungarian my-large.cnf norwegian serbian
config.small.ini estonian italian my-medium.cnf norwegian-ny slovak
czech fill_help_tables.sql japanese my-small.cnf polish spanish
danish french korean mysql_system_tables_data.sql portuguese Swedish
3、相关命令
[root@ghw hw]# ls /usr/bin #(mysqladmin mysqldump等命令)
4、启动脚本
[root@ghw hw]# ls /etc/rc.d/init.d/ #fedora 17的启动方法改了
functions ices mysql-mmm-agent mysql-mmm-monitor mysql-proxy netconsole network spice-vdagentd vmware-tools
十、备份与恢复
(1)备份
[root@ghw hw]# cd /var/lib/mysql
[root@ghw mysql]# mysqldump -u root -p --opt test_db > /home/hw/back_test_db #备份 一定要进入cd /var/lib/mysql,再执行,否则不成功。如果不要/home/hw/,保存到当前目录下。
Enter password: (rootadmin)
[root@ghw mysql]# ls -l /home/hw/back_test_db
-rw-r--r--. 1 root root 1250 1月 17 11:53 /home/hw/back_test_db
(2)还原
方法一、
[root@ghw hw]# cp -av /home/hw/back_test_db /var/lib/mysql/ #拷贝/var/lib/mysql/,否则可能会不行。其实上面不输入路径直接备份到/var/lib/mysql/。这样做为了说明问题
[root@ghw hw]# mysql -u root -p
Enter password: (rootadmin)
mysql> use test_db_02; #先切换到被还原的数据库,如果没有按前面的方法创建一个
Database changed
mysql> show tables;
Empty set (0.00 sec) #数据为空
mysql> source back_test_db;
Query OK, 0 rows affected (0.00 sec) #成功导入
mysql> show tables; #有数据了
方法二、
mysql> use test_db_02;
Database changed
mysql> show tables;
Empty set (0.00 sec) #数据库为空
mysql> exit;
Bye
[root@ghw mysql]# mysql -u root -p test_db_02 < back_test_db; #注意back_test_db在/var/lib/mysql/ 当前路径也是在/var/lib/mysql/
Enter password: (rootadmin)
mysql> use test_db_02;
Database changed
mysql> show tables;
+----------------------+
| Tables_in_test_db_02 |
+----------------------+
| name |
+----------------------+
1 row in set (0.00 sec) #数据库有数据了
十一、将数据装入表中
第一步:
[root@ghw hw]# vim test_db_02.txt #内容如下:
11 lisi na 1991-10-01
12 nantian nv 1992-05-20
[1]因为第一字段是id int(3) auto_increment not null primary key,所以13、24可以不要,但是后面的tab符要保留
[2]id xm xb csny不能要
[3]每个字段之间一定要一个也只能要一个tab符
[4]使用\N(反斜线,字母N)表示NULL值
[5]如果用Windows中的编辑器(使用\r\n做为行的结束符)创建文件,应使用:
mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet
-> LINES TERMINATED BY '\r\n';
(在运行OS X的Apple机上,应使用行结束符'\r'。)
[6]如果你愿意,你能明确地在LOAD DATA语句中指出列值的分隔符和行尾标记,但是默认标记是定位符和换行符。
第二步:
mysql> load data local infile '/home/hw/test_db_02.txt' into table name;
mysql> select * from name; #数据已经装入表中
十二、技巧
(1)命令输入
[1]
mysql> select user(); #输出当前登录用户
[2]
mysql> select
-> user()
-> ; #输入;结束输入,执行命令
[3]
mysql> select
-> user()
-> \c #取消全部输入
mysql>
(2) 提示符含义
mysql> 准备好接受新命令。
-> 等待多行命令的下一行。
'> 等待下一行,等待以单引号(“'”)开始的字符串的结束。
"> 等待下一行,等待以双引号(“"”)开始的字符串的结束。
`> 等待下一行,等待以反斜点(‘`’)开始的识别符的结束。
/*> 等待下一行,等待以/*开始的注释的结束。
(3)不分大小写
十三、其他
(1)统计
mysql> select count(*) from name; #计算行数
(2)复制表结构
mysql> create table ts_cp like name; #方法1 注意name是表名,字段看上面,第一个是id int(3) auto_increment not null primary key
mysql> create table ts_cp select * from name limit 0; #方法二,这个方法好像少了auto_increment
mysql> show create table name \G;
*************************** 1. row ***************************
Table: name
Create Table: CREATE TABLE `name` (
`id` int(3) NOT NULL AUTO_INCREMENT,
`xm` char(8) DEFAULT NULL,
`xb` char(2) DEFAULT NULL,
`csny` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified #把sql语句copy出来,改一下表名和atuo_increment,然后在执行一下。
(3) 复制表数据,以及表结构
mysql> create table ts_cp select * from name; #方法一 复制整个表
mysql> create table ts_cp select xm,csny from name where id=1; #方法二 复制xm,csny字段的,且id等于1. where id=1不要就是这两个字段的全部。select前面可以加as,效果完全一样
mysql> create table ts_cp like name; #方法三 先建一个空表,字段要设好,下面复制内容到这个表里。这里用上面复制表结构方法
mysql> insert into ts_cp select * from name; #复制内容
(4)重命名表
mysql> alter table name rename to ts_cp; #name 是原来的表名字,ts_cp是修改后的表名字。
(5) 重命名数据库
[root@ghw mysql]# cd /var/lib/mysql
[root@ghw mysql]# mv -v test_db_02 test_db_re;
"test_db_02" -> "test_db_re"
[root@ghw mysql]# mysql -u root -p
Enter password: (rootadmin)
mysql> show databases; #test_db_02没有了,多了test_db_re,所以改名成功
十四、mysql与SQLserver比较:
参考资料:Mysql与sql server的区别 http://www.cnblogs.com/chu888chu888/archive/2012/01/12/2320207.html
1. 标识符限定符
SqlServer []
MySql ``
2. 字符串相加
SqlServer 直接用 +
MySql concat()
3. isnull()
SqlServer isnull()
MySql ifnull()
注意:MySql也有isnull()函数,但意义不一样
4. getdate()
SqlServer getdate()
MySql now()
5. newid()
SqlServer newid()
MySql uuid()
6. @@ROWCOUNT
SqlServer @@ROWCOUNT
MySql row_count()
注意:MySql的这个函数仅对于update, insert, delete有效
7. SCOPE_IDENTITY()
SqlServer SCOPE_IDENTITY()
MySql last_insert_id()
8. if ... else ...
SqlServer
IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE
{ sql_statement | statement_block } ]
-- 若要定义语句块,请使用控制流关键字 BEGIN 和 END。
MySql
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
注意:对于MySql来说,then, end if是必须的。类似的还有其它的流程控制语句,这里就不一一列出。
9. declare
其实,SqlServer和MySql都有这个语句,用于定义变量,但差别在于:在MySql中,DECLARE仅被用在BEGIN ... END复合语句里,并且必须在复合语句的开头,在任何其它语句之前。这个要求在写游标时,会感觉很BT.
10. 游标的写法
SqlServer
declare @tempShoppingCart table (ProductId int, Quantity int)
insert into @tempShoppingCart (ProductId, Quantity)
select ProductId, Quantity from ShoppingCart where UserGuid = @UserGuid
declare @productId int
declare @quantity int
declare tempCartCursor cursor for
select ProductId, Quantity from @tempShoppingCart
open tempCartCursor
fetch next from tempCartCursor into @productId, @quantity
while @@FETCH_STATUS = 0
begin
update Product set SellCount = SellCount + @quantity where productId = @productId
fetch next from tempCartCursor into @productId, @quantity
end
close tempCartCursor
deallocate tempCartCursor
MySql
declare m_done int default 0;
declare m_sectionId int;
declare m_newsId int;
declare _cursor_SN cursor for select sectionid, newsid from _temp_SN;
declare continue handler for not found set m_done = 1;
create temporary table _temp_SN
select sectionid, newsid from SectionNews group by sectionid, newsid having count(*) > 1;
open _cursor_SN;
while( m_done = 0 ) do
fetch _cursor_SN into m_sectionId, m_newsId;
if( m_done = 0 ) then
-- 具体的处理逻辑
end if;
end while;
close _cursor_SN;
drop table _temp_SN;
注意:为了提高性能,通常在表变量上打开游标,不要直接在数据表上打开游标。
11. 分页的处理
SqlServer
create procedure GetProductByCategoryId(
@CategoryID int,
@PageIndex int = 0,
@PageSize int = 20,
@TotalRecords int output
)
as
begin
declare @ResultTable table
(
RowIndex int,
ProductID int,
ProductName nvarchar(50),
CategoryID int,
Unit nvarchar(10),
UnitPrice money,
Quantity int
);
insert into @ResultTable
select row_number() over (order by ProductID asc) as RowIndex,
p.ProductID, p.ProductName, p.CategoryID, p.Unit, p.UnitPrice, p.Quantity
from Products as p
where CategoryID = @CategoryID;
select @TotalRecords = count(*) from @ResultTable;
select *
from @ResultTable
where RowIndex > (@PageSize * @PageIndex) and RowIndex <= (@PageSize * (@PageIndex+1));
end;
当然,SqlServer中并不只有这一种写法,只是这种写法是比较常见而已。
MySql
create procedure GetProductsByCategoryId(
in _categoryId int,
in _pageIndex int,
in _pageSize int,
out _totalRecCount int
)
begin
set @categoryId = _categoryId;
set @startRow = _pageIndex * _pageSize;
set @pageSize = _pageSize;
prepare PageSql from
'select sql_calc_found_rows * from product where categoryId = ? order by ProductId desc limit ?, ?';
execute PageSql using @categoryId, @startRow, @pageSize;
deallocate prepare PageSql;
set _totalRecCount = found_rows();
end
参考资料:MS SQL Server和MySQL区别 http://database.51cto.com/art/200905/125225.htm
1 MySQL支持enum,和set类型,SQL Server不支持
2 MySQL不支持nchar,nvarchar,ntext类型
3 MySQL的递增语句是AUTO_INCREMENT,而MS SQL是identity(1,1)
4 MS SQL默认到处表创建语句的默认值表示是((0)),而在MySQL里面是不允许带两括号的
5 MySQL需要为表指定存储类型
6 MS SQL识别符是[],[type]表示他区别于关键字,但是MySQL却是 `,也就是按键1左边的那个符号
7 MS SQL支持getdate()方法获取当前时间日期,但是MySQL里面可以分日期类型和时间类型,获取当前日期是cur_date(),当前完整时间是 now()函数
8 MS SQL不支持replace into 语句,但是在最新的sql20008里面,也支持merge语法
9 MySQL支持insert into table1 set t1 = ‘’, t2 = ‘’ ,但是MS SQL不支持这样写
10 MySQL支持insert into tabl1 values (1,1), (1,1), (1,1), (1,1), (1,1), (1,1), (1,1)
11 MS SQL不支持limit语句,是非常遗憾的,只能用top 取代limt 0,N,row_number() over()函数取代limit N,M
12 MySQL在创建表时要为每个表指定一个存储引擎类型,而MS SQL只支持一种存储引擎
13 MySQL不支持默认值为当前时间的datetime类型(MS SQL很容易做到),在MySQL里面是用timestamp类型
14 MS SQL里面检查是否有这个表再删除,需要这样:
if exists (select * from dbo.sysobjects
where id = object_id(N'uc_newpm') and OBJECTPROPERTY(id,N'IsUserTable')=1)
但是在MySQL里面只需要 DROP TABLE IF EXISTS cdb_forums;
15 MySQL支持无符号型的整数,那么比不支持无符号型的MS SQL就能多出一倍的最大数存储
16 MySQL不支持在MS SQL里面使用非常方便的varchar(max)类型,这个类型在MS SQL里面既可做一般数据存储,也可以做blob数据存储
17 MySQL创建非聚集索引只需要在创建表的时候指定为key就行,比如:KEY displayorder (fid,displayorder) 在MS SQL里面必须要:
create unique nonclustered index
index_uc_protectedmembers_username_appid on dbo.uc_protectedmembers
(username asc,appid asc)
18 MySQL text字段类型不允许有默认值
19MySQL的一个表的总共字段长度不超过65XXX。
20一个很表面的区别就是MySQL的安装特别简单,而且文件大小才110M(非安装版),相比微软这个庞然大物,安装进度来说简直就是.....
21MySQL的管理工具有几个比较好的,MySQL_front,和官方那个套件,不过都没有SSMS的使用方便,这是MySQL很大的一个缺点。
22MySQL的存储过程只是出现在最新的版本中,稳定性和性能可能不如MS SQL。
23 同样的负载压力,MySQL要消耗更少的CPU和内存,MS SQL的确是很耗资源。
24php连接MySQL和MS SQL的方式都差不多,只需要将函数的MySQL替换成MS SQL即可。
25MySQL支持date,time,year类型,MS SQL到2008才支持date和time。
参考资料:Mysql与Sql server在语法和关键字上的区别 http://blog.youkuaiyun.com/hust_yh/article/details/6312544
(1) mysql的ifnull()函数对应sql的isnull()函数;
(2) mysql的存储过程中变量的定义去掉@;
(3) mysql的每句结束要用";"
(4) SQLServer存储过程的AS在MySql中需要用begin .....end替换
(5) 字符窜连接用concat()函数;
如 SQLServer: Temp=’select * from ’+’tablename’+…+…
MySql:Temp=concat(’select * from’, ’tablecname’,…,…)
(6) mysql的uuid()对应sql的GUID();
(7) MySql的out对应SQLServer的output,且mysql 的out要放在变量的前面,SQLServer的output放在变量后面
MySql out,in,inout的区别——
MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,对调用者(caller)来说是不可见的(not visible)。
MySQL 存储过程 “out” 参数:从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值。
MySQL 存储过程 inout 参数跟 out 类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 inout 参数传递值给存储过程。
(8) MySQL的if语句为
if (条件) then
end if;
或者
If (条件) then
Else
End if
或者
If(条件)then
Elseif (注意不能写成 Else if )
Elseif
…
End if
(9) Mysql的Execute对应SqlServer的exec;
(注意:必须想下面这样调用)
Set @cnt=’select * from 表名’;
Prepare str from @cnt;
Execute str;
(10)MySql存储过程调用其他存储过程用call
Call 函数名(即SQLServer的存储过程名)(’参数1’,’参数2’,……)
(11) mysql的日期
1获得当前日期函数:curdate(),current_date()
2获得当前时间函数:curtime();
3获得当前日期+时间:now();
4MySQL dayof... 函数:dayofweek(), dayofmonth(), dayofyear()分别返回日期参数,在一周、一月、一年中的位置。
(注:周日=1,周一=2,周二=3,……)
5返回本月的天数:select day(last_day(now()));
6MySQL 为日期增加一个时间间隔:date_add()
select date_add(CURRENT_DATE(),interval ‘要增加的天数’ day) as Fdate
7MySQL 为日期减去一个时间间隔:date_sub()
select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);
8MySQL 日期、时间相减函数:datediff(date1,date2), timediff(time1,time2)
9MySQL 拼凑日期、时间函数:makdedate(year,dayofyear), maketime(hour,minute,second)
例:select makedate(2001,31); -- '2001-01-31'
select makedate(2001,32); -- '2001-02-01'
10本周时间(起始)
select date_sub(CURRENT_DATE(),interval dayofweek(curdate())-2 day) as Fdate
11本周时间(结束)
select date_add(CURRENT_DATE(),interval dayofweek(curdate())+3 day) as Fdate
12上周时间(起始)
select date_sub(CURRENT_DATE(),interval dayofweek(curdate())+5 day) as Fdate
13上周时间(结束)
select date_sub(CURRENT_DATE(),interval dayofweek(curdate())-1 day) as Fdate
14本月时间(起始)
select DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY) as Fdate
15本月时间(结束)
Select date_add(current_date(),interval day(last_day(CURDATE())) -day(CURDATE()) day) as Fdate
16上月时间(起始)
select DATE_SUB(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE()) DAY),interval day(last_day(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE()) DAY)))-1 day) as Fdate
17上月时间(结束)
select DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE()) DAY) as Fdate
18今年时间(起始)
select makedate(year(curdate()),1) as FDate
19今年时间(结束)
select DATE_SUB(makedate(year(curdate())+1,1) ,INTERVAL 1 day) as Fdate
20去年时间(起始)
select makedate(year(curdate())-1,1) as Fdate
21去年时间(结束)
select DATE_SUB(makedate(year(curdate()),1) ,INTERVAL 1 day) as FDate
22DATE_FORMAT(date,format):根据format字符串格式化date值。下列修饰符可以被用在format字符串中
%M 月名字(January……December)
%W 星期名字(Sunday……Saturday)
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)
%Y 年, 数字, 4 位
%y 年, 数字, 2 位
%a 缩写的星期名字(Sun……Sat)
%d 月份中的天数, 数字(00……31)
%e 月份中的天数, 数字(0……31)
%m 月, 数字(01……12)
%c 月, 数字(1……12)
%b 缩写的月份名字(Jan……Dec)
%j 一年中的天数(001……366)
%H 小时(00……23)
%k 小时(0……23)
%h 小时(01……12)
%I 小时(01……12)
%l 小时(1……12)
%i 分钟, 数字(00……59)
%r 时间,12 小时(hh:mm:ss [AP]M)
%T 时间,24 小时(hh:mm:ss)
%S 秒(00……59)
%s 秒(00……59)
%p AM或PM
%w 一个星期中的天数(0=Sunday ……6=Saturday )
%U 星期(0……52), 这里星期天是星期的第一天
%u 星期(0……52), 这里星期一是星期的第一天
%% 一个文字“%”。
例:所有的其他字符不做解释被复制到结果中。
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
->'Saturday October 1997'
mysql>select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql>select DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j');
->'4th 97 Sat 04 10 Oct 277'
mysql>select DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w');
->'22 22 10 10:23:00 PM 22:23:00 00 6'
(12) MySql存储过程中没有return函数,在MySql中可以用循环和out参数代替
If EXISTS(SELECT * FROM T_Chance WHERE FCustID=CostomerID) return 0
改写为:
(在参数中定义一个out变量:out temp varchar(100);)
BEGIN
Loop1:loop
SELECT count(*) FROM T_Chance WHERE FCustID=CostomerID int @cnt
If @cnt>0 then
begin
set temp=0;
leave loop1;
end;
end if
end loop loop1;
(13) select @a=count(*) from VW_Action 在mySql中修改为:select count(*) from VW_Action into @a;
(14)MySQL中没有top关键字,需要用limit代替且放在后面
注意,在MySQL中的limit不能放在子查询内,limit不同与SQLServer,它可以规定范围 limit a,b——范围a-b
SQL SERVER : select top 8 * from table1
MYSQL: select * from table1 limit 5;
(15)即使存储过程没有参数也要写括号“()”
(16) 当一个存储过程中有创建临时表时
create procedure up_test
()
begin
drop table if exists tb1;
create TEMPORARY table tb1//注意添加TEMPORARY table
(
id int,
name varchar(20)
);//注意最后加分号
insert tb1 values('1','jim');
select * from tb1;
end
(17) 建表中自增长问题:
create table user
(
Id varchar(10) primary key auto_increment not null,
Name varchar(20) not null,
Password varchar(20),
create_date datetime
);
auto_increment 自增长
(18) "Unable to convert MySQL date/time value to System.DateTime"这是因为在日期列中有"0000-00-00"数据值,要修正这个问题,你可以把这些数据设为null,或者在连接字符串中设置"Allow Zero Datetime=True" 。
(19) MySQL视图的FROM子句不允许存在子查询,因此对于SQL Server中FROM子句带有子查询的视图,需要手工进行迁移。可通过消除FROM子句中的子查询,或将FROM子句中的子查询重构为一个新的视图来进行迁移。
参考资料:mysql与sqlserver的区别
http://zhidao.baidu.com/link?url=x5phhrjnFa46mYhQRVmIFBuxCpmTyICeQ5IoRCLkAkj3b1H3E1aMMYZywErruVvuL42bw1qJNQ8Kl1evZ_c29a
对于程序开发人员而言,目前使用最流行的两种后台数据库即为MySQL and SQL Server。这两者最基本的相似之处在于数据存储和属于查询系统。你可以使用SQL来访问这两种数据库的数据,因为它们都支持ANSI-SQL。还有,这两种数据库系统都支持二进制关键词和关键索引,这就大大地加快了查询速度。同时,二者也都提供支持XML的各种格式。除了在显而易见的软件价格上的区别之外,这两个产品还有什么明显的区别吗?在这二者之间你是如何选择的?让我们看看这两个产品的主要的不同之处,包括发行费用,性能以及它们的安全性。
根本的区别是它们遵循的基本原则
二者所遵循的基本原则是它们的主要区别:开放vs保守。SQL服务器的狭隘的,保守的存储引擎与MySQL服务器的可扩展,开放的存储引擎绝然不同。虽然你可以使用SQL服务器的Sybase引擎,但MySQL能够提供更多种的选择,如MyISAM, Heap, InnoDB, and Berkeley DB。MySQL不完全支持陌生的关键词,所以它比SQL服务器要少一些相关的数据库。同时,MySQL也缺乏一些存储程序的功能,比如MyISAM引擎联支持交换功能。
发行费用:MySQL不全是免费,但很便宜
当提及发行的费用,这两个产品采用两种绝然不同的决策。对于SQL服务器,获取一个免费的开发费用最常的方式是购买微软的Office或者Visual Studio的费用。但是,如果你想用于商业产品的开发,你必须还要购买SQL Server Standard Edition。学校或非赢利的企业可以不考虑这一附加的费用。
性能:先进的MySQL
纯粹就性能而言,MySQL是相当出色的,因为它包含一个缺省桌面格式MyISAM。MyISAM 数据库与磁盘非常地兼容而不占用过多的CPU和内存。MySQL可以运行于Windows系统而不会发生冲突,在UNIX或类似UNIX系统上运行则更好。你还可以通过使用64位处理器来获取额外的一些性能。因为MySQL在内部里很多时候都使用64位的整数处理。Yahoo!商业网站就使用MySQL 作为后台数据库。
当提及软件的性能,SQL服务器的稳定性要比它的竞争对手强很多。但是,这些特性也要付出代价的。比如,必须增加额外复杂操作,磁盘存储,内存损耗等等。如果你的硬件和软件不能充分支持SQL服务器,我建议你最好选择其他如DBMS数据库,因为这样你会得到更好的结果。
安全功能
MySQL有一个用于改变数据的二进制日志。因为它是二进制,这一日志能够快速地从主机上复制数据到客户机上。即使服务器崩溃,这一二进制日志也会保持完整,而且复制的部分也不会受到损坏。
在SQL服务器中,你也可以记录SQL的有关查询,但这需要付出很高的代价。
安全性
这两个产品都有自己完整的安全机制。只要你遵循这些安全机制,一般程序都不会出现什么问题。这两者都使用缺省的IP端口,但是有时候很不幸,这些IP也会被一些黑客闯入。当然,你也可以自己设置这些IP端口。
恢复性:先进的SQL服务器
恢复性也是MySQL的一个特点,这主要表现在MyISAM配置中。这种方式有它固有的缺欠,如果你不慎损坏数据库,结果可能会导致所有的数据丢失。然而,对于SQL服务器而言就表现得很稳键。SQL服务器能够时刻监测数据交换点并能够把数据库损坏的过程保存下来。
根据需要决定你的选择
对于这两种数据库,如果非要让我说出到底哪一种更加出色,也许我会让你失望。以我的观点,任一对你的工作有帮助的数据库都是很好的数据库,没有哪一个数据库是绝对的出色,也没有哪一个数据库是绝对的差劲。我想要告诉你的是你应该多从你自己的需要出发,即你要完成什么样的任务?而不要单纯地从软件的功能出发。
如果你想建立一个.NET服务器体系,这一体系可以从多个不同平台访问数据,参与数据库的管理,那么你可以选用SQL服务器。如果你想建立一个第三方站点,这一站点可以从一些客户端读取数据,那么MySQL将是最好的选择。
这两者数据库都能够在.NET或J2EE下运行正常,同样,都能够利用RAID。
1,优点分析:MYSQL短小精悍,容易上手,操作简单,免费供用的。相对其它数据库有特色又实用的语法多一些。SQL怎么也算是大型数据库,稳定,能做一般大系统的数据仓库,运行速度明显比MYSQL快N多(海量数据下这个优势显而易见)。
2,缺点分析:MYSQL难担当大系统的数据仓库,运行速度慢,不够稳定,有掉线的情况。SQL SERVER价格贵(当然没说5元盗版),使用起来比MYSQL要难一些,毕竟东西大了说道多点。
3,按你的补充(如何登录):MySQL自己有文字界面客户端,用起来咋说也没鼠标点方便(不过习惯了也好),当然配对MYSQL有专业的客户端软件,我是用SQLYOG519版的,各种操作真的是很方便的说。SQL SERVER 就用自带的查询分析器登录了:) 两者的前提是数据库服务都带打开,而且你得知道安装时的用户名密码哦:)
SQL-Server 2000 是微软公司开发的中型数据库,它的可视化方面做得很好,在安全性等方面功能非常强大,并且有微软的强大技术支持,当然价格比较昂贵,适合应用于中型系统。
MySQL是 MySQL·AB开发的小型数据库,基本上具有了数据库所需的所有功能,但是功能没有SQL-Server强大,技术支持也跟不上,但是价格便宜,在满足它的许可协议的情况下可以免费使用,适合于小型系统。
语言都是一样的(SQL)是结构化查询语言.