一赠潦、單例模式
餓漢模式
public class Singleton {
private Singleton(){};
private static Singleton Instance = new Singleton();
public static Singleton getInstance(){
return Instance;
}
懶漢模式
public class Singleton {
private Singleton(){}
private static class LazyHodler{
private static Singleton Instance = new Singleton();
}
public static Singleton getInstance(){
return LazyHodler.Instance;
}
}
二、數(shù)組操作
/**
* 1.獲取數(shù)組中的最大值/最小值
*/
public static int getMax(int[] arr) {
int max = arr[0];
for (int x = 1; x < arr.length; x++) {
if (arr[x] > max)
max = arr[x];
}
return max;
}
/**
* 2.給數(shù)組排序草冈,選擇排序和冒泡排序
*/
public static void selectSort(int[] arr) {
for (int x = 0; x < arr.length - 1; x++) {
for (int y = x + 1; y < arr.length; y++) {
if (arr[x] > arr[y]) {
swap(arr, x, y);
}
}
}
}
public static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public static void bubbleSort(int[] arr) {
for (int x = 0; x < arr.length - 1; x++) {
for (int y = 0; y < arr.length - x - 1; y++)//-x:讓每一次比較的元素減少祭椰,-1:避免角標(biāo)越界。
{
if (arr[y] < arr[y + 1]) {
swap(arr, y, y + 1);
}
}
}
}
/**
* 3.對(duì)給定的數(shù)組進(jìn)行反轉(zhuǎn)
*/
public static void reverseArray(int[] arr) {
for (int start = 0, end = arr.length - 1; start < end; start++, end--) {
swap(arr, start, end);
}
}
/**
* 4.數(shù)組的查找操作疲陕,
*/
public static int getIndex(int[] arr, int key) {
for (int x = 0; x < arr.length; x++) {
if (arr[x] == key)
return x;
}
return -1;
}
//二分法查找方淤,先排序
public static int halfSearch(int[] arr, int key) {
int min, max, mid;
min = 0;
max = arr.length - 1;
mid = (max + min) / 2;
while (arr[mid] != key) {
if (key > arr[mid])
min = mid + 1;
else if (key < arr[mid])
max = mid - 1;
if (min > max)
return -1;
mid = (max + min) / 2;
}
return mid;
}
//保留小數(shù)點(diǎn),在四舍五入后
public class TestMath {
public static void main(String[] args) {
/*
Random r = new Random();
for(int x=0; x<10; x++)
{
//int d = (int)(Math.random()*10+1);
int d = r.nextInt(10)+1;
sop(d);
}
*/
saveTwo(12.3456, 2, true);//12.34
}
public static void saveTwo(double d, int scale, boolean isRound) {
double base = Math.pow(10, scale);
double num = isRound ? Math.round(d * base) / base : ((int) (d * base)) / base;
sop("num=" + num);
/*
double d1 = d*100;
sop("d1="+d1);
d1 = d1+0.5;
double d2 = (int)d1;
sop("d2="+d2);
double d3 = d2/100;
sop("d3="+d3);
*/
}
public static void show() {
double d = Math.ceil(16.34);//ceil返回大于指定數(shù)據(jù)的最小整數(shù)蹄殃。
double d1 = Math.floor(12.34);//floor返回小于指定數(shù)據(jù)的最大整數(shù)携茂。
long l = Math.round(12.54);//四舍五入
sop("d=" + d);
sop("d1=" + d1);
sop("l=" + l);
double d2 = Math.pow(2, 3);
sop("d2=" + d2);
}
public static void sop(Object obj) {
System.out.println(obj);
}
}
三、字符串操作
/*基本數(shù)據(jù)類型對(duì)象包裝類诅岩。
byte Byte
short short
int Integer
long Long
boolean Boolean
float Float
double Double
char Character
基本數(shù)據(jù)類型轉(zhuǎn)成字符串讳苦。
基本數(shù)據(jù)類型+""
包裝類.toString(基本數(shù)據(jù)類型值);
如: Integer.toString(34);//將34整數(shù)變成"34";
字符串轉(zhuǎn)成基本數(shù)據(jù)類型。
xxx a = Xxx.parseXxx(String);
int a = Integer.parseInt("123");
double b = Double.parseDouble("12.23");
boolean b = Boolean.parseBoolean("true");
Integer i = new Integer("123");
int num = i.intValue();
/**
* 將字符串變成數(shù)組
* 對(duì)數(shù)組反轉(zhuǎn),將數(shù)組變成字符串
*/
public static String reverseString(String s, int start, int end) {
//字符串變數(shù)組吩谦。
char[] chs = s.toCharArray();
//反轉(zhuǎn)數(shù)組鸳谜。
reverse(chs, start, end);
//將數(shù)組變成字符串。
return new String(chs);
}
private static void reverse(char[] arr, int x, int y) {
for (int start = x, end = y - 1; start < end; start++, end--) {
swap(arr, start, end);
}
}
private static void swap(char[] arr, int x, int y) {
char temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
/**
* 去除字符串兩端空格
*/
public static String myTrim(String str) {
int start = 0, end = str.length() - 1;
while (start <= end && str.charAt(start) == ' ')
start++;
while (start <= end && str.charAt(end) == ' ')
end--;
return str.substring(start, end + 1);
}
/**
* 子串在整串中出現(xiàn)的次數(shù)式廷。
*/
private static int getCount(String str, String ref) {
int count = 0;
while (str.contains(ref)) {
str = str.substring(str.indexOf(ref) + ref.length());
count++;
}
return count;
}
/**
* 對(duì)字符串中字符進(jìn)行自然順序排序咐扭。
* 思路:字符串變成字符數(shù)組,對(duì)數(shù)組排序,選擇滑废,冒泡蝗肪,Arrays.sort(),將排序后的數(shù)組變成字符串。
*/
/**
* 要求對(duì)字符串中的數(shù)值進(jìn)行排序蠕趁。生成一個(gè)數(shù)值從小到大新字符串薛闪。
* 思路:
* 1,將字符串切割俺陋。變成字符串?dāng)?shù)組豁延。
* 2,將字符串?dāng)?shù)組轉(zhuǎn)成int數(shù)組腊状。
* 3诱咏,int數(shù)組排序。
* 4寿酌,將int數(shù)組變成字符串胰苏。
*/
public static String numberStringSort(String str) {
String[] arr = splitString(str);
int[] nums = toIntArray(arr);
Arrays.sort(nums);
return intArraytoString(nums);
}
private static String[] splitString(String str) {
return str.split(" ");
}
private static int[] toIntArray(String[] arr) {
int[] nums = new int[arr.length];
for (int x = 0; x < arr.length; x++) {
nums[x] = Integer.parseInt(arr[x]);
}
return nums;
}
private static String intArraytoString(int[] arr) {
StringBuilder sb = new StringBuilder();
for (int x = 0; x < arr.length; x++) {
if (x != arr.length - 1)
sb.append(arr[x] + " ");
else
sb.append(arr[x]);
}
return sb.toString();
}
/**
* 獲取兩個(gè)字符串中最大相同子串。第一個(gè)動(dòng)作:將短的那個(gè)串進(jìn)行長(zhǎng)度一次遞減的子串打印
* "abcwerthelloyuiodef" "cvhellobnm"
* 思路:將短的那個(gè)子串按照長(zhǎng)度遞減的方式獲取到,將每獲取到的子串去長(zhǎng)串中判斷是否包含,如果包含,已經(jīng)找到硕并!
*/
public static String getMaxSubString(String s1, String s2) {
String max = "", min = "";
max = (s1.length() > s2.length()) ? s1 : s2;
min = (max == s1) ? s2 : s1;
for (int x = 0; x < min.length(); x++) {
for (int y = 0, z = min.length() - x; z != min.length() + 1; y++, z++) {
String temp = min.substring(y, z);
//sop(temp);
if (max.contains(temp))//if(s1.indexOf(temp)!=-1)
return temp;
}
}
return "";
}
四法焰、集合操作
/*Collection定義了集合框架的共性功能。
1倔毙,添加
add(e);
addAll(collection);
2埃仪,刪除
remove(e);
removeAll(collection);
clear();
3,判斷陕赃。
contains(e);
isEmpty();
4卵蛉,獲取
iterator();
size();
5,獲取交集么库。
retainAll();
6傻丝,集合變數(shù)組。
toArray();
1诉儒,add方法的參數(shù)類型是Object葡缰。以便于接收任意類型對(duì)象。
2忱反,集合中存儲(chǔ)的都是對(duì)象的引用(地址)
什么是迭代器呢泛释?
其實(shí)就是集合的取出元素的方式。
如同抓娃娃游戲機(jī)中的夾子温算。
迭代器是取出方式怜校,會(huì)直接訪問(wèn)集合中的元素。
所以將迭代器通過(guò)內(nèi)部類的形式來(lái)進(jìn)行描述注竿。
通過(guò)容器的iterator()方法獲取該內(nèi)部類的對(duì)象茄茁。
*/
- List
/**
* Created by joshul on 2017/3/6.
* ArrayList 數(shù)組形式訪問(wèn)List鏈?zhǔn)郊蠑?shù)據(jù),元素可重復(fù)蔓搞,訪問(wèn)元素較快 數(shù)組
* LinkedList 鏈表方式的List鏈?zhǔn)郊弦榷。乜芍貜?fù),元素的插入刪除較快 雙向鏈表
*/
public class TestList {
public static void main(String[] args) {
}
/**
* ArrayList 數(shù)組形式訪問(wèn)List鏈?zhǔn)郊蠑?shù)據(jù)喂分,元素可重復(fù),訪問(wèn)元素較快 數(shù)組
* @param al
* @return
*/
public static ArrayList singleElement(ArrayList al) {
//定義一個(gè)臨時(shí)容器机蔗。
ArrayList newAl = new ArrayList();
Iterator it = al.iterator();
while(it.hasNext())
{
Object obj = it.next();
if(!newAl.contains(obj))
newAl.add(obj);
}
return newAl;
}
}
- Set
/**
* Created by joshul on 2017/3/6.
* Set的核心概念就是集合內(nèi)所有元素不重復(fù)蒲祈。在Set這個(gè)子接口中沒(méi)有在Collection特別實(shí)現(xiàn)什么額外的方法,應(yīng)該只是定義了一個(gè)Set概念萝嘁。
* 下面我們來(lái)看Set的幾個(gè)常用的實(shí)現(xiàn)HashSet梆掸、LinkedHashSet、TreeSet
* <p>
* HashSet 無(wú)序的牙言、無(wú)重復(fù)的數(shù)據(jù)集合 基于HashMap
* LinkedSet 維護(hù)次序的HashSet 基于LinkedHashMap
* TreeSet 保持元素大小次序的集合酸钦,元素需要實(shí)現(xiàn)Comparable接口 基于TreeMap
*/
public class TestSet {
/**
* "90 -7 0 18 2 45 4",將字符串中的數(shù)值進(jìn)行排序。使用TreeSet完成咱枉。
* 將字符串切割,可以將這些對(duì)象存入TreeSet集合卑硫。因?yàn)門reeSet自身具備排序功能徒恋。
*/
public static void main(String[] args) {
String str = "90 -7 0 18 2 45 4";
String[] arr = str.split(" ");
TreeSet ts = new TreeSet();
for (int x = 0; x < arr.length; x++) {
//ts.add(new Integer(arr[x]));
ts.add(Integer.parseInt(arr[x]));//
}
System.out.println(ts);
}
}
- Mep
public class TestMap {
public static void main(String[] args) {
String s= charCount("ak+abAf1c,dCkaAbc-defa");
System.out.println(s);
}
/**
* "sdfgzxcvasdfxcvdf"獲取該字符串中的字母出現(xiàn)的次數(shù)。
* 希望打印結(jié)果:a(1)c(2).....
* 思路:
* 1欢伏,將字符串轉(zhuǎn)換成字符數(shù)組入挣。因?yàn)橐獙?duì)每一個(gè)字母進(jìn)行操作。
* 2硝拧,定義一個(gè)map集合径筏,因?yàn)榇蛴〗Y(jié)果的字母有順序,所以使用treemap集合
* 3障陶,遍歷字符數(shù)組滋恬。
* 將每一個(gè)字母作為鍵去查map集合。
* 如果返回null抱究,將該字母和1存入到map集合中夷恍。
* 如果返回不是null,說(shuō)明該字母在map集合已經(jīng)存在并有對(duì)應(yīng)次數(shù)媳维。那么就獲取該次數(shù)并進(jìn)行自增酿雪。,然后將該字母和自增后的次數(shù)存入到map集合中侄刽。覆蓋調(diào)用原理鍵所對(duì)應(yīng)的值指黎。
* 4,將map集合中的數(shù)據(jù)變成指定的字符串形式返回州丹。
*/
public static String charCount(String str) {
char[] chs = str.toCharArray();
TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
int count = 0;
for (int x = 0; x < chs.length; x++) {
if (!(chs[x] >= 'a' && chs[x] <= 'z' || chs[x] >= 'A' && chs[x] <= 'Z'))
continue;
Integer value = tm.get(chs[x]);
if (value != null)
count = value;
count++;
tm.put(chs[x], count);//直接往集合中存儲(chǔ)字符和數(shù)字醋安,為什么可以,因?yàn)樽詣?dòng)裝箱墓毒。
count = 0;
}
//System.out.println(tm);
StringBuilder sb = new StringBuilder();
Set<Map.Entry<Character, Integer>> entrySet = tm.entrySet();
Iterator<Map.Entry<Character, Integer>> it = entrySet.iterator();
while (it.hasNext()) {
Map.Entry<Character, Integer> me = it.next();
Character ch = me.getKey();
Integer value = me.getValue();
sb.append(ch + "(" + value + ")");
}
return sb.toString();
}
}
四吓揪、IO操作
/**
* Created by joshul on 2017/3/1.
* IO流用來(lái)處理設(shè)備之間的數(shù)據(jù)傳輸
* Java對(duì)數(shù)據(jù)的操作是通過(guò)流的方式
* Java用于操作流的對(duì)象都在IO包中
* 流按操作數(shù)據(jù)分為兩種:字節(jié)流與字符流
* 流按流向分為:輸入流,輸出流所计。
* 字節(jié)流的抽象基類: InputStream 柠辞,OutputStream。
* 字符流的抽象基類: Reader 主胧, Writer叭首。
* InputStream的子類FileInputStream。
* Reader的子類FileReader踪栋。
* IO程序的書寫:
* 導(dǎo)入IO包中的類
* 進(jìn)行IO異常處理
* 在finally中對(duì)流進(jìn)行關(guān)閉
* <p>
* 字符流的緩沖區(qū)
* 緩沖區(qū)的出現(xiàn)提高了對(duì)數(shù)據(jù)的讀寫效率焙格。
* 對(duì)應(yīng)類: BufferedWriter, BufferedReader
* 緩沖區(qū)要結(jié)合流才可以使用,在流的基礎(chǔ)上對(duì)流的功能進(jìn)行了增強(qiáng)。
* <p>
* 裝飾設(shè)計(jì)模式:對(duì)原有類進(jìn)行了功能的改變夷都,增強(qiáng)眷唉。
*/
public class Io {
public static void main(String[] args) {
getTime();
}
/**
* 獲取現(xiàn)在時(shí)間
*/
public static void getTime() {
Date d = new Date();
System.out.println(d);//打印的時(shí)間看不懂,希望有些格式。
//將模式封裝到SimpleDateformat對(duì)象中冬阳。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日E hh:mm:ss");
//調(diào)用format方法讓模式格式化指定Date對(duì)象蛤虐。
String time = sdf.format(d);
System.out.println("time=" + time);
long l = System.currentTimeMillis();
Date d1 = new Date(l);
System.out.println("d1:" + d1);
}
/**
* 讀取一個(gè).java文件,并打印在控制臺(tái)上摩泪。
*/
public static void readJava() {
FileReader fr = null;
try {
fr = new FileReader("DateDemo.java");
char[] buf = new char[1024];
int num = 0;
while ((num = fr.read(buf)) != -1) {
System.out.print(new String(buf, 0, num));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 演示對(duì)已有文件的數(shù)據(jù)續(xù)寫笆焰。
*/
public static void readFile() {
FileWriter fw = null;
try {
//傳遞一個(gè)true參數(shù),代表不覆蓋已有的文件见坑。并在已有文件的末尾處進(jìn)行數(shù)據(jù)續(xù)寫嚷掠。
fw = new FileWriter("demo.txt", true);
fw.write("nihao\r\nxiexie");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* FileWriter
*/
public static void fileWriter() {
FileWriter fw = null;
try {
//創(chuàng)建一個(gè)FileWriter對(duì)象。該對(duì)象一被初始化就必須要明確被操作的文件荞驴。
//而且該文件會(huì)被創(chuàng)建到指定目錄下不皆。如果該目錄下已有同名文件,將被覆蓋熊楼。
//其實(shí)該步就是在明確數(shù)據(jù)要存放的目的地霹娄。
fw = new FileWriter("demo.txt");
//調(diào)用write方法,將字符串寫入到流中鲫骗。
fw.write("abcde");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//刷新流對(duì)象中的緩沖中的數(shù)據(jù)犬耻。
//將數(shù)據(jù)刷到目的地中。
//fw.flush();
//關(guān)閉流資源执泰,但是關(guān)閉之前會(huì)刷新一次內(nèi)部的緩沖中的數(shù)據(jù)枕磁。
//將數(shù)據(jù)刷到目的地中。
//和flush區(qū)別:flush刷新后术吝,流可以繼續(xù)使用计济,close刷新后,會(huì)將流關(guān)閉排苍。
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/*//傳遞一個(gè)true參數(shù)沦寂,代表不覆蓋已有的文件。并在已有文件的末尾處進(jìn)行數(shù)據(jù)續(xù)寫淘衙。
FileWriter fw = new FileWriter("demo.txt",true);
fw.write("nihao\r\nxiexie");
fw.close();*/
}
}
**
* Created by joshul on 2017/3/6.
* 字符流:FileReader FileWriter传藏。/BufferedReader BufferedWriter
* 字節(jié)流:InputStream OutputStream
* 需求,想要操作圖片數(shù)據(jù)幔翰。這時(shí)就要用到字節(jié)流漩氨。
*/
public class TestBuffer {
public static void main(String[] args){
}
public static void BufferedReader() {
FileReader fr = null;
BufferedReader bufr = null;
try {
//創(chuàng)建一個(gè)讀取流對(duì)象和文件相關(guān)聯(lián)。
fr = new FileReader("buf.txt");
//為了提高效率遗增。加入緩沖技術(shù)。將字符讀取流對(duì)象作為參數(shù)傳遞給緩沖對(duì)象的構(gòu)造函數(shù)款青。
bufr = new BufferedReader(fr);
String line = null;
while ((line = bufr.readLine()) != null) {
System.out.print(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*public static void BufferedWriter() {
//創(chuàng)建一個(gè)字符寫入流對(duì)象做修。
FileWriter fw = new FileWriter("buf.txt");
//為了提高字符寫入流效率。加入了緩沖技術(shù)。
//只要將需要被提高效率的流對(duì)象作為參數(shù)傳遞給緩沖區(qū)的構(gòu)造函數(shù)即可饰及。
BufferedWriter bufw = new BufferedWriter(fw);
for(int x=1; x<5; x++)
{
bufw.write("abcd"+x);
bufw.newLine();
bufw.flush();
}
//記住蔗坯,只要用到緩沖區(qū),就要記得刷新燎含。
//bufw.flush();
//其實(shí)關(guān)閉緩沖區(qū)宾濒,就是在關(guān)閉緩沖區(qū)中的流對(duì)象。
bufw.close();
}*/
}
四屏箍、SQL題
1.寫一個(gè)sql將表TEST_A(ID,NAME,CODE)中重復(fù)次數(shù)大于2的NAME值打印出來(lái)
select NAME from TEST_A
where NAME in(select NAME from TEST_A group by NAME having count(NAME)>2);
2.用一條SQL 語(yǔ)句 查詢出每門課都大于80 分的學(xué)生姓名student_tb
name kecheng fenshu
張三 語(yǔ)文 81
張三 數(shù)學(xué) 75
select name from student_tb where fenshu in(select fenshu from student_tb group by having min(fenshu)>80);
3.學(xué)生表 如下:student_tb
自動(dòng)編號(hào) 學(xué)號(hào) 姓名 課程編號(hào) 課程名稱 分?jǐn)?shù)
1 2005001 張三 0001 數(shù)學(xué) 69
2 2005002 李四 0001 數(shù)學(xué) 89
3 2005001 張三 0001 數(shù)學(xué) 69
刪除除了自動(dòng)編號(hào)不同, 其他都相同的學(xué)生冗余信息
delete from student_tb where 自動(dòng)編號(hào) not in(select min(自動(dòng)編號(hào)) from student_tb group by 學(xué)號(hào),姓名,課程編號(hào),課程名稱,分?jǐn)?shù))
4.一個(gè)叫 team 的表,里面只有一個(gè)字段name, 一共有4 條紀(jì)錄,分別是a,b,c,d, 對(duì)應(yīng)四個(gè)球隊(duì),現(xiàn)在四個(gè)球隊(duì)進(jìn)行比賽,用一條sql 語(yǔ)句顯示所有可能的比賽組合.
select a.name,b.name from student2 a, student2 b
where a.name<b.name;
5.請(qǐng)用SQL 語(yǔ)句實(shí)現(xiàn):從TestDB 數(shù)據(jù)表中查詢出所有月份的發(fā)生額都比101 科目相應(yīng)月份的發(fā)生額高的科目.請(qǐng)注意:TestDB 中有很多科目,都有1 -12 月份的發(fā)生額.
AccID :科目代碼,Occmonth :發(fā)生額月份,DebitOccur :發(fā)生額.
數(shù)據(jù)庫(kù)名:JcyAudit,數(shù)據(jù)集:Select * from TestDB
select a.* from TestDB as a,(select Occmonth,max(DebitOccur) Debit101ccur from TestDB where AccID= '101' group by Occmonth) b
where a.Occmonth = b.Occmonth and a.DebitOccur > b.Debit101ccur
6. 面試題:怎么把這樣一個(gè)表兒
year month amount
1991 1 1.1
1991 2 1.2
1991 3 1.3
1991 4 1.4
1992 1 2.1
1992 2 2.2
1992 3 2.3
1992 4 2.4
查成這樣一個(gè)結(jié)果
year m1 m2 m3 m4
1991 1.1 1.2 1.3 1.4
1992 2.1 2.2 2.3 2.4
select year,(select amount from table_aa m where month = 1 and table_aa.year = m.year) as m1,() as m2,() as m3 from table_aa
group by year;
7. 說(shuō)明:復(fù)制表( 只復(fù)制結(jié)構(gòu), 源表名:a 新表名:b)
select * into b from a where 1<>1 (where1=1,拷貝表結(jié)構(gòu)和數(shù)據(jù)內(nèi)容)
7. 說(shuō)明:拷貝表( 拷貝數(shù)據(jù), 源表名:a 目標(biāo)表名:b)
insert into b(a, b, c) select d,e,f from a;
8. 說(shuō)明:顯示文章.提交人和最后回復(fù)時(shí)間
select a.title a.name b.adddate from table a ,(select max(adddate) adddate from table where a.title = table.title) b
9. 說(shuō)明:外連接查詢( 表名1 :a 表名2 :b)
select a.a,a.b,a.c,b.c,b.d,b.f from a left outer join b on a.a = b.c
10. 說(shuō)明:日程安排提前五分鐘提醒
select * from 日程安排 where datediff('minute',f 開始時(shí)間,getdate())>5
11. 說(shuō)明:兩張關(guān)聯(lián)表,刪除主表中已經(jīng)在副表中沒(méi)有的信息
Delete from info where not exists (select * from infobz where info.infid=infobz.infid )
12. 有兩個(gè)表A 和B ,均有key 和value 兩個(gè)字段,如果B 的key 在A 中也有,就把B 的value 換為A 中對(duì)應(yīng)的value
這道題的SQL 語(yǔ)句怎么寫?
update b set b.value=(select a.value from a where a.key=b.key) where b.id in(select b.id from b,a where b.key=a.key);
SQL面試題
1 觸發(fā)器的作用?
答:觸發(fā)器是一中特殊的存儲(chǔ)過(guò)程绘梦,主要是通過(guò)事件來(lái)觸發(fā)而被執(zhí)行的。它可以強(qiáng)化約束赴魁,來(lái)維護(hù)數(shù)據(jù)的完整性和一致性卸奉,可以跟蹤數(shù)據(jù)庫(kù)內(nèi)的操作從而不允許未經(jīng)許可的更新和變化。
可以聯(lián)級(jí)運(yùn)算毛雇。如固歪,某表上的觸發(fā)器上包含對(duì)另一個(gè)表的數(shù)據(jù)操作闸溃,而該操作又會(huì)導(dǎo)致該表觸發(fā)器被觸發(fā)。
2 什么是存儲(chǔ)過(guò)程?用什么來(lái)調(diào)用?
答:存儲(chǔ)過(guò)程是一個(gè)預(yù)編譯的 SQL 語(yǔ)句疹鳄,優(yōu)點(diǎn)是允許模塊化的設(shè)計(jì),就是說(shuō)只需創(chuàng)建一次芦岂,以后在該程序中就可以調(diào)用多次瘪弓。如果某次操作需要執(zhí)行多次 SQL ,
使用存儲(chǔ)過(guò)程比單純 SQL 語(yǔ)句執(zhí)行要快盔腔「懿纾可以用一個(gè)命令對(duì)象來(lái)調(diào)用存儲(chǔ)過(guò)程。
3 索引的作用?和它的優(yōu)點(diǎn)缺點(diǎn)是什么?
答:索引就一種特殊的查詢表弛随,數(shù)據(jù)庫(kù)的搜索引擎可以利用它加速對(duì)數(shù)據(jù)的檢索瓢喉。它很類似與現(xiàn)實(shí)生活中書的目錄,不需要查詢整本書內(nèi)容就可以找到想要的數(shù)據(jù)舀透。索引可以是唯一的栓票,
創(chuàng)建索引允許指定單個(gè)列或者是多個(gè)列。缺點(diǎn)是它減慢了數(shù)據(jù)錄入的速度愕够,同時(shí)也增加了數(shù)據(jù)庫(kù)的尺寸大小走贪。
3 什么是內(nèi)存泄漏?
答:一般我們所說(shuō)的內(nèi)存泄漏指的是堆內(nèi)存的泄漏。堆內(nèi)存是程序從堆中為其分配的惑芭,大小任意的坠狡,使用完后要顯示釋放內(nèi)存。當(dāng)應(yīng)用程序用關(guān)鍵字 new 等創(chuàng)建對(duì)象時(shí)遂跟,就從堆中為它分配一塊內(nèi)存逃沿,
使用完后程序調(diào)用 free 或者 delete 釋放該內(nèi)存婴渡,否則就說(shuō)該內(nèi)存就不能被使用,我們就說(shuō)該內(nèi)存被泄漏了凯亮。
4 維護(hù)數(shù)據(jù)庫(kù)的完整性和一致性,你喜歡用觸發(fā)器還是自寫業(yè)務(wù)邏輯?為什么?
答:我是這樣做的边臼,盡可能使用約束,如 check, 主鍵假消,外鍵柠并,非空字段等來(lái)約束,這樣做效率最高富拗,也最方便臼予。其次是使用觸發(fā)器,這種方法可以保證媒峡,
無(wú)論什么業(yè)務(wù)系統(tǒng)訪問(wèn)數(shù)據(jù)庫(kù)都可以保證數(shù)據(jù)的完整新和一致性瘟栖。最后考慮的是自寫業(yè)務(wù)邏輯,但這樣做麻煩谅阿,編程復(fù)雜半哟,效率低下。
5 什么是事務(wù)?什么是鎖?
答:事務(wù)就是被綁定在一起作為一個(gè)邏輯工作單元的 SQL 語(yǔ)句分組签餐,如果任何一個(gè)語(yǔ)句操作失敗那么整個(gè)操作就被失敗寓涨,以后操作就會(huì)回滾到操作前狀態(tài),或者是上有個(gè)節(jié)點(diǎn)氯檐。
為了確保要么執(zhí)行戒良,要么不執(zhí)行,就可以使用事務(wù)冠摄。要將有組語(yǔ)句作為事務(wù)考慮糯崎,就需要通過(guò) ACID 測(cè)試,即原子性河泳,一致性沃呢,隔離性和持久性。
鎖:在所以的 DBMS 中拆挥,鎖是實(shí)現(xiàn)事務(wù)的關(guān)鍵薄霜,鎖可以保證事務(wù)的完整性和并發(fā)性。與現(xiàn)實(shí)生活中鎖一樣纸兔,它可以使某些數(shù)據(jù)的擁有者惰瓜,在某段時(shí)間內(nèi)不能使用某些數(shù)據(jù)或數(shù)據(jù)結(jié)構(gòu)。當(dāng)然鎖還分級(jí)別的汉矿。
6 什么叫視圖?游標(biāo)是什么?
答:視圖是一種虛擬的表崎坊,具有和物理表相同的功能≈弈矗可以對(duì)視圖進(jìn)行增流强,改痹届,查呻待,操作打月,試圖通常是有一個(gè)表或者多個(gè)表的行或列的子集。對(duì)視圖的修改不影響基本表蚕捉。它使得我們獲取數(shù)據(jù)更容易奏篙,相比多表查詢。
游標(biāo):是對(duì)查詢出來(lái)的結(jié)果集作為一個(gè)單元來(lái)有效的處理迫淹。游標(biāo)可以定在該單元中的特定行秘通,從結(jié)果集的當(dāng)前行檢索一行或多行×舶荆可以對(duì)結(jié)果集當(dāng)前行做修改肺稀。一般不使用游標(biāo),但是需要逐條處理數(shù)據(jù)的時(shí)候应民,游標(biāo)顯得十分重要话原。
題目補(bǔ)充
1.寫一個(gè)sql將表TEST_A(ID,NAME,CODE)中重復(fù)次數(shù)大于2的NAME值打印出來(lái)(15)
select NAME from TEST_A
where NAME in(select NAME from TEST_A group by NAME having count(NAME)>2);
2.寫一段代碼獲取結(jié)構(gòu) List<Map<String,String>>中各個(gè)Map,并通過(guò)System.out.println()打印出來(lái)(15)
/**
* 將指定的 結(jié)構(gòu)為 List<Map<String,String>>的參數(shù) 通過(guò)System.out.println()打印出來(lái)
* 格式:"鍵名:鍵值"
* @param List<Map<String,String>>
*
*/
public void printOut(List<Map<String,String>>){
List<Map<String,Object>> list= List<Map<String,String>>
for (int i=0;i<list.size(),i++)
{
Map map=(Map)list.get(i);
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext())
{
String key = (String) iterator.next();
Object object = map.get(key);
}
}
}
3.有類似這樣的一串字符"abcddeffx.asre-321!assra..",請(qǐng)實(shí)現(xiàn)以下方法將字符串各個(gè)字符的出現(xiàn)的次數(shù)統(tǒng)計(jì)出來(lái)
/**
* 將指定的 結(jié)構(gòu)為 List<Map<String,String>>的參數(shù) 通過(guò)System.out.println()打印出來(lái)
* 格式:"鍵名:鍵值"
* @param List<Map<String,String>>
* @return Map<字符,出現(xiàn)的次數(shù)>
*/
public Map<Character,Integer> staticCharcnt(String str){
}
4.在一個(gè)文本文件(文件大小不超過(guò)2k)中存放了很多以空格分隔的英語(yǔ)單詞诲锹,請(qǐng)寫一段偽代碼或用文字描述來(lái)實(shí)現(xiàn)繁仁,已得到?jīng)]有重復(fù)的、且按字典順序排序的所有單詞(20分)
首先實(shí)現(xiàn)做一個(gè)SortedMap,這個(gè)Map的Comparator是根據(jù)字母順序排列的一個(gè)規(guī)則.
5.請(qǐng)用javascript語(yǔ)言解析如下json對(duì)象归园,取出對(duì)象中所有數(shù)據(jù)或?qū)⑵滹@示在頁(yè)面上黄虱。(15)
var user = {
"username" : "andy",
"age" : 25,
"info" : {"tell":"123","cellphone":"13766"}
"address" : [
{"city":"北京建國(guó)門大街"}
{"city":"天津海泰信息廣場(chǎng)"}
]
}
<table border="1">
<tr>
<td>user.username</td>
<td>user.age</td>
<td>user.info.tell</td>
<td>(user.address[0].city</td>
<td>user.address[1].city</td>
</tr>
</table>
6.在項(xiàng)目中一導(dǎo)入jquery1.7庫(kù),請(qǐng)實(shí)現(xiàn)用jquery查找下列表格的第二行第三列的值庸诱。(15)
<table id= "tab">
<tbody>
<tr>
<td>第一行第一列</td>
<td>第一行第二列</td>
<td>第一行第三列</td>
<td>第一行第四列</td>
</tr>
<tr>
<td>第二行第一列</td>
<td>第二行第二列</td>
<td>第二行第三列</td>
<td>第二行第四列</td>
</tr>
</tbody>
</table>
$('#tab tr').eq(1).find('td').eq(2)