SQL数据库查询语句问题

SQL数据库查询语句问题,第1张

看查询的目的来使用。举个例子来说明,一用户表(users),一考勤表(duty),关联字段为u_id。

用户表有过删除 *** 作,也有新增。而考勤记录一直保存即有些用户删除了,又或者有些新增用户还没有考勤记录。1

如果要查询当前所有存在用户的存在的考勤记录,用内联。即需要两个表关联字段都存在的select

from

users

inner

join

duty

on

usersu_id=dutyu_id 2

查询当前所有存在用户的考勤情况--不管是否有考勤记录,都要把用户的情况列出来,用左连接,此时会列出所有用户,而不存在考勤记录的用户显示为空。select

from

users left

join

duty

on

usersu_id=dutyu_id 3

查询所有存在的考勤记录,不管用户是否删除,用右连接。此时会列出所有考勤记录,已经删除的用户显示为空。select

from

users right

join

duty

on

usersu_id=dutyu_id

感觉你概念很混乱,帮你梳理一下,

USER表一个,里面放静态的东西,静态并不意味着没有变更,只是相对的静态的,可以增加新的USER的,USERID,USERNAME,CREATEDATE这些字段应该有的,其他根据需要再加,总之是和USER有关的资料,

DATA表一个,相对动态的每日的数据,USERID,外键关联USER表,UPLOADTIME,年月日时分秒,上传数据的时间,程序里面做判断,如果USER不存在,作为新的USER加入到USER表里面,

就你已经提供的情况来看,这样设计就可以了,每日一个表也可以,每日数据量很大,性能情况不好控制的考虑下,但是你要相应的做动态建表,插入时候也要动态表名,程序开发时候会比较复杂,维护也并不方便。

javaDB其实就是Derby,它并不是一个新的数据库产品,它是由IBM捐献给Apache的DB项目的一个纯Java数据库,JDK60里面带的这个Derby的版本是 10217,支持存储过程和触发器;有两种运行模式,一种是作为嵌入式数据库,另一种是作为网络数据库,前者的数据库服务器和客户端都在同一个 JVM里面运行,后者允许数据库服务器端和客户端不在同一个JVM里面,而且允许这两者在不同的物理机器上值得注意的是JDK6里面的这个Derby支持JDK6的新特性JDBC 40规范(JSR 221),现在我们如果要练习JDBC的用法,没有必要单独装一个数据库产品了,直接用Derby就行

1、本身没有 *** 作界面,可以用第三方工具来管理(也就是你说的 *** 作界面),Aqua Data Studio 具备管理功能的用于 Apache Derby 关系数据库的管理工具和数据库查询工具。直观管理功能让用户能够浏览和修改数据库结构,包括架构对象和数据库存储,以及维护数据库安全。集成查询工具让您能够迅速创建、编辑和执行 SQL 查询与脚本。Aqua Data Studio 进一步提供导入与导出工具,从而轻松地将数据移入和移出不同的数据格式及 Apache Derby 数据库。集成在这些工具内的是库浏览器 (Repository Browser),拥有 CVS 和 Subversion (SVN) 的完整来源控制客户端。

2、两者的区别,简单的说,就是javaDB是一个简化轻量级数据库,适合小型系统的小规模测试用,完全可以跑在内存里的数据库,它只有3M大小,而MySQL则是可以应用部署大型系统的数据库,功能更多更全,也更稳定,是用范围更广。

3、下面是个使用derby的简单例子:

首先导入JAR包:derbyjar,如果你装的是JDK6,在C:\Program Files\Sun\JavaDB\lib目录下就可以找到

然后就要创建数据库了:

代码

private Connection getConnection() throws SQLException {

Connection connection = DriverManager

getConnection("jdbc:derby:userDB;create=true;user=test;password=test");

connectionsetAutoCommit(false);

return connection;

}

其中userDB是要连接数据库的名字,create=true表示如果该数据库不存在,则创建该数据库,如果数据库存在,则用用户user=test;密码password=test连接数据库

有了数据库,接下来该建表了:

代码

private void createTable(Connection connection) throws SQLException {

Statement statement = connectioncreateStatement();

String sql = "create table USERS("

+ " ID BIGINT not null generated by default as identity,"

+ " USER_NAME VARCHAR(20) not null,"

+ " PASSWORD VARCHAR(20),"

+ " constraint P_KEY_1 primary key (ID))";

statementexecute(sql);

sql = "create unique index USER_NAME_INDEX on USERS ("

+ " USER_NAME ASC)";

statementexecute(sql);

statementclose();

}

创建了 USERS表,包括ID,USER_NAME,PASSWORD三个列,其中ID是主键,其中generated by default as identity 的作用类似sequence,identity是定义自动加一的列,

GENERATED BY ALWAYS AS IDENTITY

GENERATED BY DEFAULT AS IDENTITY

By always和by default是说明生成这个IDENTITY的方式。

By always是完全由系统自动生成。

by default是可以由用户来指定一个值。

编写与USERS表对应的javabean(这个就不多说了),:

代码

public class User implements Serializable {

/

/

private static final long serialVersionUID = 1L;

private Long id;

private String userName;

private String password;

public Long getId() {

return id;

}

public void setId(Long id) {

thisid = id;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

thisuserName = userName;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

thispassword = password;

}

}

接下来就可以就数据库进行增删改查的 *** 作了:

插入数据:

代码

private void create(User user) {

Connection connection = null;

try {

connection = thisgetConnection();

PreparedStatement statement = connection

prepareStatement("insert into users (user_name,password) values(,)");

int index = 1;

statementsetString(index++, usergetUserName());

statementsetString(index++, usergetPassword());

statementexecute();

usersetId(thisgetId(connection));

connectioncommit();

} catch (SQLException e) {

rollback(connection);

throw new RuntimeException(e);

} finally {

if (connection != null) {

close(connection);

}

}

}

代码

private Long getId(Connection connection) throws SQLException {

CallableStatement callableStatement = connection

prepareCall("values identity_val_local()");

ResultSet resultSet = callableStatementexecuteQuery();

resultSetnext();

Long id = resultSetgetLong(1);

resultSetclose();

callableStatementclose();

return id;

}

getId方法是获得系统默认的id值,是通过 identity_val_local()获得的,而函数IDENTITY_VAL_LOCAL()则可以在INSERT语句执行之后,为我们返回刚才系统为id所产生的值感觉还是有点想sequence的curr_val

修改数据:

代码

private void update(User user) {

Connection connection = null;

try {

connection = thisgetConnection();

PreparedStatement statement = connection

prepareStatement("update users set user_name=,password= where id=");

int index = 1;

statementsetString(index++, usergetUserName());

statementsetString(index++, usergetPassword());

statementsetLong(index++, usergetId());

statementexecute();

connectioncommit();

} catch (SQLException e) {

rollback(connection);

throw new RuntimeException(e);

} finally {

if (connection != null) {

close(connection);

}

}

}

删除数据:

代码

public void delete(Long id) {

Connection connection = null;

try {

connection = thisgetConnection();

PreparedStatement statement = connection

prepareStatement("delete from users where id=");

statementsetLong(1, id);

statementexecute();

connectioncommit();

} catch (SQLException e) {

rollback(connection);

throw new RuntimeException(e);

} finally {

if (connection != null) {

close(connection);

}

}

}

查询数据:

代码

public User findById(Long id) {

Connection connection = null;

try {

connection = thisgetConnection();

PreparedStatement statement = connection

prepareStatement("select user_name,password from users where id=");

statementsetLong(1, id);

ResultSet resultSet = statementexecuteQuery();

User user = null;

if (resultSetnext()) {

user = new User();

usersetId(id);

usersetUserName(resultSetgetString("user_name"));

usersetPassword(resultSetgetString("password"));

}

resultSetclose();

statementclose();

connectioncommit();

return user;

} catch (SQLException e) {

throw new RuntimeException(e);

} finally {

if (connection != null) {

close(connection);

}

}

}

