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   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2014-02-22 01:22  MMLoveMeMM  阅读(290)  评论(0)    收藏  举报