mysql里面提供了很多方法来获取表结构和表列:如下方法
获得某表所有列的信息:
String sql = select * from tname;//tname为某一表名
Connection conn = ....;
Statement st = conn.createStatement();
ResultSet rs = st.rs = st.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int colcount = rsmd.getColumnCount();//取得全部列数
for(int i=0;icolcount;i++){
String colname = rsmd.getColumnName(i);//取得全部列名
}
以上为某表字段具体查询,如果是查询表的信息,如在mysql服务器上那样的查询结果的话,可以用一下代码:
ResultSet.executeQuery("show tables")可以的到所有的表信息.
ResultSet.executeQuery("describe tname")可以得到表的字段信息.//tname为表名
楼主,其实写法清晰一点很容易理解
第1个方法,返回的是ListListObject的数据,即返回一个二维表格
①.:使用SHOW语句找出在服务器上当前存在什么数据库:
mysql SHOW DATABASES;
mysql CREATE DATABASE MYSQLDATA;
mysql USE MYSQLDATA; (按回车键出现Database changed 时说明操作成功!)
mysql SHOW TABLES;
mysql DESCRIBE MYTABLE;
mysql insert into MYTABLE values ("hyq","M");
mysql LOAD DATA LOCAL INFILE "D:/mysql.txt" INTO TABLE MYTABLE;
mysqluse database;
mysqlsource d:/mysql.sql;
①.0:删除表
mysqldrop TABLE MYTABLE;
①.1:清空表
mysqldelete from MYTABLE;
mysqlupdate MYTABLE set sex="f" where name='hyq';
以下是无意中在网络看到的使用MySql的管理心得,
在windows中MySql以服务形式存在,在使用前应确保此服务已经启动,未启动可用net start mysql命令启动.而Linux中启动时可用"/etc/rc.d/init.d/mysqld start"命令,注意启动者应具有管理员权限.
刚安装好的MySql包含一个含空密码的root帐户和一个匿名帐户,这是很大的安全隐患,对于一些重要的应用我们应将安全性尽可能提高,今天这一节应把匿名帐户删除、 root帐户设置密码,可用如下命令进行:
use mysql;
delete from User where User="";
update User set Password=PASSWORD('newpassword') where User='root';
如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host字段,在进行了以上更改后应重新启动数据库服务,此时登录时可用如下类似命令:
mysql -uroot -p;
mysql -uroot -pnewpassword;
mysql mydb -uroot -p;
mysql mydb -uroot -pnewpassword;
上面命令参数是常用参数的一部分,详细情况可参考文档.此处的mydb是要登录的数据库的名称.
在 进行开发和实际应用中,用户不应该只用root用户进行连接数据库,虽然使用root用户进行测试时很方便,但会给系统带来重大安全隐患,也不利于管理技 术的提高.我们给一个应用中使用的用户赋予最恰当的数据库权限.如一个只进行数据插入的用户不应赋予其删除数据的权限.MySql的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户.其中GRANT的常用用法如下:
若 要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项.而对于用插入User表添加的用户,Password字段应用PASSWORD 函数进行更新加密,以防不轨之人窃看密码.对于那些已经不用的用户应给予清除,权限过界的用户应及时回收权限,回收权限可以通过更新User表相应字段, 也可以使用REVOKE操作.
下面给出本人从其它资料()获得的对常用权限的解释:
全局管理权限:
FILE: 在MySQL服务器上读写文件.
PROCESS: 显示或杀死属于其它用户的服务线程.
RELOAD: 重载访问控制表,刷新日志等.
SHUTDOWN: 关闭MySQL服务.
数据库/数据表/数据列权限:
ALTER: 修改已存在的数据表(例如增加/删除列)和索引.
CREATE: 建立新的数据库或数据表.
DELETE: 删除表的记录.
DROP: 删除数据表或数据库.
INDEX: 建立或删除索引.
INSERT: 增加表的记录.
SELECT: 显示/搜索表的记录.
UPDATE: 修改表中已存在的记录.
特别的权限:
ALL: 允许做任何事(和root一样).
USAGE: 只允许登录–其它什么也不允许做.
第一段: 简单查询
简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句.它们分别说明所查询列、查询的
表或视图、以及搜索条件等.
例如,下面的语句查询testtable表中姓名为"张三"的nickname字段和email字段.
复制内容到剪贴板
代码:SELECT +nickname+,+email+FROM +testtable+WHERE +name+='张三'
(一) 选择列表
选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成.
①.、选择所有列
例如,下面语句显示testtable表中所有列的数据:
代码:SELECT * FROM testtable
查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同.
例如:
代码:SELECT nickname,email FROM testtable
在选择列表中,可重新指定列标题.定义格式为:
列标题=列名
列名 列标题
如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列
标题:
代码:SELECT 昵称=nickname,电子邮件=email FROM testtable
SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认
为ALL.使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行.
使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是
表示一百分数,指定返回的行数等于总行数的百分之几.
(二) FROM子句
它们之间用逗号分隔.
在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.cityidSELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据.
代码: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子句设置查询条件
比较运算符(大小比较):、=、=、、!、!=10 AND age复制内容到剪贴板
代码: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语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序.例如:
第三段:连接查询
通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志.
在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在
一个表中.当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息.连接操作给用户带
来很大的灵活性,他们可以在任何时候增加新的数据类型.为不同实体创建新的表,尔后通过连接进行
查询.
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于
将连接操作与WHERE子句中的搜索条件区分开来.所以,在Transact-SQL中推荐使用这种方法.
代码: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 *
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
ON a.city=p.city
(二)外连接内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件
的行.而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行.
代码:SELECT a.*,b.* FROM +luntan+ LEFT JOIN usertable as b
代码:SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
(三)交叉连接
交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数
据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数.
代码:SELECT +type+,+pub_name+
FROM +titles+ CROSS JOIN +publishers+
ORDER BY +type+
import?java.sql.Connection;?
import?java.sql.DriverManager;?
import?java.sql.ResultSet;?
import?java.sql.ResultSetMetaData;?
import?java.sql.Statement;?
import?java.util.Hashtable;?
public?class?GetDBFiled?{?
public?static?void?conn()?{?
String?driver?=?"com.mysql.jdbc.Driver";?
String?user?=?"root";?
String?password?=?"密码";?
try?{?
Class.forName(driver);?
Connection?conn?=?DriverManager.getConnection(url,?user,?password);?
if?(!conn.isClosed())?{?
String?sql?=?"select?*?from?pic";?
System.out.println("Succeeded?connecting?to?the?Database!");?
Statement?statement?=conn.createStatement();?
ResultSet?rs?=?statement.executeQuery(sql);?
if?(rs.next())?{?
//?得到ResultSetMetaData?
ResultSetMetaData?rsmd?=?rs.getMetaData();?
System.out.println(rsmd.getColumnCount());?
for?(int?i?=?1;?i?=?rsmd.getColumnCount();?i++)?{?
Hashtable?hst?=?new?Hashtable();?
//?把字段名放入Name?
String?name?=?String.valueOf(rsmd.getColumnLabel(i));?
hst.put("Name",?name);?
//?把字段类型放入Type?
String?type?=?String.valueOf(rsmd.getColumnType(i));?
hst.put("Type",?type);?
System.out.println(hst.get("Name")+"?"+hst.get("Type"));?
}?
}?catch?(Exception?e)?{?
System.out.println("出现异常");?
其实我也没有啥好办法,我甚至推荐你使用楼上说的方法,直接select * 将数据全部查出后,在service中用java处理数据更加方便.
如果要强行使用sql查出来,我这里写了这么一段:
首先因为是同一张表,根据不同条件将结果拼接在一起,我能想到的就是用left join,我按照不同条件将数据分成如下几段:
a段:姓名段,作为left join的主表,只有姓名;
b段:吃了早餐段;
c段:没吃早餐段;
d段:吃了晚餐段;
e段:没吃晚餐段;
f段:吃了饭段;
g段:没吃饭段.
除了a段以外,其他段都是根据自身条件
SELECT
name,
count(*) ? ?count,
sum(weight) sum,
然后依次左连接将所有段通过姓名连接到一起,最终组成的sql语句如下:
a.name 姓名,
ifnull(b.count, 0) 吃了早餐的次数,
ifnull(b.sum, 0) ? 吃了早餐的重量,
ifnull(c.count, 0) 没吃早餐的次数,
ifnull(c.sum, 0) ? 没吃早餐的重量,
ifnull(d.count, 0) 吃了晚餐的次数,
ifnull(d.sum, 0) ? 吃了晚餐的重量,
ifnull(e.count, 0) 没吃晚餐的次数,
ifnull(e.sum, 0) ? 没吃晚餐的重量,
ifnull(f.count, 0) 吃了饭的次数,
ifnull(f.sum, 0) ? 吃了饭的重量,
ifnull(g.count, 0) 没吃饭的次数,
ifnull(g.sum, 0) ? 没吃饭的重量
FROM
(SELECT DISTINCT name
FROM T) a LEFT JOIN
(SELECT
sum(weight) sum
FROM T
WHERE type = 0 AND status = 0
GROUP BY name) b ON a.name = b.name
LEFT JOIN
WHERE type = 0 AND status = 1
GROUP BY name) c ON a.name = c.name
WHERE type = 1 AND status = 0
GROUP BY name) d ON a.name = d.name
WHERE type = 1 AND status = 1
GROUP BY name) e ON a.name = e.name
WHERE status = 0
GROUP BY name) f ON a.name = f.name
WHERE status = 1
GROUP BY name) g ON a.name = g.name
T表结构为:
(因为以name字段进行连接,type和status作为条件,建议以该三个字段作为索引)
T表测试数据为:
运行结果为: