mysql mm模式_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 (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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值