Interview須知知識點

1、對於Gitphp

安裝gitmysql

建立目錄,做爲git可追蹤的倉庫,在目錄下使用git init便可,git自動生成.git隱形文件進行追蹤nginx

git只能追蹤文本文件,對於二進制文件不起做用git

在建立的倉庫中,目錄下或者子目錄下,建立文件github

編輯好後,三步走:正則表達式

git addredis

git commit -m 算法

git pushsql

>>>>其餘命令json

git diff 查看修改內容

git log 顯示從最近到最遠的提交日誌 簡化命令:git log --pretty=oneline

HEAD表示當前版本,HEAD^表示上一個版本,HEAD^^^表示上上上個版本,往上100個版本寫100個^寫不過來能夠寫成是HEAD~100

git reset --hard HEAD^ 回退到上一個版本

 

回退到上一個版本後再打git log的話,最新版本的那個信息已經找不到了,穿越了,再想回去怎麼辦

從上次Git log裏面找到最新的版本號,進行回退

git reset --hard 1094a 版本號沒有必要寫全,前幾位就能夠了

可是怎麼找到新版本的版本號呢

git reflog記錄你的每一次命令

場景1:當你改亂了工做區的內容,想直接丟棄工做區的修改時,用命令git checkout -- file

場景2:當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD <file>,就回到了場景1,第二步按場景1操做。

    git reset命令既能夠回退版本,也能夠把暫存區的修改回退到工做區。當咱們用HEAD時,表示最新的版本。

場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。

怎麼刪除文件呢

 

當你要刪除文件的時候,能夠採用命令:rm test.txt

 

這個時候有兩種狀況

 

第一種狀況:的確要把test.txt刪掉,那麼能夠執行 git rm test.txt git commit -m "remove test.txt" 文件被刪除,且刪除記錄上傳本地庫

 

第二種狀況:誤刪文件,想恢復,這時候尚未commit -m "remove test.txt",執行git checkout test.txt將文件恢復。

 

若是執行完git commit -m "remove test.txt"後就不能用checkout恢復了,得用git reset --hard HEAD^

其實只要你用了Git,不管怎麼搞,你均可以找回曾經的任何一個版本的文件,幾遍是rm file或者Git rm file 還 commit,都一回事,你提交也只是提交一個刪除記錄而已,此次版本的文件,他刪除也只是相對於你的工做區目錄,你覺得Git本地倉庫沒有給你保存原文件嗎?永遠會有,只要你記住那個ID



git clone git@github.com:michaelliao/gitskills.git

你也許還注意到,GitHub給出的地址不止一個,還能夠用https://github.com/michaelliao/gitskills.git這樣的地址。實際上,Git支持多種協議,默認的git://使用ssh,但也可使用https等其餘協議。

使用https除了速度慢之外,還有個最大的麻煩是每次推送都必須輸入口令,可是在某些只開放http端口的公司內部就沒法使用ssh協議而只能用https

 

建立dev分支+切換到dev分支

git checkout -b dev = get branch dev 建立分支;git checkout dev 切換分支

git branch 命令查看當前分支

git checkout master 切換回master分支

git merge dev 將dev分支合併到master分支上 git merge用於合併指定分支到當前分支

git branch -d dev 刪除dev分支

在分支開發,開發完成後這樣合併分支:一、先切換到master,git checkout master,二、合併分支,git merge hostfix

 

