SQL語句之select


1、數據庫導入

場景:開發給測試一個SQL腳本和一個SQL語句命令,SQL腳本中的數據都已經寫好,測試只用進行導入操作即可。

測試導入外部數據(SQL腳本)到數據庫的步驟:打開控制台,先進入要導入的sql腳本的目錄下,然后執行SQL語句命令:mysql -u root -p <employees.sql

 

 

 

 2、數據查詢

2.1所有字段限量查詢

當一個表中有很多條數據時,我們需要查詢表中的前n條數據所有字段的內容時,用的命令為:select * from employees limit n;

employees:表示查詢的表的名稱;

limit 5:表示想要查詢前5條數據;

2.2部分字段的限量查詢

當一個表中有很多條數據,但我們只想查詢表中的前n條數據的某些字段的內容,用的命令為:select first_name,gender from employees limit n;

 first_name,gender:表示想要查詢的字段;

2.3查詢表中數據的條數

查詢表中的數據的條數用的命令為:select count(*) from employees;或者用命令:select count(1) from employees;

 count(*)/count(1):表示總數的意思;

查詢表中某個字段的數據的條數使用的命令為:select count(emp_no) from salaries;

 

 ount(emp_no) :表示查看emp_no的數據的總數;

2.4並且查詢:and

當我們需要在一個有很多條數據的表中查詢到同時滿足某些條件的數據時,我們使用的命令為:

select * from employees where first_name="Georgi" and gender="M"and hire_date="1989-01-31";

 

 

where:定位詞,表示查詢的數據定位到哪里;

first_name="Georgi" and gender="M"and hire_date="1989-01-31":查詢的條件語句,表示查詢同時滿足這三個條件的結果;

a and b:表示需要同時滿足a和b;

2.5或者查詢:or

當我們需要在一個有很多條數據的表中查詢到滿足其中部分條件的數據時,我們使用的命令為:

select * from employees where first_name="Georgi" and last_name="Ariola"or hire_date="1989-01-31"limit 10;

 

 

first_name="Georgi" and last_name="Ariola"or hire_date="1989-01-31":查詢的條件語句,表示需要滿足first_name="Georgi" 並且 last_name="Ariola"或者hire_date="1989-01-31";

a or b:表示需要滿足a或者b任意一個;

2.6包含查詢:in

當我們需要在一個有很多條數據的表中查詢到包含某個或某些條件的數據時,我們使用的命令為: select * from employees where first_name in("herbert") limit 10;

 

 

 

first_name in("herbert"):表示查詢first_name中包含herbert的數據;

in(x):表示包含x內容;

2.7范圍查詢:between and

當我們需要在一個有很多條數據的表中篩選某個字段的范圍,這個范圍包含頭與尾,使用的命令為:

select * from employees where hire_date between "1989-07-22" and "1990-12-28";

 

 

 hire_date between "1989-07-22" and "1990-12-28":表示查詢hire_date的范圍在1989-07-22(包括)到1990-12-28(包括)的數據;

between a and b:表示范圍在a和b之間,包括a和b;

2.8否定查詢:not

當我們需要在一個有很多條數據的表中查詢某些字段不包含某個條件(范圍)的數據時,用的命令為:

select * from employees where first_name not in("herbert") limit 10;

select * from employees where hire_date not between "1989-07-22" and "1990-12-28"limit 5;

 

 

first_name not in("herbert"):表示查詢first_name中不包含herbert的數據;

hire_date not between "1989-07-22" and "1990-12-28":表示查詢hire_date的范圍不在1989-07-22(包括)到1990-12-28(包括)的數據;

not in(a):表示不包含a/not between a and b:表示范圍不在a(包括)和b(包括)之間;

2.9模糊查詢:%匹配任意字符

當一個表中有很多條數據,我們想要查詢包含某些關鍵詞的數據,但是關鍵詞我們又記憶不清時,使用的命令為:

