Tag Archives: database

解一道SQL问题:找出成绩优秀的学生

今天中午,珠三角技术沙龙官方群(103903642)的Crazy同学给大家出了一道SQL的题目,据说来自某个微群: “SQL开发的一道小问题,一个学校的老师需要评选一组学生作为优秀学生,条件为最多只有2个科目在80-85之间,其他科目在85分以上或者所有科目成绩都在85分以上,表中包含StuId,SubjectId,Score,求最简单且效率最高的语句。 ” 我有点无聊加手欠,就试着解了一下,建立测试用数据表及数据如下,一共有5位同学,4个科目,共20条数据。我的测试环境是老式macbook 402,4G内存,mysql 5.1.42,MyISAM引擎。 我们首先把非优秀学生的条件重新整理一下: 1、凡有一科分数低于80分的,都不能称为优秀学生 2、凡有两科以上分数在80至85分之间的,也不能称为优秀学生 这两个条件是或的关系。 同时整理一下优秀学生的条件: 1、称得上优秀学生的,必须至少所有科目都在80以上。 2、称得上优秀学生的,分数在80至85分的科目必须小于2科。 这两个条件是与的关系。 先找出非优秀学生还是先找出优秀学生,是两种不同的解题思路,下面我分别从这两种思路出发解决问题: 思路一:先找出非优秀的学生,反过来得到优秀的学生 1、首先找出有个别科目分数低于80分的学生 select StuID,count(*) from tb_score where Score < 80 group by StuID 2、然后找出有科目分数在80至85分超过两科的学生 select StuID,count(*) from tb_score where Score between 80 and 85 group by StuID having count(*) >2 … Continue reading

Posted in 技术 | Tagged , | 18 Comments

又是Mysql和Mac os x

Mac os x和Mysql总是有些。。。。。。哎,你们知道的。今天又学到两个小技巧了。 一、安装ruby的mysql驱动 使用介个命令: $sudo env ARCHFLAGS=”-arch x86_64″ gem install mysql –no-ri –no-rdoc — –with-mysql-config=/opt/local/lib/mysql5/bin/mysql_conf 指定ARCHFLAGS很重要,视乎你的系统的架构. 不要生成ri,rdoc,否则一大批错误信息输出。 指定mysql-config 二、同时使用标准与非标准.sock文件 有时尽管在安装的时候指定了mysql-conf,同时mysql-conf的文件里也把socket file指向了非标准的.sock文件路径(如/tmp/mysqld.sock),但有些程序就老是死牛一边颈地要找标准的.sock文件(如/opt/local/var/run/mysql5/mysqld.sock)。于是我满世界的网页找解决方案。最终,某位老兄一语惊醒梦中人:“为嘛不建个软链捏?”(这是中译文),哦! ln -s /tmp/mysqld.sock /opt/local/var/run/mysql5/mysqld.sock 这样世界就清净了。我还真傻。

Posted in 技术 | Tagged , , , | Leave a comment

ubuntu9.10下python访问Sql server的解决方案

在Linux/Unix/Mac下面通过程序来访问M$的Sql Server是一件很折腾的事情,赖总说,linux遇上windows就是杯具啊。最近不幸自己也遇上了,折腾了好一段时间,参考过不下于100+的网页,给过两个老外写邮件,终于还是没有搞定snow leopard上的,但总算搞定了linux上的。 纵观网上的一些参考材料,中文偏少,以赖总一年之前那篇被转载居多,而且大多数语焉不详,只道How,不道Why,当linux发行版本换或软件一升级就套不上了;英文很多,但各有千秋,参考起来也很头大。今天,咱在授人与鱼(如果你的系统配置和我的一样)之余顺便授人与渔,希望自己这次折腾的经验可以给以后需要的同学们带来点方便或启示什么的。 在开始之前,请问一下自己,真的有必要这样折腾吗?现在放弃还来得及,如果点头就继续往下看吧。 其实也没那么恐怖,我自己像个盲头苍蝇乱撞才会踫到一脸灰,如果一开始把原理搞清楚,做起来就快了。 首先,再确定一下我们的目标是:在linux下通过python访问Sql Server!关键字是linux、sqlserver、python。我的系统配置:ubuntu9.10 desktop 64bit、python2.5、SqlServer2005,配置不同的同学在理解原理之余应该也可以自行解决了。  基本原理 一、Linux下应用程序是一般怎样访问数据库的? 目前比较流行的方法是应用程序通过ODBC(Open DataBase Connectivity)来访问数据库。 在ODBC诞生之前,如果要开发数据库应用程序,则必须要使用数据库厂商随数据库产品一同发布的一些工具集来访问数据库,或者在程序中使用嵌入式SQL来访问数据库。当时,对于访问数据库的方法,缺乏一个基于C语言的统一编程接口。ODBC(Open Database Connectivity,开放数据库互连)提供了一种标准的API(应用程序编程接口)方法来访问DBMS(Database Management System)。这些API利用SQL来完成其大部分任务。 见ODBC的架构图,ODBC的驱动管理器自动处理各种数据库驱动与数据源(如各种数据库,甚至Excel)的关系,应用程序只需要使用ODBC的API即可,底层的细节对于应用程序来说是透明的。熟悉Java的同学回想一下JDBC,与ODBC的思路是一个道理,各种数据库有各自对应的JDBC驱动,同时也会有与之对应的ODBC驱动。 那么,要达到linux下应用程序访问数据库的目的,我们需要安装Linux下的ODBC库:unixODBC,目前ODBC在各种操作系统上均有实现,如windows的MS ODBC,还有Mac下的iODBC。 需要注意一点就是,要在Linux下让应用程序访问数据库,使用ODBC不是唯一的方法,只是本解决方案的方法。 二、怎样通过程序访问Sqlsever? 众所周知,程序访问数据库通常需要用到数据库的驱动程序(Database Driver)。Sqlserver(及SyBase)使用TDS(Tabular_Data_Stream)作为它的数据库现客户端传输的协议。关于TDS:  TDS(Tabular_Data_Stream)是一个应用层协议,用于数据库服务器与客户端传递数据,于1984年由Sybase公司发起并开发,用在它们的Sybase Sql Server关系数据库引擎,后来被微软的Sql Server所用。 所以不难理解,SqlServer的Java 驱动包 JTDS,就是TDS的一个Java实现(同时是JDBC的实现)。而For linux,开源社区有一个叫freetds的实现。Linux的程序可以直接通过它来访问SqlServer,是的,可以跳过ODBC。使用ODBC只不过是希望使得更多的方言(不同的编程语言)可以以一致的方式来访问数据库。 三、当Linux遇上SqlServer? unixODBC使得linux上的程序可以以一统一的方式来访问数据源(这里叫以linux的方式),freetds是专为SqlServer而实现的数据库驱动。那么如果我们要以linux的方式去访问SqlServer呢?那就把两者两者连接起来吧!tdsodbc做这个的,在它的帮助下,linux上的应用程序完全可以不用关心freetds,只要以odbc的方式去访问数据源即可。 四、再加一个Python如何? pyodbc是ODBC的一个python封装,它允许任何平台上的python具有使用ODBC API的能力。那意味着,pyodbc是python语言与ODBC的一条桥梁。 … Continue reading

Posted in 技术, 软件 | Tagged , , , | Leave a comment

自行开发了个可重用的数据库连接框架