將分支合併回主幹(master

  將newbranch代碼合併回主幹

    git checkout master

    git merge newbranch

 

  將master代碼合併回分支newbranch

    git checkout newbranch

    git merge newbranch

 

衝突時,輸入git merge featurel時git沒法執行‘快速合併’,只能試圖把各自的修改合併起來,但這種合併就可能會有衝突,這時候必須手動解決衝突後再提

git status 能夠告訴咱們衝突的文件

Git用<<<<<<<=======>>>>>>>標記出不一樣分支的內容,咱們修改後保存

而後再提交

用帶參數的git log也能夠看到分支的合併狀況:

git log --graph --pretty=oneline --abbrev-commit

最後,刪除feature1分支:feature1

有緊急任務時,可使用git stash儲藏起來,

首先肯定要在哪一個分支上修復bug,假定須要在master分支上修復,就從master建立臨時分支

修復完成後,切換到master分支,並完成合並,最後刪除issue-101分支

如今,是時候接着回到dev分支幹活了!

git stash pop

git update-index --assume-unchanged conf/defined.php //git忽略追蹤

 

git拉取分支代碼:

cd ~/Desktop/                 

ls

git clone http://gitlab.i.beebank.com/php-beebank/fengyi.git fengyi

Cloning into 'fengyi'...

remote: Counting objects: 1464, done.

remote: Compressing objects: 100% (1263/1263), done.

remote: Total 1464 (delta 547), reused 532 (delta 89)

Receiving objects: 100% (1464/1464), 2.84 MiB | 4.49 MiB/s, done.

Resolving deltas: 100% (547/547), done.

git branch -a

fatal: Not a git repository (or any of the parent directories): .git

cd fengyi

git branch -a

* master

  remotes/origin/HEAD -> origin/master

  remotes/origin/develop

  remotes/origin/master

git checkout origin/develop -b develop

Branch 'develop' set up to track remote branch 'develop' from 'origin'.

Switched to a new branch 'develop'

git pull

Already up to date.

 

 2、基礎的Linux命令

一、安裝anaconda包

wget https://repo.anaconda.com/archive/Anaconda3-5.3.1-Linux-x86_64.sh

sh Anaconda3-5.3.1-Linux-x86_64.sh

二、遞歸查找當前目錄下,某字符串所在的文件

三、grep 'rds7wvh2b3r70e26m95q.mysql.rds.aliyuncs.com' -ri .

:%s/rds7wvh2b3r70e26m95q.mysql.rds.aliyuncs.com/rds7wvh2b3r70e26m95q389.mysql.rds.aliyuncs.com/g

:%s/8841fe4e95d64e4a.m.cnbja.kvstore.aliyuncs.com/8841fe4e95d64e4a478.redis.rds.aliyuncs.com/g

所有替換的命令爲:

  :%s/s1/s2/g

四、vim 查詢關鍵字 /關鍵字 n向下 N向上

五、跳轉指定行 :n

六、mysqldump -uroot -p visit>/tmp/visit.sql

 

七、添加權限

sudo chmod 777 -R /data2/logs/

八、追蹤變化

tail -f sql.log

九、查看最後多少行數據

tail -n 300 debug.20161101.log

十、刪除多個文件

rm 訂單50041貸款合同.pdf 訂單LsaNvhCEHLyFt貸款合同.pdf 訂單LsbZ8IttgGSXJ貸款合同.pdf

加上-R刪除文件夾

rm -Rf controller.exception  data.exception  index  jobs  service.exception  s.exception  sql.log  timelog

十一、顯示全部進程和其狀態

ps aux|grep nginx

殺死進程:kill -s 9 pid

十二、遠程拷貝(能夠用於 服務器到服務器,在本地拷貝服務器的文件)

scp peng.yu@172.16.22.70:/etc/nginx/vhosts/jydhx.conf .

1三、壓縮&解壓

  1)gzip壓縮

    

     壓縮文件

      $ gzip -v test

      test:   53.1% -- replaced with test.gz

     壓縮會刪掉本地文件。新建test.gz文件

     不刪除文件使用重定向

       $ gzip -c test > test.gz

     解壓縮

       gzip -d test.gz

     查看壓縮後的文件內容,不解壓縮的狀況下。使用zcat命令

      $ zcat test.gz 

  2)bzip2:bzip2是用來取代gzip的壓縮,比gzip壓縮比例還高 

    #壓縮test文件,生成test.bz2

      $ bzip2 -z test

    #保留原文件, 壓縮生成test.bz2

      $ bzip2 -k test

     #解壓縮文件

      $ bzip2 -d test.bz2

    查看壓縮文件內容,使用bzcat

      $ bzcat test.bz2 

  3)tar:爲打包命令。將多個文件打包成一個文件。還包括壓縮參數。

    #建立bzip2壓縮文件

       $ tar -jcv -f test.tar.bz2 test/

    #不解壓縮狀況下查看文件列表

      $ tar -jtv -f test.tar.bz2    

    #解壓縮到當前文件夾

      $ tar -jxv -f test.tar.bz2 

    #解壓縮到指定文件夾test2

      $ mkdir test2

      $ tar -jxv -f test.tar.bz2 -C test2 

 

    #建立gzip壓縮文件

       $ tar -zcv -f test.tar.gz test

    #查看壓縮文件

       $ tar -ztv -f etc.tar.gz