1 基本思想之什么是分库分表?

从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。

2 基本思想之为什么要分库分表?

据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据 *** 作,增

删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、

数据处理能力都将遭遇瓶颈。

3 分库分表的实施策略。

分库分表有垂直切分和水平切分两种。

31

何谓垂直切分,即将表按照功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立定义数据库workDB、商品数据库payDB、用户数据

库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。

32

何谓水平切分,当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如userID散列,进行划分,然后存储到多个结构相同的表,和不同的库

上。例如,我们的userDB中的用户数据表中,每一个表的数据量都很大,就可以把userDB切分为结构相同的多个userDB:part0DB、

part1DB等,再将userDB上的用户数据表userTable,切分为很多userTable:userTable0、userTable1等,

然后将这些表按照一定的规则存储到多个userDB上。

33 应该使用哪一种方式来实施数据库分库分表,这要看数据库中数据量的瓶颈所在,并综合项目的业务类型进行考虑。

如果数据库是因为表太多而造成海量数据,并且项目的各项业务逻辑划分清晰、低耦合,那么规则简单明了、容易实施的垂直切分必是首选。

如果数据库中的表并不多,但单表的数据量很大、或数据热度很高,这种情况之下就应该选择水平切分,水平切分比垂直切分要复杂一些,它将原本逻辑上属于一体

的数据进行了物理分割,除了在分割时要对分割的粒度做好评估,考虑数据平均和负载平均,后期也将对项目人员及应用程序产生额外的数据管理负担。

在现实项目中,往往是这两种情况兼而有之,这就需要做出权衡,甚至既需要垂直切分,又需要水平切分。我们的游戏项目便综合使用了垂直与水平切分,我们首先对数据库进行垂直切分,然后,再针对一部分表,通常是用户数据表,进行水平切分。

4 分库分表存在的问题。

41 事务问题。

在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。

42 跨库跨表的join问题。

在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上,这时,表的关联 *** 作将受到限制,我们无法join位于不同分库的表,也无法join分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成。

43 额外的数据管理负担和数据运算压力。

外的数据管理负担,最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但必然引起额外的逻辑运算,例如,对于

一个记录用户成绩的用户数据表userTable,业务要求查出成绩最好的100位,在进行分表之前,只需一个order

by语句就可以搞定,但是在进行分表之后,将需要n个order

by语句,分别查出每一个分表的前100名用户数据,然后再对这些数据进行合并计算,才能得出结果。

它们的功能都是一样的,就是从表(dba_users,user_users,all_users)中选取所有数据。

SQL SELECT 语句

SELECT 语句用于从表中选取数据。

结果被存储在一个结果表中(称为结果集)。

SQL SELECT 语法

SELECT 列名称 FROM 表名称

以及:

SELECT FROM 表名称

1 基本思想之什么是分库分表?

从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。

2 基本思想之为什么要分库分表?

数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据 *** 作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。

3 分库分表的实施策略。

分库分表有垂直切分和水平切分两种。

31 何谓垂直切分,即将表按照功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立定义数据库workDB、商品数据库payDB、用户数据库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。

32 何谓水平切分,当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如userID散列,进行划分,然后存储到多个结构相同的表,和不同的库上。例如,我们的userDB中的用户数据表中,每一个表的数据量都很大,就可以把userDB切分为结构相同的多个userDB:part0DB、part1DB等,再将userDB上的用户数据表userTable,切分为很多userTable:userTable0、userTable1等,然后将这些表按照一定的规则存储到多个userDB上。