select * from employees where first_name like "h%" limit 10; h后面匹配任意字符

select * from employees where first_name like "%s%" limit 10;  在s前后匹配任意字符

 

 

 

如當匹配的關鍵字后/前為er時,使用的命令為:

select * from employees where first_name like "%er" limit 10;   關鍵字后面為er

select * from employees where first_name like "er%" limit 10;   關鍵字前面為er

 

 

 2.10模糊查詢:_代表一個字符串

當一個表中有很多條數據,我們想要查詢包含某些關鍵詞的數據,但是關鍵詞中有幾個字符我們又記憶不清,使用的命令為:

select * from employees where first_name like "_ _ _ka%" limit 10;

 

 

first_name like "_ _ _ka%":表示查詢first_name中第四、五個字符為ka的內容;

like %a%:表示包含a;

2.11模糊查詢:^代表以什么開頭

當我們需要從一個有很多數據的表中,查詢到以某個(些)字符開頭的數據時,我們用的命令為:

select * from employees where first_name rlike "^ch" limit 10;

 

 

 first_name rlike "^ch":表示查詢first_name中以ch開頭的內容;

rlike ^a:表示以a開頭;

2.12模糊查詢:$代表以什么結尾

當我們需要從一個有很多數據的表中,查詢到以某個(些)字符結尾的數據時,我們用的命令為: select * from employees where first_name rlike "ra$" limit 10;

 

 

first_name rlike "ra$" :表示查詢first_name中以ra結尾的內容;

rlike a$:表示以a結尾;

2.13別名:as表示設置別名

當我們需要更直觀的看到某個數據時,我們可以給其設置別名,命令為:select count(*) as total from empliyees;

 

 

count(*) as total:表示把count(*)的別名設置為total;

a as b:表示把a的別名設置為b;

2.14排序:order by表示對查詢結果進行排序

當我們需要對查詢的結果進行排序時,我們使用的命令為:

select * from salaries order by salary desc limit 10;

select * from salaries order by salary asc limit 10;

其中desc表示正序,而asc表示倒序,如果不使用關鍵字,默認為倒序排列。

 

 

 order by salary desc/asc:表示把salary從高到低/從低到高排列;

order by a :表示給a排序;

2.15group by:表示對相同結果進行聚合

聚合函數:

當我們查詢某一個表中某個字段的數據的條數,並把相同結果進行聚合后作為結果顯示出來,使用的命令為:

select gender,count(1)  from employees group by gender;

 

 

gender,count(1):表示查詢gender字段的數據條數;