1四、

command+k 切新的一頁

command+m 最小化

 1五、切換php7

ps aux|grep php

root        218  0.0  0.0 295720  6840 ?        Ss   May14   0:46 php-fpm: master process (/etc/php-fpm.conf)                                            

www        7748  0.0  0.0 300428 16292 ?        S    May15   0:00 php-fpm: pool www                                                                      

www        7749  0.0  0.0 300436 15888 ?        S    May15   0:00 php-fpm: pool www                                                                      

www        7750  0.0  0.0 300428 16116 ?        S    May15   0:00 php-fpm: pool www                                                                      

www        7756  0.0  0.0 300424 15632 ?        S    May15   0:00 php-fpm: pool www                                                                      

1104     134330  0.0  0.0 103300   840 pts/0    S+   10:49   0:00 grep php

[huiyun.zhao@22-102 ~]$ sudo service php-fpm stop

Gracefully shutting down php-fpm ... . SUCC

[huiyun.zhao@22-102 ~]$ /data1/

htdocs/ logs/   php/    phplib/ tomcat/ 

[huiyun.zhao@22-102 ~]$ sudo /data1/php/sbin/php-fpm 

 

3、改純js文件須要清緩存

   

 

 4、

催收中心:

$ret_array = json_decode($ret_json, true);//這裏是對json進行解碼

if(json_last_error() !== JSON_ERROR_NONE) {
    throw new Exception('房貸系統,響應數據格式不正確');
}

若是有,返回 JSON 編碼解碼時最後發生的錯誤。該函數沒有參數

 

*json_last_error()的返回值爲常數:

常量

含義

可用性

JSON_ERROR_NONE

沒有錯誤發生

 

JSON_ERROR_DEPTH

到達了最大堆棧深度

 

JSON_ERROR_STATE_MISMATCH

無效或異常的 JSON

 

JSON_ERROR_CTRL_CHAR

控制字符錯誤,多是編碼不對

 

JSON_ERROR_SYNTAX

語法錯誤

 

JSON_ERROR_UTF8

異常的 UTF-8 字符,也許是由於不正確的編碼。

PHP 5.3.3

JSON_ERROR_RECURSION

One or more recursive references in the value to be encoded

PHP 5.5.0

JSON_ERROR_INF_OR_NAN

One or more NAN or INF values in the value to be encoded

PHP 5.5.0

JSON_ERROR_UNSUPPORTED_TYPE

指定的類型,值沒法編碼。

PHP 5.5.0

JSON_ERROR_INVALID_PROPERTY_NAME

指定的屬性名沒法編碼。

PHP 7.0.0

JSON_ERROR_UTF16

畸形的 UTF-16 字符,可能由於字符編碼不正確。

PHP 7.0.0

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';

$data='[{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""},{"Name":"a1","Number":"123","Contno":"000","QQNo":""}]'

//上面是單組元素,下面是多組,就像數組同樣 能夠是$data = [{},{}];也能夠$data[]=‘{}’這樣一個一個添加

//改造json是這樣的外面是單引號,裏面的值都是雙引號,

$array = json_decode($json, true);

if(json_last_error() !== JSON_ERROR_NONE){

        echo '發生錯誤';exit;   

}

echo '沒有發生錯誤';var_dump($array);exit;

 

2、接下來研究下對外接口

 

static我先這樣理解:static只獲取基類的定義的值,self:以後去基類自身的值 //徹底錯誤😂,換種思惟

說明:

self:類內指針,就是寫在哪一個類裏邊,就調用哪一個類裏邊的方法或屬性。

static:使用的這個類會被子類覆蓋,使用的是子類的方法或屬性,就是說父類訪問的是子類的方法或屬性。

//本身理解下:self-在哪一個類中使用就是訪問哪一個類中的屬性/方法。static-會被子類覆蓋,好比說b子類調用A父類,雖說static在A父類中寫的,可是調用的屬性/方法仍是b子類的

