[转帖]mysql基础专题——4.mysql数据库操作和SQL语言_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3791 | 回复: 0   主题: [转帖]mysql基础专题——4.mysql数据库操作和SQL语言        下一篇 
eink
注册用户
等级:上尉
经验:764
发帖:54
精华:0
注册:2012-11-13
状态:离线
发送短消息息给eink 加好友    发送短消息息给eink 发消息
发表于: IP:您无权察看 2012-11-15 11:25:30 | [全部帖] [楼主帖] 楼主

每一个Java开发者都是通过Hello World敲开面向对象世界的大门。但是在一开始,我们考虑的只是这个语言是什么样的,我们如何更好的编码,却很少有人关心他内部是怎么运行的。看下面一个简单的hello world。

package com.wordpress.kkarthikeyanblog;
public class HelloWorld {
      public static String HELLOWORLD = "Hello World";
      public void print() {
            System.out.println(HELLOWORLD);
      }
      public static void main(String[] args) {
            HelloWorld helloWorld = new HelloWorld();
            helloWorld.print();
      }
}


在使用javac工具编译了以上代码后,我使用下面的命令来运行这个程序。这时候JVM就启动了。

java com/wordpress/kkarthikeyanblog/HelloWorld


JVM的自述

Hey,Guys,我是JVM,让我来给大家说说我是如何运行这个程序的。

在一开始,BoostrapperClassLoader 加载java.lang.package这个包,我内部的System Class Loader通过给定的classpath找到类"HelloWorld"。在定位到HelloWorld.class后,我将得到这个二进制流。然后我从这个class文件中提取出了一下信息。

constants(例如文本、常数、类型、方法的符号引用)将被放到constant pool【在这个例子中包括HelloWorld class、方法、常量的符号】

包、修饰符、静态变量【在这个例子中,"HELLOWORLD"这个静态变量】

字段信息(名称、类型、修饰符)

方法信息(名称、返回值类型、方法参数、修饰符、方法的字节码)【在这个例子中是print、void、public和字节码】

ClassLoader的引用【装载这个类的classloader】

引用class的类

以上信息都被存在"Method Area"中。

在装载完毕以上信息后,我(JVM)试着找出"public static void main(String [] args)"方法。

我(JVM)中的每一个线程,除了共享"Method area"和"Heap Space"之外,他们还拥有自己的"stack"和"pc register"。

我(JVM)将从Method area中获取的main()方法信息压入栈(push),程序计数寄存器(pc register)将会告诉我下一步该干什么。

然后在程序计数器的指引下,我开始执行下面这行:

HelloWorld helloWorld = new HelloWorld();


我(JVM)将从constant pool中拿到HelloWorld的符号引用。然后查找Method area,获取到class信息,然后在Heap space中创建对象。

现在程序计数器将会指到

helloWorld.print();


我(JVM)将从我自己的线程的stack中取出变量"helloworld"的引用,并且找到print()方法。在从Method Area中得到字节码信息后,我将方法"print()"压栈(push),现在我将开始执行print()方法。

一旦print()方法执行结束,这个方法将出栈(pop up),将继续执行main()方法。一旦main()方法结束。main()方法将出栈,整个程序的执行也就结束了。

总结一下以上所说,在JVM中:

Method area-存放类信息

Heap Space-只存放对象

针对每一个线程来讲:

Stack-包含一个一个的栈帧【例如方法栈】-它也存放指定方法的局部变量

程序计数寄存器-指导下一步该执行什么。

另外,除了这些,还有一个"Garbage Collector"(垃圾回收器)来释放那些无用的对象。

���后,希望你看了此文能对JVM有更深一步的了解。

英文原文:http://kkarthikeyanblog.wordpress.com/2012/08/23/helloworld-in-jvms-view-how-java-program-executed-internally-in-jvm/

***************************************************************************************************

1,创建数据库,create datebase 数据库名,在这里kenan建立一个数据库名为myfirstdb

create database myfirstdb;


2,查看所有的数据库

show databases;


3,选择数据库,只有先选择数据库,才能在选择的数据库中进行数据库操作

use myfirstdb;


4,删除数据库

drop database myfirstdb;


数据库的增删改查 

这里要先使用 use来选择要操作的数据库

1,建立数据库表

use myfirstdb;
create table user(
id int auto_increment primary key,
username varchar(50) not null,
password varchar(50) not null,
createtime datetime,
)