33 应该使用哪一种方式来实施数据库分库分表,这要看数据库中数据量的瓶颈所在,并综合项目的业务类型进行考虑。

如果数据库是因为表太多而造成海量数据,并且项目的各项业务逻辑划分清晰、低耦合,那么规则简单明了、容易实施的垂直切分必是首选。

而如果数据库中的表并不多,但单表的数据量很大、或数据热度很高,这种情况之下就应该选择水平切分,水平切分比垂直切分要复杂一些,它将原本逻辑上属于一体的数据进行了物理分割,除了在分割时要对分割的粒度做好评估,考虑数据平均和负载平均,后期也将对项目人员及应用程序产生额外的数据管理负担。

在现实项目中,往往是这两种情况兼而有之,这就需要做出权衡,甚至既需要垂直切分,又需要水平切分。我们的游戏项目便综合使用了垂直与水平切分,我们首先对数据库进行垂直切分,然后,再针对一部分表,通常是用户数据表,进行水平切分。

4 分库分表存在的问题。

41 事务问题。

在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。

42 跨库跨表的join问题。

在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上,这时,表的关联 *** 作将受到限制,我们无法join位于不同分库的表,也无法join分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成。

43 额外的数据管理负担和数据运算压力。

额外的数据管理负担,最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但必然引起额外的逻辑运算,例如,对于一个记录用户成绩的用户数据表userTable,业务要求查出成绩最好的100位,在进行分表之前,只需一个order by语句就可以搞定,但是在进行分表之后,将需要n个order by语句,分别查出每一个分表的前100名用户数据,然后再对这些数据进行合并计算,才能得出结果。

上述整理于互联网

设计登录窗口的思想是这样的:一、在加载主窗口时候(即Load事件中)加载登录窗口二、在登录窗口中点击“登录”按钮时候发生下面的事情1声明变量userName并获取用户名文本框输入的内容,声明变量pwd并获取密码文本框输入的内容。2判断userName是否为空,如果为空,则提示输入并结束事件,判断pwd是否为空,如果为空,则提示输入并结束事件3用ADONET *** 作数据库,查找是否有对应输入的用户名和密码,如果有,将关闭登录窗口,如果没有,则提示用户名和密码错误。设MSSQL数据库中有数据库test1,里面有表users,表中有字段username和pwd。主窗口中的Load事件中的代码为:Login fm = new Login();//创建登录窗口if (fmShowDialog() == DialogResultOK)//判断登录是否成功登录窗口中“登录”按钮的代码为://要先引用using SystemDataSqlClient;string userName = textBox1Text;string pwd = textBox2Text;if (userName == stringEmpty )//判断用户名的文本框是否有输入内容{MessageBoxShow("请输入用户名!");//提示输入用户名return;//跳出事件,不执行下面的代码}else if (pwd == stringEmpty){MessageBoxShow("请输入密码!");return;}//下面是ADONET对数据库进行 *** 作,查找是否有用户名和密码相符的记录,如果有,设置tag为1,表示登录成功SqlConnection conn = new SqlConnection("Data Source=\\sqlexpress;Initial Catalog=test1;Integrated Security=True");connOpen();string sql = stringFormat("select count() from users where username='{0}' and pwd='{1}'",userName,pwd);SqlCommand comm = new SqlCommand(sql,conn);int tag = 0;if ((int)commExecuteScalar() 0)tag = 1;connClose();if (tag == 1)//判断是否登录成功{thisDialogResult = DialogResultOK;thisClose();}else{MessageBoxShow("密码错误!");}以上就是主要的代码和内容了。说一下你的数据库中的表名使用有问题,不能用user作为表名,因为这是个关键字,用的话会出错的。建议你用users或其他的。这里有参考源代码,外链是以上信息希望对你有帮助。^^

以上就是关于SQL数据库查询语句问题全部的内容,包括:SQL数据库查询语句问题、数据库建表的疑问、javaDB数据库问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10192273.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存