例子:

class a{

    public static function who(){

        echo "my name is xiaofeng";

    }

    public static function name(){

        self::who();

    }

}

class b extends a{

    public static function who(){

        echo "my name is xiaoma";

    }

    public static function name(){

        static::who();

    }

}

a::name();

b::name();

輸出:

a、my name is xiaofeng

b、my name is xiaoma

    • sort() - 以升序對數組排序
    • rsort() - 以降序對數組排序
    • asort() - 根據值,以升序對關聯數組進行排序
    • ksort() - 根據鍵,以升序對關聯數組進行排序
    • arsort() - 根據值,以降序對關聯數組進行排序
    • krsort() - 根據鍵,以降序對關聯數組進行排序

 5、

$string = '

        hahahahha yyyyyy ;

hahahah   yyyyyy

 

eeee

eeeeeeeeeee

heiehieheiehiehieheiehi

 

';

 

$strn = str_replace(["\r\n", "\r", "\n", "\t", "\0", "\x0B", " "], '', $string);

 

 

$string = '

        hahahahha yyyyyy ;

hahahah   yyyyyy

 

eeee

eeeeeeeeeee

heiehieheiehiehieheiehi

 

';

 

$strn = str_replace(["\r", "\n", "\t"," "], '', $string);這個是能夠去空格、換行和製表符之類的

輸出的是:

string(67) "hahahahhayyyyyy;hahahahyyyyyyeeeeeeeeeeeeeeeheiehieheiehiehieheiehi"

 

array_slice()對數組進行切割 array_slice($array, 1, 2);切出來的是第一個和第二個

 

6、研究算法 

7、

CREATE TABLE dept

              (

                d_no INT NOT NULL PRIMARY KEY AUTO_INCREMENT,    //部門編號

                d_name VARCHAR(50),                    //部門名稱

                d_location VARCHAR(100)                  //部門地址

              );

               CREATE TABLE employee 

               (

                e_no INT NOT NULL PRIMARY KEY,    //員工編號

                e_name VARCHAR(100) NOT NULL,    //員工姓名

                e_gender CHAR(2) NOT NULL,      //員工性別

                dept_no INT NOT NULL,         //部門編號

                e_job VARCHAR(100) NOT NULL,    //職位

                e_salary SMALLINT NOT NULL,     //薪水

                hireDate DATE,             //入職日期

                CONSTRAINT dno_fk FOREIGN KEY(dept_no) REFERENCES dept(d_no)

               );

select * from employee e join dept d on e.dept.no=d.d_no where d.d_no=20;

select *,sum(e_salary) ss from employee group by dept_no 

select e_no,e_name,max(e_salary) from employee group by dept_no;

select e.e_name,d.d_name,d.location from employee e join dept d on e.dept_no=d.d_no where e.name=‘blake’;

select dept_no,count(e_name) from employee group by dept_no;

select e_job,sum(e_salary) from employee group by e_job;

select * from employee order by dept_no desc,e_salary desc;

select * from employee where e_name like ‘’

select * from employee where (year(now())-year(hireDate))>10;

select e_name,e_job from employee where dept_no=(select d_no from dept where d_location=‘beijing’);

 

 

LIKE: 至關於模糊查詢,和LIKE一塊兒使用的通配符有  "%"、"_"  

                 "%":做用是能匹配任意長度的字符。

                 "_":只能匹配任意一個字符

             SELECT * FROM fruits WHERE f_name LIKE 'b%';  //f_name以b字母開頭的全部記錄

SELECT * FROM fruits WHERE f_name LIKE 'b%y';  //f_name以b字母開頭,y字母結尾的全部記錄

SELECT * FROM fruits WHERE f_name LIKE '____y'  //此處有四個_,說明要查詢以y字母結尾而且y以前只有四個字符的記錄

總結:'%'和'_'能夠在任意位置使用,只須要記住%可以表示任意個字符,_只能表示一個任意字符

SELECT * FROM 表名 WHERE 字段名 IS NULL;  //查詢字段名是NULL的記錄

SELECT * FROM 表名 WHERE 字段名 IS NOT NULL;  //查詢字段名不是NULL的記錄