a,count(1/*):表示查詢a的所有數據總數;

group by gender:表示把gender中相同的數據聚合起來;

group by a:表示把a中相同的數據聚合起來;

比如:把salary字段的所有數據,相同的進行數據聚合在一起,然后根據數據的多少按照從高到低的順序進行排列,並把count(1)的別名設置為count,使用的命令為:

select salary,count(1) as count from salaries group by salary order by count desc limit 5;

 

 

salary,count(1):表示查詢salary數據的總數;

count(1) as count:表示把count(1)的別名設置為count;

group by salary:表示把salary中相同的數據聚合起來;

order by count desc:表示根據數據聚合后的多少按照從高到低的順序進行排列;

2.16最大:max表示查詢最大值

當我們需要查詢某個表中某個字段的最大值時,使用的命令為:select max(salary) from salaries;

 

 

 max(salary):表示查詢salary中的最大值;

2.17最小:min表示查詢最小值

當我們需要查詢某個表中某個字段的最小值時,使用的命令為:select min(salary) from salaries;

 

 

 min(salary):表示查詢salary中的最小值;

2.18平均:avg表示查詢平均值

當我們需要查詢某個表中某個字段的最小值時,使用的命令為:select avg(salary) from salaries;

 

 

 avg(salary) :表示查詢salary的平均值;

2.19總和:sum表示和值

當我們需要查詢某個表中某個字段的和值時,使用的命令為:select sum(salary) from salaries;

 

 

 sum(salary):表示查詢salary的和值;

2.20年份:year表示顯示年份

當我們需要僅顯示表中的日期的年份時,用的命令為:select year(from_date) from salaries limit 10;

 

 

 year(from_date):表示僅顯示from_date的年份;

如:按照年份,對員工的薪資進行從⾼到低的進行排序的命令:

select year(from_date) as dateYear,sum(salary) as sumSalary from salaries group by dateYear order by sumSalary desc;

 

 year(from_date):表示僅顯示from_date的年份;

year(from_date) as dateYear:表示把year(from_date) 的別名設置為dateYear;

sum(salary):表示查詢salary的和值;

sum(salary) as sumSalary:表示把sum(salary)的別名設置為sumsalary;

group by dateYear:表示把dateYear中相同的聚合到一起;

order by sumSalary desc:表示將sumSalary從高到低進行排列;

2.21去重:distinct表示去掉重復

當我們在查詢某項數據,需要去掉里面重復的內容時,使用的命令為:select distinct title from titles;

 

 distinct title:表示去掉title中重復的內容;

2.22過濾:having

當我們在查詢某項數據,需要過濾里面部分的內容時,使用的命令為: 

select salary from salaries having salary>70000 limit 10;

 select salary from salaries having salary<70000 limit 10;

select salary from salaries having salary=70000 limit 10;

 

select salary from salaries:從salaries中獲取salary的數據;

having salary>/</=70000:取salary大於/小於/等於70000的數據;

如:找到平均薪資超過140000的員工,使用的命令為: select emp_no,avg(salary) as avg from salaries group by emp_no having avg>140000 order by avg desc;

 

emp_no,avg(salary) as avg:查詢員工的編號和平均薪資;

avg(salary) as avg:表示把avg(salary)的別名設置為avg;

group by emp_no:表示把emp_no中相同的聚合在一起;

having avg>140000:表示選取avg大於140000;

 

3、關聯

把多個表通過一個唯一值進行關聯起來的過程。

3.1關聯:表格的創建

如我們通過一個人的身份證信息(code)把一個人的個人信息(person)、工作經歷(work)、教育經歷(educate)三個表關聯起來:

 

 

 

 3.2關聯:數據的插入

插入一條數據,以身份證信息1001進行關聯:

 

 

3.3關聯:數據的查詢

所用到的表的字段:

 

 

 所用到的表中的數據:

 

 

 

3.3.1內連接(inner join)

 

 

 當我們要查詢關聯的表中的某些字段的內容時,我們需要通過內關聯將有關聯的表中的字段關聯起來,使用的命令為:

select person.name,person.age,work.copany,educate.schoolname from person inner join work on person.code=work.code inner join educate on work.code=educate.code where person.code=1001;

 

person.name,person.age,work.copany,educate.schoolname:想要獲得的內容的字段;

inner json:表示內關聯,即所有表中共有的數據;

work on person.code=work.code:表示person和work兩個表通過code關聯;

on:表示通過什么進行關聯;

where person.code=1001:表示提取code為1001的這條數據中的內容。

 3.3.2外連接

3.2.2.1左連接(left join)

獲取左表所有記錄,獲取左邊數據表所有符合要求的字段數據信息。

 

 

 當我們想要查詢左表的所有信息,但是又想要查詢右表某些字段的信息,我們就可以用左連接。用左連接,我們查詢到的是左表的所有信息,右表的部分字段的能與左表匹配的信息,無法匹配的

顯示為空,如果有多個表,左連接取最左邊的表。如我們在表person、work、workinfo中查詢person表中所有的人的姓名、年齡、公司、薪資、工作類型和工作是否安全,我們所用的命令為:

select p.name,p.age,w.copany,w.salary,i.taple,i.issafe from person as p left join work as w on p.code=w.code left join workinfo as i on w.w_id=i.w_id;

 

 

p.name,p.age,w.copany,w.salary,i.taple,i.issafe:表示想要查詢的字段;

person as p:把person的別名設置為p;

left join:左連接;

person as p left join work as w:person與work左連接;

work as w:把work的別名設置為w;

on p.code=w.code:person和work通過code連接;

left join workinfo as i on w.w_id=i.w_id:work和workinfo通過w_id左連接;

3.2.2.2右鏈接

獲取右表所有記錄的信息,獲取右邊數據表所有的數據信息。

 

 

 

當我們想要查詢右表的所有信息,但是又想要查詢左表某些字段的信息,我們就可以用右連接。用右連接,我們查詢到的是右表的所有信息,左表的部分字段的能與右表匹配的信息,無法匹配的

顯示為空,如果有多個表,右連接取最右邊的表。如我們在表work、workinfo中查詢workinfo表中所有的人的公司、薪資、工作類型和工作是否安全,我們所用的命令為:

select w.company,w.salary,i.type,i.issafe from work as w right join workinfo as i on w.w_id=i.w_id;

 

 

w.company,w.salary,i.type,i.issafe:表示要查詢的字段;

work as w:把work的別名設置為w;

right join:右鏈接;

work as w right join workinfo as i:把work與workinfo右鏈接;

on w.w_id=i.w_id:work和workinfo通過w_id連接;

(1)又如:在表person、work、workinfo、educate、schoolinfo表中用右鏈接查詢名字、年齡、公司、薪資、工作類型、公作是否安全、學校名稱、學位、學校類型,用的命令為:

select p.name,p.age,w.company,w.salary,wi.type,wi.issafe,e.schoolname,si.degree,si.schooltype from person as p right join work as w on p.code=w.code right join workinfo as wi on w.w_id=wi.w_id right join educate as e on w.code=e.code right join schoolinfo as si on e.s_id=si.s_id;

查詢結果如下:

 

 

p.name,p.age,w.company,w.salary,wi.type,wi.issafe,e.schoolname,si.degree,si.schooltype:查詢的字段;

person as p right join work as w on p.code=w.code:person和work通過code右鏈接;

right join workinfo as wi on w.w_id=wi.w_id:work和workinfo通過w_id右鏈接;

right join educate as e on w.code=e.code:work和educate通過code右連接;

right join schoolinfo as si on e.s_id=si.s_id:schoolinfo和educate通過s_id右鏈接;

(2)又如需求: 查詢出姓名,學歷,學校類型

 

 3.3.3子查詢

子查詢就是以in中的查詢結果為條件查詢in語句前面的,如命令:select * from person where code in(select code from work);就是指以select code from work的查詢結果為條件,然后在

person中進行查詢。

 

 那么就是在person中查詢code為1001和1002這兩條數據。

 4、索引

在MySQL中,創建MySQL的索引主要是為了提⾼MySQL查詢的效率。但是添加太多的索引也是會降低更新表的速度的。一般情況下,當數據超過百萬條時會添加索引。

4.1添加索引

(1)創建表的時候添加索引,如創建info表時給name添加索引:其中index是添加索引的命令,FN是name的索引字符,name是需要添加索引的字段。

 

 查看表的SQL腳本:

 

 (2)更新表的時添加索引,如給info表的id添加索引: alter table info add index FI(id);

 

 查看SQL腳本:

 4.2查看索引

查看某個表格中添加的索引:show index from info(表的名稱);

 

 

4.3刪除索引

如刪除name的索引: drop index FN(name的索引字符) on info;

 

  查看SQL腳本:

 4.4什么情況下設置了索引但無法使用

(1)以“%”開頭的LIKE語句,模糊匹配

(2)OR語句前后沒有同時使用索引

(3)數據類型出現隱式轉化(如varchar不加單引號的話可能會自動轉換為int型)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM