mysql 基本操作
1.登录:
直接在cmd中输入:mysql回车的话会出现如下错误:
ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using pas 这个时候登录时应该这样输入:mysql -u root -p回车,然后就会提示你输入密码,之后输入密码后就进入了mysql了
2.mysql的常见数据类型和分类
mysql的数据类型如表所示:
| 列类型 | 说明 |
|
tinyint/smallintlmediumint int(integer)/ bigint |
1字节//2字节/3字节/4字节/8字节整数,又可分有符号和无符号两种。这些整数类型的区别,仅仅表数范围不同 |
| float/double | 单精度、双精度浮点类型 |
| decimal(dec) | 精确小数类型,相对于float和double不会产生精度丢失的问题 |
| date | 日期类型,不能保存时间。当把Java里的Date对象保存进date列时,时间部分将会丢失 |
| time | 时间类型,不能保存日期。当把Java里的Date对象保存进time列时,日期部分将会丢失 |
| datetime | 日期、时间类型 |
| timestamp | 时间戳类型 |
| year | 年类型,仅仅保存时间的年份 |
| char | 定长字符串类型 |
| varchar | 可变长度字符串类型 |
| binary | 定长二进制字符串类型,它以二进制形式保存字符串 |
| varbinary | 可变成长度的二进制字符串类型,它以二进制形式保存字符串 |
|
tinyblob/blob mediumblob/longblob |
1字节/2字节/3字节/4字节的二进制大对象,可用于存储图片、音乐等二进制数据,分别可存储:255/64K/16Ml4G的大小 |
|
tinytext/text mediumtext/longtext |
1字节/2字节//3字节/4字节的文本对象,可用于存储超长长度的字符串,分别可存储: 255/64K/16M/4G大小的文本 |
| enum('value 1','value2',...) | 枚举类型,该列的值只能是enum后括号里多个值的其中之一 |
| set('valuel','value2',...) | 集合类型,该列的值可以是set后括号里多个值的其中几个 |
标准sql语句通常分为如下几类:
》查询语句:主要由于select关键字完成,查询语句是SQL语句中最复杂,功能也最丰富的语句。
》DML语句(Data Manipulation Language,即数据操作语言):主要由insert, update和delete 三个关键字完成。 》DDL语句(Data Definition Language,即数据定义语言):主要由create, alter, drop和 truncate四个关键字完成。 》DCL语句(Data Controll Language,即数据控制语言):主要由grant和revoke两个关键 字完成。(为用户授权,一般用不到) 》事务控制语句:主要由commit, rollback和savepoint三个关键字完成。
3.创建数据库:
创建数据库操作语句如下:
show databases; 查看当前包含的所有数据库 create database (if not exists) mydb1; 创建一个名称为mydb1的数据库。 drop database mydb1; 删除制定的数据库 创建一个使用utf-8字符集的mydb2数据库。 create database mydb2 character set utf8; show create database mydb2; 查看创建数据库的细节 创建一个使用utf-8字符集,并带校对规则的mydb3数据库。 create database mydb3 character set utf8 collate utf8_general_ci; use mydb1; 进入库 show tables; 查询数据库下包含多少表 desc xxx; 查看指定表的表结构(该表有多少列,每列的数据类型)
补充:如果想重命名一个数据库的话,参照http://www.weste.net/2013/3-26/89895.html,有5中方法,感觉第3个方法挺好的,如下:
重命名所有的表:create database new_db_name;
rename table db_name.table1 to new_db_name.table1,
db_name.table2 TO new_db_name.table2;
drop database db_name;
4.创建表:
建表格式如下所示:
create table [模式名].表名(
columnName1 datatype [default value],
)
建立数据表只是建立表结构,就是指定该数据表有多少列,每列的数据类型,所以建表语句的重点就是圆括号里的列定义,列定义由列名、列类型和可选的默认值组成。列名,列定义都好说,单可选的默认值就有一点。。看下面一段就明白了:
test name varchar(255) default 'xxx',
4.1.第一种创建表方法
下面创建一个员工表:
create table employee( eid int, name varchar(10), sex varchar(2), job varchar(10), birthday date, salary double, entry_date date, resume text ); 但是上面创建的是一个空表。 desc employee; 查看已创建表的表结构:(describe) rename table mydb1 to mydb2; 重命名表:
4.2.第二种创建表方法
子查询建表方法: 举例:(eid,name,salary) 扩展:通过子查询创建表 create table employee1 as select eid,name,salary from employee;
5.修改表结构:
修改表使用alter table,修改表包括增加列定义、修改列定义、删除列、重命名列等操作。
alter table employee add (image blob); 在上面员工表的基本上增加一个image列。 alter table employee add column sex varchar(2) after name;(注:这个column可加可不加) 在name后面添加一个sex: alter table employee modify job varchar(60); 修改job列,使其长度为60。 alter table employee drop sex; 删除sex列。 rename table employee to user; 表名改为user。 alter table user character set utf8; 修改表的字符集为utf-8 alter table user change column name username varchar(20); 列名name修改为username 将已经存在表设置自动增长属性 alter table customers change id id int not null auto_increment primary key; (注:其中为什么会有2个id不明白) insert into employee(id,name,sex,job,birthday,salary,entry_date,resume) values(1,'Tom','M','Engineer','1998-01-12',5000,'2011-08-02',null); 使用insert语句向表中插入三个员工的信息。 如果values中值包含表的所有列,前面的列名可以不写 insert into employee values(2,'Mary','F','Manager','1998-12-03',7000,'2011-08-02',null); insert into employee values(3,'李四','男','工程师','1998-12-03',7000,'2011-08-02',null); show variables like 'character%'; 查看字符集设置 set character_set_client=gb2312; set character_set_results=gb2312; 注意:只在当前会话中有效.
问题:'1998-12-03' ---》'03-12-1998' insert into employee values(4,'Mary11','F','Manager','03/12/1998',7000,'2011-08-02',null); Oracle关于日期的格式问题?
下面是更新数据操作:
更新数据使用update关键字:
update employee set salary=5000; 将所有员工薪水修改为5000元。 update employee set salary=3000 where name='Tom'; 将姓名为Tom的员工薪水修改为3000元。 update employee set salary=4000,job='ccc' where name='Mary'; 将姓名为’Mary’的员工薪水修改为4000元,job改为ccc。 update employee set salary=salary+1000 where name='Tom'; 将Tom的薪水在原有基础上增加1000元。(算术表达式)
下面是删除数据操作:
delete from employee where name='Tom'; 删除表中名称为’Tom’的记录。 delete from employee; 删除表中所有记录。 清空表: 1. delete from tablename; 2. truncate table tablename;(摧毁表,再重建) 使用truncate删除表中记录。
6.查询表
查询表使用select关键字操作
6.1. 基本查询:
select * from student; 查询表中所有学生的信息。
select id,name,chinese,english,math,deptname from student;
二者的区别:性能上,下面的好。(Oracle 9i版本后,可以认为二者没有区别)
select name,english from student; 查询表中所有学生的姓名和对应的英语成绩。
select distinct deptname from student; 过滤表中重复系名数据。
扩展:
select distinct math,deptname from student;
distinct后面跟多列:只有所有列均相同时,才认为是重复记录。
6.2. 含算术表达式的查询:
select name,english,english+10 from student; 显示所有学生英语分数上加10分特长分。 select name,chinese+english+math from student; 统计每个学生的总分。 使用别名: 1. 使用as关键字: select name as "姓名", chinese+english+math as "总分" from student; 2. 省略as: select name "姓名", chinese+english+math "总分" from student; 3. 双引号可以省略: select name 姓名, chinese+english+math 总分 from student; 问题:省略双引号和不省略的区别? 有双引号的,可以空格和特殊字符: select name "姓 名", chinese+english+math "总 分" from student; 使用别名表示学生分数 select name 姓名, chinese 语文成绩, english 英语成绩, math 数学成绩 from student;
6.3. 使用where子句过滤的结果集:
查询姓名为“王五”的学生成绩 select * from student where name='王五'; 子查询:分行和缩进 查询英语成绩大于90分的同学 select * from student where english>90; 查询总分大于200分的所有同学 select * from student where chinese+math+english>200;
6.4.比较运算符:
between 200 and 300 == >=200 and <=300 in('计算机系','电子系') == '计算机系' or '电子系' 查询英语分数在 80-90之间的同学。 select * from student where english >=80 and english <=90; select * from student where english between 80 and 90; 问题:select * from student where english between 90 and 80; 可不可以? 查询数学分数为89,90,91的同学。 select * from student where math=89 or math=90 or math=91; select * from student where math in (89,90,91); 查询所有姓李的学生成绩(模糊查询) %: 任意长度和任意字符串 _: 一位,并且该位上的字符任意 select * from student where name like '李%'; 查询所有名字是两个字的学生成绩 select * from student where name like '__'; 问题: insert into student(id,name,chinese,english,math) values(8,'Tom_123',89,90,78); 查询名字中含有下划线的学生成绩. select * from student where name like '%_%'; 查询数学分>80,语文分>80的同学 select * from student where math>80 and chinese>80; 查询系名为空的学生信息 select * from student where deptname = null; select * from student where deptname is null; 关于空值: 1. SQL中, null!=null 2. SQL中,如果一个表达式中含有null,则整个表达式为null(Solution:使用滤空函数)
7.约束
前面没有提到约束,实际上约束在mysql中低位是非常重要的,约束主要用于保证数据库里数据的完整性。除此之外,当表中数据存在相互赖性时,可以保护相关的数据不被删除
mysql支持下面5中约束:
》NOT NULL:非空约束,指定某列不能为空。 》UNIQUE:唯一约束,指定某列或者几列组合不能重复。 》PRIMARY KEY:主键,指定该列的值可以唯一地标识该条记录。 》FOREIGN KEY:外键,指定该行记录从属于主表中的一条记录,主要用于保证参照完整性。 》CHECK:检查,指定一个布尔表达式,用于指定对应列的值必须满足该表达式。这一项在mysql中基本上不起作用
约束内容比较多,关于约束的详细信息可以参看李阳的《疯狂java讲义》中p609也开始将的内容。
8.jdbc 连接数据库
1.有如下代码用于连接数据库并获取查询结果,可以直接使用:
public class Test { //private static final String url = "jdbc:mysql://localhost:3306/world"; private static final String url = "jdbc:mysql://192.168.1.181:3306/world"; //private static final String url = "jdbc:mysql://127.0.0.1:3306/world"; private static final String RETRIEVE_ALL = "SELECT code, name, continent, " + "population FROM Country Limit 5"; /** * @param args */ public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //加载驱动 Class.forName("com.mysql.jdbc.Driver"); //获取数据库连接 Connection connection = DriverManager.getConnection(url, "root", "123456"); // 创建Statement对象 PreparedStatement stmt = connection.prepareStatement(RETRIEVE_ALL); //通过statement执行sql语句(只执行查询语句) ResultSet results = stmt.executeQuery(); System.out.printf("%-5s %-25s %-15s %12s\n", "code", "name", "continent", "population"); while (results.next()) { String code = results.getString(1); String name = results.getString(2); String continent = results.getString(3); int population = results.getInt(4); System.out.printf("%-5s %-25s %-15s %,12d\n", code, name, continent, population); } results.close(); stmt.close(); connection.close(); } }
8.1 myeclipse中连接数据库
在工程建立后,代码书写前,先要把mysql的jdbc驱动添加的build path中,这个就不在叙述。
下面一些代码是我测试连接mysql使用的,最后连接成功,sql的操作类ConnMysql.java如下:
package com.zyf; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; public class ConnMysql { /** * @param args */ private static Connection cn = null; private void getConnection() { if (cn != null) { return; } /* Context ctx; try { ctx = new InitialContext(); DataSource ds = (DataSource) ctx .lookup("java:comp/env/jdbc/ConnectionPool"); cn = ds.getConnection(); } catch (NamingException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return; */ try { Class.forName("com.mysql.jdbc.Driver"); cn = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root", "123456"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public ResultSet executeQuery(String sql) { if (cn == null) getConnection(); try { return cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE).executeQuery(sql); } catch (SQLException e) { e.printStackTrace(); return null; } finally { } } public int executeUpdate(String sql) { if (cn == null) getConnection(); try { return cn.createStatement().executeUpdate(sql); } catch (SQLException e) { e.printStackTrace(); return -1; } finally { } } public void close() { try { cn.close(); } catch (SQLException e) { e.printStackTrace(); }finally{ cn = null; } } }
下面是测试类
package com.zyf; import java.sql.ResultSet; import java.sql.SQLException; public class ConnMysqlTest { /** * @param args * @throws SQLException */ public static void main(String[] args) throws SQLException { // TODO Auto-generated method stub String to="select * from city where name='zhangsan'"; ConnMysql cms= new ConnMysql(); ResultSet rs = cms.executeQuery(to); while (rs.next()) { int id = rs.getInt(1); String name = rs.getString(2); System.out.printf("%d %-25s\n", id, name); } } }
下面是测试结果
4080 zhangsan

浙公网安备 33010602011771号