使用DISTINCT就能消除重複的值

SELECT DISTINCT s_id FROM fruits;

SELECT s_id, COUNT(f_name), GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id;

解釋:

                COUNT():這個是下面要講解到的一個函數,做用就是計算有多少條記錄, 

                GROUP_CONCAT(): 將分組中的各個字段的值顯示出來 

               SELECT s_id, COUNT(f_name), GROUP_CONCAT(f_name), GROUP_CONCAT(f_price) FROM fruits GROUP BY s_id;

分組以後還能夠進行條件過濾,將不想要的分組丟棄,使用關鍵字 HAVING

              SELECT s_id,COUNT(f_name),GROUP_CONCAT(f_name) FROM fruits GROUP BY s_id HAVING COUNT(f_name) > 1;//他可以過s_id分組,而後過濾出水果種類大於1的分組信息。

總結:

                 知道GROUP BY的意義,而且會使用HAVING對分組進行過濾, HAVING和WHERE都是進行條件過濾的,區別就在於 WHERE 是在分組以前進行過濾,而HAVING是在分組以後進行條件過濾。

給字段名取別名的緣由是有些字段名是爲了顯示更加清楚,好比

                SELECT f_price AS '價格' FROM fruits;

子查詢

ANY關鍵字接在一個比較操做符的後面,表示若與子查詢返回的任何值比較爲TRUE,則返回TRUE,通俗點講,只要知足任意一個條件,就返回TRUE。

                 SELECT num1 FROM tb11 WHERE num1 > ANY(SELECT num2 FROM tb12);//這裏就是將在tb12表中查詢的結果放在前一個查詢語句中充當條件參數。只要num1大於其結果中的任意一個數,那麼就算匹配。

使用ALL時表示須要同時知足全部條件。

                SELECT num1 FROM tb11 WHERE num1 > ALL(SELECT num2 FROM tb12);  //num1須要大於全部的查詢結果纔算匹配

EXISTS關鍵字後面的參數是任意一個子查詢,若是子查詢有返回記錄行,則爲TRUE,外層查詢語句將會進行查詢,若是子查詢沒有返回任何記錄行,則爲FALSE,外層查詢語句將不會進行查詢。

                SLEECT * FROM tb11 WHERE EXISTS(SELECT * FROM tb12 WHERE num2 = 3);  //查詢tb12中有沒有num2=3的記錄,有的話則會將tb11的全部記錄查詢出來,沒有的話,不作查詢

這個IN關鍵字的做用跟上面單表查詢的IN是同樣的,不過這裏IN中的參數放的是一個子查詢語句。

                SELECT s_id,f_id,f_name

                FROM fruits

                WHERE s_id IN(SELECT s_id FROM suppliers WHERE s_id = 107);

兩張表: employee(員工)表和dept(部門)表。

              CREATE TABLE dept

              (

                d_no INT NOT NULL PRIMARY KEY AUTO_INCREMENT,    //部門編號

                d_name VARCHAR(50),                    //部門名稱

                d_location VARCHAR(100)                  //部門地址

              );

               CREATE TABLE employee 

               (

                e_no INT NOT NULL PRIMARY KEY,    //員工編號

                e_name VARCHAR(100) NOT NULL,    //員工姓名

                e_gender CHAR(2) NOT NULL,      //員工性別

                dept_no INT NOT NULL,         //部門編號

                e_job VARCHAR(100) NOT NULL,    //職位

                e_salary SMALLINT NOT NULL,     //薪水

                hireDate DATE,             //入職日期

                CONSTRAINT dno_fk FOREIGN KEY(dept_no) REFERENCES dept(d_no)

          

     );

4.2.2、在employee表中,查詢dept_no等於1020的全部記錄

方式一:SELECT * FROM employee WHERE dept_no IN(10,20);

方式二:SELECT * FROM employee WHERE dept_no = 10 OR dept_no = 20;

4.2.3、在employee表中,查詢工資範圍在800~2500之間的員工信息

SELECT * FROM employee WHERE e_salary BETWEEN 800 AND 2500;

4.2.四、在employee表中,查詢部門編號爲20的部門中的員工信息

