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 (ifnot 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; 查看指定表的表结构(该表有多少列,每列的数据类型)
重命名所有的表: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(
eidint,
name varchar(10),
sex varchar(2),
job varchar(10),
birthday date,
salarydouble,
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-8alter table user change column name username varchar(20); 列名name修改为username
将已经存在表设置自动增长属性
alter table customers change id idint not nullauto_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+10from 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 <=300in('计算机系','电子系') == '计算机系' 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 isnull;
关于空值: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 classTest {//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";/***@paramargs*/
public static void main(String[] args) throwsException {//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如下:
packagecom.zyf;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;public classConnMysql {/***@paramargs*/
private static Connection cn = null;private voidgetConnection() {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();
}
}publicResultSet executeQuery(String sql) {if (cn == null)
getConnection();try{returncn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE).executeQuery(sql);
}catch(SQLException e) {
e.printStackTrace();return null;
}finally{
}
}public intexecuteUpdate(String sql) {if (cn == null)
getConnection();try{returncn.createStatement().executeUpdate(sql);
}catch(SQLException e) {
e.printStackTrace();return -1;
}finally{
}
}public voidclose() {try{
cn.close();
}catch(SQLException e) {
e.printStackTrace();
}finally{
cn= null;
}
}
}
下面是测试类
packagecom.zyf;importjava.sql.ResultSet;importjava.sql.SQLException;public classConnMysqlTest {/***@paramargs
*@throwsSQLException*/
public static void main(String[] args) throwsSQLException {//TODO Auto-generated method stub
String to="select * from city where name='zhangsan'";
ConnMysql cms= newConnMysql();
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