Mysql的常用用法
一、mysql中limit的用法详解[数据分页常用]
在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。
![点击图片可在新窗口打开](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
![点击图片可在新窗口打开](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击图片可在新窗口打开](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击图片可在新窗口打开](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击图片可在新窗口打开](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击图片可在新窗口打开](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击图片可在新窗口打开](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击图片可在新窗口打开](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击图片可在新窗口打开](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
![点击图片可在新窗口打开](http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif)
1、MYSQL中SQL文件的编辑:
随便使用一种编辑器都可以编辑,保存的sql文件后缀为:.sql。sql中的内容参考下面例子,创建数据库 : job5db
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
DROP DATABASE IF EXISTS job5db; CREATE DATABASE job5db DEFAULT CHARACTER SET utf8; USE job5db; ##创建用户表 CREATE TABLE t_user ( user_id INT AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(30), password VARCHAR(32) )ENGINE=InnoDB; ##创建投票记录表 CREATE TABLE t_vote ( vote_id INT AUTO_INCREMENT PRIMARY KEY, vote_topic VARCHAR(30), vote_state VARCHAR(10), vote_max_can_select INT, vote_total_count INT, vote_total_option_count INT, create_time timestamp default now(), start_time datetime, end_time datetime )ENGINE=InnoDB; ##创建投票项表 CREATE TABLE t_option ( option_id INT AUTO_INCREMENT PRIMARY KEY, option_name INT, option_count VARCHAR(23), vote_id INT, foreign key(vote_id) references t_vote(vote_id) )ENGINE=InnoDB; ##插入初始化数据 INSERT INTO t_user (user_name,password) VALUES('admin','123456'); COMMIT;
2.从SQL文件中导入数据到MYSQL中:
1>首先,我们应该在cmd中进入mysql指令界面中,格式很简单 ,就是 mysql -u[用户名] -h[主机所在地址,默认不写是localhost] -p 然后输入密码即可
2>直接使用 source [所在的路径//*.sql] 将SQL文件进行导入,接下来就会输出一大串的Query OK之类的信息了。
3、MYSQL中将数据库导出成SQL文件:
其实很简单的,就是一条语句就可以了,首先我们打开cmd,不用进mysql指令界面,直接按照下列格式将导出语句敲进去,然后再输入密码即可了:
mysqldump -h[主机所在IP] -u[用户名] -p [要导出的数据库]>[导出的路径//[文件名].sql]
好吧,直接这样看可能有点抽象,我们来举个例子,目前我的MYSQL中有一个数据库bookinfodb,现在我要将它导出并且保存到D盘中。
这个时候我们再到D盘目录下,我们就可以看到多了一个test.sql文件了
三、Mysql获取表中最后一行记录的语句?
排序后取得第一条记录1 //方法一: 2 long key =-1L; 3 Statement statement = connection.createStatement(); 4 statement.executeUpdate(YOUR_SQL_HERE,Statement.RETURN_GENERATED_KEYS); 5 ResultSet rs = statement.getGeneratedKeys(); 6 if(rs !=null&& rs.next()){ 7 key = rs.getLong(1); 8 } 9 10 //方法二: 11 PreparedStatement ps = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); 12 statement.executeUpdate(); 13 ResultSet rs = statement.getGeneratedKeys(); 14 //方法三:下面这种可精确取得某个字段 15 PreparedStatement ps = con.prepareStatement(sql, new String[]{"USER_ID"})
四、MySQL级联删除和更新
下面,我们先创建以下测试用数据库表:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
CREATE TABLE `roottb` ( `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL, `data` VARCHAR(100) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) TYPE=InnoDB; CREATE TABLE `subtb` ( `id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL, `rootid` INT(11) UNSIGNED NOT NULL DEFAULT '0', `data` VARCHAR(100) NOT NULL DEFAULT '', PRIMARY KEY (`id`), INDEX (`rootid`), FOREIGN KEY (`rootid`) REFERENCES roottb(`id`) ON DELETE CASCADE ) TYPE=InnoDB;
注意:
1、必须使用InnoDB引擎;
2、外键必须建立索引(INDEX);
3、外键绑定关系这里使用了“ ON DELETE CASCADE”,意思是如果外键对应数据被删除,将关联数据完全删除,更多信息请参考MySQL手册中关于InnoDB的文档;
五、mysql update语句问题:You can't specify target table 'user' for update in FROM clause
原因是mysql不支持从选择的表再去修改,所以构造个临时表来解决问题
Error Code: 1093. You can't specify target table 'ws_product' for update in FROM clause
这个是我们在使用update或者delete语句时,在where条件里面加入的子查询导致的。例如如下的update语句:
update product set type = 'static' where id in (
select id from product where first_name ='superman'
);
修改上述语句为下面这样,该问题可以解决:
update ws_product set type = 'static' where id in (
select id form (
select id from ws_product where first_name ='superman'
) xx
);
注意,这样一定要给最里面的子查询定义一个别名,不然会报另外一个错误:
Error Code: 1248. Every derived table must have its own alias