SELECT * FROM employee WHERE dept_no = 20;

4.2.5、在employee表中,查詢每一個部門最高工資的員工信息

分析:每一個員工均可能處於不一樣的部門,要先找出每一個部門中的全部員工,應該想到分組,將相同部門的員工分爲一組。而後在使用MAX()函數比較最大的salary。注意不要MAX(GROUP_CONCAT(e_salary)), 這樣寫就會報錯,GROUP_CONCAT(e_salary)是將分組中全部的e_salary顯示出來,咱們直接MAX(e_salary)就會將該分組中全部的e_salary進行比較,拿到最大的一份。

SELECT e_no,e_name,MAX(e_salary) FROM employee GROUP BY dept_no;

4.2.6、查詢員工BLAKE所在部門和部門所在地

分析:看下題目就應該知道是兩張表,也就應該使用鏈接查詢,找出是用內鏈接仍是外鏈接,而後找出鏈接條件,

方式一:SELECT d.d_no,d.d_name,d.d_location FROM employee AS e,dept AS d WHERE e.e_name = 'BLAKE' AND e.dept_no = d.d_no;

方式二:SELECT d.d_no,d.d_name,d.d_location FROM employee AS e INNER JOIN dept AS d ON e.e_name = 'BLAKE' AND e.dept_no = d.d_no;

4.2.7、使用鏈接查詢,查詢全部員工的部門和部門信息

               分析:這個題跟上面哪一個題差很少,使用內鏈接

              SELECT e.e_no,e.e_name,d.d_no,d.d_name,d.d_location

              FROM employee AS e INNER JOIN dept AS d

              ON e.dept_no = d.d_no;

4.2.8、在employee中,計算每一個部門各有多少員工

              分析:每一個部門用分組

              SELECT COUNT(e.e_name)

              FROM employee AS e  

              GROUP BY e.dept_no   

4.2.9、在employee表中,計算不一樣類型職員的總工資數

              分析:對員工職位類型進行分組

              SELECT e.e_job,SUM(e.e_salary)

              FROM employee AS e

              GROUP BY e.e_job;

4.2.10、在employee表中,計算不一樣部門的平均工資

               分析:對部門進行分組

               SELECT e.dept_no,AVG(e.e_salary)

               FROM employee AS e

               GROUP BY e.dept_no;

4.2.十二、在employee表中,將查詢記錄先按部門編號由高到低排列,再按員工工資由高到低排列

                SELECT * FROM employee ORDER BY dept_no DESC,e_salary DESC;

4.2.13、在employee表中,查詢員工姓名以字母AS開頭的員工信息

方式一: SELECT * FROM employee WHERE e_name LIKE 'A%' OR e_name LIKE ’S%’;//用的是like

方式二:SELECT * FROM employee WHERE e_name REGEXP '^A' OR e_name REGEXP '^S’;//用的是正則表達式

4.2.14、在employee表中,查詢到目前爲止,工齡大於等於10年的員工信息

方式一:SELECT * FROM employee WHERE (YEAR(NOW()) - YEAR(hireDate)) > 10; 

方式二:SELECT * FROM employee WHERE (YEAR(CURDATE()) - YEAR(hireDate)) > 10;

解釋:記得咱們前一節學的數據類型嗎,其中CURDATE()表明的是YYYY-MM-DD, NOW()表明的是YYYY-MM-DD HH:MM:SS,因此這裏兩個度能用,只要將其截取爲爲YEAR,而後相減,就能獲得相差幾年了。

4.3.四、查詢名字以字母N或者S結尾的記錄

方式一:

                     SELECT * FROM employee WHERE e_name LIKE '%N' OR e_name LIKE '%S'; 

方式二:

                     SELECT * FROM employee WHERE e_name REGEXP 'N$' OR e_name REGEXP 'S$';

4.3.五、查詢在BeiJing工做的員工的姓名和職務

方式一:SELECT e_name,e_job FROM employee WHERE dept_no = (SELECT d_no FROM dept WHERE d_location = 'BeiJing');

方式二:SELECT e.e_name, e.e_job FROM employee AS e,dept AS d WHERE e.dept_no = d.d_no AND d.d_location = 'BeiJing';

相關文章
相關標籤/搜索