在开发有关数据库的应用时,虽然JDBC提供给我们许多便利,但在我们开发不同的应用的时候还是会重复着一些相同的工作,比如说编写数据库连接的程序,工作虽然不算多,但不断地重复实在是浪费时间,也增加了调试的复杂度;还有一点,我们应该尽量使用配置的数据源,笔者用的是Mysql,当用到中文应用上的时候Mysql的数据源没办法解决中文问题,另一方面又不希望每次都手动创建连接。基于以上遇到的两个小障碍,我编写了一个小框架,实现数据库使用方法最简单,能创建数据连接池。这些工作的实现都不需要再编程。 在Web应用中我们只需要在WEB-INF文件夹下面加入一个DBconfig.properties的文件,简单设置几个参数,再在Web.xml文件内加入一个listener元素即可。凡是JDBC支持的数据库类型都可以通过这两个文件来设置得到与数据库的连接。有了这个基础,开发者可以只需要考虑业务上的编程。比如说要实现什么样的查询和数据操作,开发者只需要定义这些业务上的方法即可。这样对开发效率来说大有改善。当然,如果在一些大的应用里面,用到ORM框架的话,这个框架就派不上用场了。这个小框架只适用于中小型的“利用关系数据库本土语言来工作”的应用。 使用的步骤: 一、配置DBconfig.properties DBconfig.properties的设置例子如下: url=jdbc:mysql://localhost:3306/article?useUnicode=true&characterEncoding=GB2312 user=dbuser passWord=227711 DriverName=com.mysql.jdbc.Driver maxConnections=10 url参数指定所要的数据库连接的URL。 user参数是连接该数据库的用户名 passWord参数是连接用户的密码 DriverName参数是所用数据库类型的驱动类 maxConnections可以设置最大连接数目 二、配置Web.xml: 在Web.xml中这样设置便可: <web-app> <listener> <listener-class>bbmyth.util.dataBase.DataSourceProviderServlet</listener-class> </listener> </web-app> 不要去改变<listener>里面的所有东西。 三、用本应用包的API来编写业务程序 确保bbmyth.util.dataBase这个应用包在你的ClassPath(供编译程序用)中,或直接将该包Import入来。 最后定义自已的数据库操作Bean。注意这个Bean要继承bbmyth.util.dataBase.DBManager类,在这个DBManager类里提供了四个数据库操作变量: Connection con:是连接类,框架已提供现成的连接,开发者可在程序里以下面的语句来获得数据库的连接:con=getConnection(); Statement smt:是查询语句类的变量,可直接使用; PreparedStatement psmt:是预编译查询语句类的变量,可直接使用; ResultSet rs:是结果集的变量,可直接使用。 每一次连接使用完之后,不管是用编译语句还是预编译语句和有没有返回结果集都可以直接用closeAll()函数来关闭它们,不推荐用他们自已的close()方法。 四、在Jsp中应用UseBean标签把该业务JavaBean应用进去,然后用SetProperty标签设置其一个参数。如: <jsp:setProperty name=”articledb” property=”provider” value=”<%=application.getAttribute(“CONNECTOR”)%>”/> … Continue reading

Posted in 技术 | Tagged , , | Leave a comment

sam’s teach yourself Sql in 24hours的范例数据库表格Mysql版本

想找个范例的数据库原来真不是简单。呵呵 原书本上的数据库只是个标准,不是实现的版本。 在网上艰辛地找到了这个表格之后与发现自已用的Mysql字段的类型不符。 于是做了改动。下面的Sql文件可以直接导入Mysql了。 有了这个东东。可以节省很多输入的时间。学习更方便了。 –study.sql文件如下: create datebase study; use study –表employee_tbl结构 create table employee_tbl (emp_id varchar(9) not null, last_name varchar(15) not null, first_name varchar(15) not null, middle_name varchar(15), address varchar(30) not null, city varchar(15) not null, state char(2) not … Continue reading

Posted in 技术 | Tagged , | Leave a comment

Mysql服务器出现的问题及解决方法

今天打开Mysqladmin的时候,它亮着红灯,停止了服务。奇怪,昨天还好好的一点事都没有。 我在寻思是不是因为安装了两个不同版本的Mysql服务器。原来一个是单独安装,后者是随PHP组件 一齐安装的,但是装完之后测试过两个版本是互通的。没事发生。 今天用了所有的用户都进不了数据库。急了,里面的数据没有备份(命令备份)。我的许多应用都还要用到 里面的数据表格的。晕死啦。。。。 我以为是版本出现了冲突导致不能服务,于是我决定删掉我原来装的那个,把Data文件夹移了出来 但是只留下后者的时候,问题一样存在。我只有在Mysqladmin上点击右键把服务器停下来然后再重新开启。 这下竟然可以了。 我后来再打开Mysqladmin的时候一切正常。 现在最担心的就是我的数据了。当我把Data文件夹替代原来的文件夹时,在管理器那里看到所有的表格都回来了。问题是原来那些表格的访问用户进不了数据库,没办法连接。我查看了Mysql的表里面有那个用户名和密码,但是就是进不去。后来我尝试重新创建这个用户,并给他所有的权力。但是再次失败了,还是没法登入。最后我把表中的用户删了。全新创建这个用户。呵呵。终于能进了。。 问题最终搞定啦。呵呵。

Posted in 技术 | Tagged , | Leave a comment