这里创建了一个名为user 的表,id为int型的,auto_increatement表明这个是自增字段,primary key表明这个是主键,username varchar(50)表明userame是可变的字符长,not null表明该字段不能够为空,createtime datetime 字段cratetime是日期时间类型的。

2, 查看表结构

mysql> desc user;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| username   | varchar(50) | NO   |     | NULL    |                |
| password   | varchar(50) | NO   |     | NULL    |                |
| createtime | datetime    | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
mysql> show columns from user;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| username   | varchar(50) | NO   |     | NULL    |                |
| password   | varchar(50) | NO   |     | NULL    |                |
| createtime | datetime    | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)


在这里展示了两种查看表结构的方式

3,修改表结构

添加列

mysql> alter table user add age int;
Query OK, 0 rows affected (0.25 sec)
Records: 0  Duplicates: 0  Warnings: 0


修改列

mysql> alter table user modify username varchar(30);
Query OK, 0 rows affected (0.19 sec)
Records: 0  Duplicates: 0  Warnings: 0


注意关键词 modify

修改后的表结构

mysql> desc user;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| username   | varchar(30) | YES  |     | NULL    |                |
| password   | varchar(50) | NO   |     | NULL    |                |
| createtime | datetime    | YES  |     | NULL    |                |
| age        | int(11)     | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)


4,删除表

mysql> drop table user;
Query OK, 0 rows affected (0.03 sec)


5,插入数据

mysql> insert into user values(null,'kenan','kenan',now());
Query OK, 1 row affected (0.13 sec)


这里使用了日期函数,表示当前时间和日期,字符串要用单引号引起来

6,查询数据

mysql> select * from user;
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  1 | kenan    | kenan    | 2012-10-30 21:46:31 |
+----+----------+----------+---------------------+
1 row in set (0.00 sec)
mysql> select username,password from user;
+----------+----------+
| username | password |
+----------+----------+
| kenan    | kenan    |
+----------+----------+
1 row in set (0.00 sec)


第一句表示查询所有的字段从user表里边,在这里*表示所有,第二句表示单独查询username和password字段

6,带有where字句的条件查询

mysql> select * from user where id > 1;
mysql> select * from user where username = 'kenan';
mysql> select * from user where username = 'kenan' and id = 1;


这里分别进行了三个带有where字句的子查询,分别对id,和username进行限制,用and 连接两个限制条件

7,group by 对查询结果进行分组

mysql> select * from user;
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  1 | kenan    | kenan    | 2012-10-30 21:46:31 |
|  2 | lele     | lele     | 2012-10-31 15:01:20 |
|  3 | kenan    | lele     | 2012-10-31 15:06:46 |
+----+----------+----------+---------------------+
3 rows in set (0.00 sec)
mysql> select * from user group by username;
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  1 | kenan    | kenan    | 2012-10-30 21:46:31 |
|  2 | lele     | lele     | 2012-10-31 15:01:20 |
+----+----------+----------+---------------------+
2 rows in set (0.04 sec)
mysql> select username,avg(id) from user group by username;
+----------+---------+
| username | avg(id) |
+----------+---------+
| kenan    |  2.0000 |
| lele     |  2.0000 |
+----------+---------+
2 rows in set (0.04 sec)
mysql> select username,sum(id) from user group by username;
+----------+---------+
| username | sum(id) |
+----------+---------+
| kenan    |       4 |
| lele     |       2 |
+----------+---------+
2 rows in set (0.03 sec)


这里展示的group by的用法,首先第一句是按照username分组,所以 username相同的数据会认为是一组

只显示第一条数据,第二个sql语句和第三个sql语句用了两个分组函数avg(),sum()函数,这两个函数

呢,是跟group by 配合使用的,avg()是用来求这一组数据的平均值,而sum()是用来求这一组数据的

和。

8,order by 对结果进行排序

mysql> select * from user;
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  1 | kenan    | kenan    | 2012-10-30 21:46:31 |
|  2 | lele     | lele     | 2012-10-31 15:01:20 |
|  3 | kenan    | lele     | 2012-10-31 15:06:46 |
+----+----------+----------+---------------------+
3 rows in set (0.00 sec)
mysql> select * from user order by username;
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  1 | kenan    | kenan    | 2012-10-30 21:46:31 |
|  3 | kenan    | lele     | 2012-10-31 15:06:46 |
|  2 | lele     | lele     | 2012-10-31 15:01:20 |
+----+----------+----------+---------------------+
3 rows in set (0.00 sec)
mysql> select * from user order by id;
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  1 | kenan    | kenan    | 2012-10-30 21:46:31 |
|  2 | lele     | lele     | 2012-10-31 15:01:20 |
|  3 | kenan    | lele     | 2012-10-31 15:06:46 |
+----+----------+----------+---------------------+
3 rows in set (0.00 sec)
mysql> select * from user order by id desc
-> ;
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  3 | kenan    | lele     | 2012-10-31 15:06:46 |
|  2 | lele     | lele     | 2012-10-31 15:01:20 |
|  1 | kenan    | kenan    | 2012-10-30 21:46:31 |
+----+----------+----------+---------------------+
3 rows in set (0.00 sec)
mysql> select * from user order by username,id;
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  1 | kenan    | kenan    | 2012-10-30 21:46:31 |
|  3 | kenan    | lele     | 2012-10-31 15:06:46 |
|  2 | lele     | lele     | 2012-10-31 15:01:20 |
+----+----------+----------+---------------------+
3 rows in set (0.00 sec)


在这里第一个sql语句,查出所有的user表中的数据,默认是按照你插入时的数据来排序,就是id递增

第二句是 按照username排序,这个会比较username的首字母

order by id 是按照id递增排序

order by id desc 是按照id递减排序,这里大家明白 desc的作用了吧

order by username,id是添加了两个排序条件,首先按照username排序,username相同的话,会按照id排序

在排序中如果遇到NULL值,把NULL值按照最小的值来处理

9,distinct的用法

mysql> select distinct username from user;
+----------+
| username |
+----------+
| kenan    |
| lele     |
+----------+
2 rows in set (0.00 sec)


distinct的是去重,然后把不重复的查询出来

10,like模糊查询

mysql> select * from user where username like 'ke%';
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  1 | kenan    | kenan    | 2012-10-30 21:46:31 |
|  3 | kenan    | lele     | 2012-10-31 15:06:46 |
+----+----------+----------+---------------------+
2 rows in set (0.00 sec)
mysql> select * from user where username like '_e%';
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  1 | kenan    | kenan    | 2012-10-30 21:46:31 |
|  2 | lele     | lele     | 2012-10-31 15:01:20 |
|  3 | kenan    | lele     | 2012-10-31 15:06:46 |
+----+----------+----------+---------------------+
3 rows in set (0.01 sec)


在这里用了like模糊查询

第一个sql语句,是查询出来 uername 以 ke 开头的 行

第二个sql语句,是查询出来 username 的第二个字母是e的行

在这里%表示0或多个字符,_代表一个字符

11,LIMIT 限定结果行数,用来进行分页查询

mysql> select * from user limit 1;
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  1 | kenan    | kenan    | 2012-10-30 21:46:31 |
+----+----------+----------+---------------------+
1 row in set (0.00 sec)
mysql> select * from user limit 1,2;
+----+----------+----------+---------------------+
| id | username | password | createtime          |
+----+----------+----------+---------------------+
|  2 | lele     | lele     | 2012-10-31 15:01:20 |
|  3 | kenan    | lele     | 2012-10-31 15:06:46 |
+----+----------+----------+---------------------+
2 rows in set (0.00 sec)


limit的两种用法

第一种limit 1这个是显示查询出来的数据的第一条 当让1换成x,就是x条

第二种limit 1,2这里limit带有的两个参数

              首先我们把查询出来的数据进行编号,从0号开始(当然这个编号是不存在的,就是说表内不存在这个字段),它不是id

              这个编号是便于我们理解人为的编号

              然后第一个参数代表的含义呢,就是要显示的数据的编号

              第二个参数表示的就是从刚刚编号开始(包含选中的编号)显示多少条数据

分页用法,要显示第x页的数据,每页显示y条

首先计算第x也的数据的开始编号是(x-1)*y

所以这个sql语句应该这样写

select * from user limit (x-1)*y,y;


12,修改记录

mysql> update user set createtime = now() where username = 'kenan';
Query OK, 2 rows affected (0.05 sec)
Rows matched: 2  Changed: 2  Warnings: 0


这里把user表中的所有username叫做kenan的记录更新createtime字段,更新为当前时间

13,删除记录

mysql> delete from user where username = 'lele';
Query OK, 1 row affected (0.06 sec)


这里删除user表中所有username叫做lele的记录




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论