mysql詳解

select 查詢類型:單表查詢、多表查詢,子查詢

select * from tb_name; 查詢表中所有字段

select field1,field2 from tb_name; 投影,只顯示每個實體中的field1、field2

select * from tb_name where 條件; where進行條件查詢

例:

>select name ,age from students;

>select name,age from students where age >10;

>select name,age from students where gender='F';


還可以讓相同的值只顯示一次進行查詢:

>select distinct gender from students; 這樣最多顯示兩個結果M和F


from字句:要查詢的關係 表、多個表及其他select語句

where字句:布爾關係式 > < = >= <= + - * and or not between...and...等

例:

>select name,age from students where age+1>20;

>select name from students where age>20 and gender='F';

>select name,age,gender from students where not age>20 and not gender='M';

查詢年齡不大於20,且不爲‘M’的name,age,gender從students表中

或者

>select name,age,gender from students where not(age>20 or gender='M');


>select name,age,gender from students where age>=20 and age<=25;

或者

>select name,age,gender from students where age between 20 and 25;


like '通配符'

%:表示任意長的任意字符

_:表示任意單個字符

例:

>select name,age,gender from students where name like 'y%'

查詢所有以y開頭的name,顯示name,age,gender從students表中


>select name,age,gender from students where name like 'y____';

查詢所有以y開頭後面跟着四個字符的


>select name,age,gender from students where name like '%zhao%';

查詢所有名稱中包含zhao的


rlike '正則表達式'

>select name,age,gender from students where name rlike '^[znx].*$';

查詢所有以z或n或x開頭的mc


做離散取值:

>select name,age,gender from students where age in (18,20,23,25.27,29,30);

查詢出年齡爲18,28,23,25,27,29,30的


>select name from students where cid is not null;

>select name from students where cid is null;


order by排序,asc或desc,默認爲asc(升序)

>select name from students where cid is not null order by desc;

查詢出cid不爲空的,在按照降序進行排序

>select name from students where cid is not null order by asc;

查詢出cid不爲空的,在按照升序進行排序


as爲字段取別名

>select name as students_name from students;

查詢出name,但其顯示出的字段爲students_name


select還可以進行算數運算

mysql> select 2+1;

+-----+

| 2+1 |

+-----+

|   3 |

+-----+


mysql> select 2*6;

+-----+

| 2*6 |

+-----+

|  12 |

+-----+


mysql> select 2+6 as sum;

+-----+

| sum |

+-----+

|   8 |

+-----+


limit offset,count (偏移量,顯示個數)

>select name as students_name from students limit 2;

只顯示前兩個,並給別名

>select name as students_name from students limit 2,3;

每隔兩個顯示一顯示,共顯示3個 


聚合 avg、sum、count、max、min 平均 和 總數 最大 最小

>select avg(age) from students;  顯示平均年齡

>select max(age) from students;  顯示最大年齡

>select avg(age) from students where gender='F'; 顯示所有女性的平均年齡


group by 將某個關鍵字進行分組,在從分組中進行選擇或者統計(先分組在選擇)

>select age,gender from students group by gender;

先按照性別分爲F或者M組,再顯示age,gender

>select avg(age) from students group by gender;

先按照性別進行分組,再分別顯示兩組的平均年齡(即求男和女的各自平均年齡)


>select count(course) as person,course from students group by course;

先按照course(課程)分組,在統計每個課程的選修人數,顯示結果爲person


having 對group by的結果再次進行過濾,只能與group by連用

>select count(course) as person,course from students group by course having person>=2;

按照course進行分組,然後統計每個course的總數並取別名爲person,最後將統計數大於2的顯示出來


多表查詢

表連接:交叉連接,笛卡爾連接,自然連接,外連接,自連接


自然連接如:

>select * from students,courses where student.cid1=courses.cid;

>select students.name,courses.cname from students,courses where students.cid1=courses.cid;

>select s.name,c.cname from students as s,courses as c where s.cid1=c.cid;

students表別名爲s,courses表別名爲c,並在s表的cid1與c表的cid相等時,顯示出s表的name和c表的cname


外連接,分爲左外連接...left join...on...和右外連接...right join...on...

>select s.name,c.name from students as s left join courses as c on s.cid1=c.cid;

已左邊的表(s)爲標準,左邊表有的則顯示且當s.cid1=c.cid


>select s.name,c.cname from students as s right join course as c on s.cid1=c.cid;

以右邊的表(c)爲標準,右邊表有的則顯示且當s.cid1=c.cid



自連接:要查的也屬於自己的一部分,如sid爲1的tid爲3,而tid爲3的表示sid=3

>select s.name as stu,c.name as teacher from students as s,students as c where c.tid=s.cid;

爲students起了兩個別名,前面的爲s,後面的爲c,並查詢s表的name、別名爲stu,和c表的name、別名爲teacher(s和c都是students表)


子查詢

在比較操作中使用子查詢,子查詢只能返回單值

>select name from students where age in (select avg(age) from students);

查詢出大於平均年齡的name

注:因爲要做比較,所以括號中的查詢結果只能是一個單值


in()和not in()使用子查詢,其子查詢不必爲單值

>select name from students where age in (select age from tutors)

找出tutors表和students表中年齡一樣的name


在from中使用子查詢

>select name,age from (select name,age from students) as t where t.age>=20;

將查找到的結果起別名爲t,在從t中找出年齡>=20的name,age


聯合查詢:union

>(select name,age from students) union (select name,age from tutors);

將students表和tutors表的查詢結果一起顯示


>select cname from courses where cid not in (select distinct cid2 from students where cid2 is not null);

先找出students表中不爲空的cid2且結果不能重複,再找出courses表中cid和students表中cid2不一樣的,最後將cname顯示出來


>select tname from tutors where tid not in (select distinct tid from courses);

>select cid1 from students group by cid1 having count(cid1) >=2;

先按照cid1進行分組,並選出cid1的總數大於等於2的cid1,最後將符合條件的cid1顯示出來


>select cname from courses where cid in (select cid1 from students group by cid1 having count(cid1)>=2);

先對students表按照cid1進行分組,再選出cid1>=2的cid1,當courses表中的cid與students表中選出的cid1向同時,顯示出course表的cname

>select t.tname,c.cname from tutors as t left join courses as c on t.tid=c.tid;

tutors表別名我t,course表別名我c,以左邊的表(t)爲標準顯示且要t.tid=c.cid 


三張表查詢

>select name,cname,tname from students,courses,tutors where students.cid1=courses.cid and

courses.tid=tutors.tid;


視圖;存儲下來的select語句,基於基表的查詢結果;視圖也成爲虛表,它依賴的表成爲基表

物化視圖:可以將查詢結果保存下來(但基表更新後,物化視圖也要跟新,且MySQL不支持物化視圖及在上面創建索引)


一般來說不允許向視圖中插入數據,視圖也是一張表(虛表)

>create view myview as select name,cname,tname from students,courses,tutors where students.cd1=courses.cid and courses.tid=tutors.tid;

創建一個叫做myview的視圖,其保存的查詢結果爲下面的select語句

>select name,cname,tname from students,courses,tutors where students.cd1=courses.cid and courses.tid=tutors.tid;

>select * from myview; 則可以直接查看保存的結果(myview就是一個表(虛))

>show create view sct; 可以查看創建此視圖時使用的語句


mysql -e 此選項允許在shell命令行不用登陸mysqld就可以執行並將結果顯示出來

例:

#mysql -e 'create database mydb;' 直接在shell命令中創建一個數據庫mydb

#mysql -e 'show databases;'     直接在shell中顯示數據庫

#mysql -e "insert into students(name,age) values ('zxl','23');" 直接在shell中向數據庫插入值

注:小心最外面的引號與()中單引號衝突,所以最外面換成雙引號。

因此mysql -e選項可以方便的將sql語句寫長腳本,從而自動執行


>select * from tutors order by tid desc limit 1;

對tid進行降序排列,並且顯示第一個實體;即顯示tid最大的那一行。

以下是三種插入方法

1>insert into tutors set tname='zxl',gender='M',age='23';


2>insert into tutors(tname,gender,age) select name,gender,age from students where age>20;

找出students表中年齡大於20的,並將name,gender,age差入到tutors表的name,gender,age字段


3>insert into student(name,cid) values ('zxl',1),('Fade',2);


delete刪除

>delete from tb_name where 條件;(支持order by,limit等修飾)

例:

>delete from students where age>=23;

將表students中年齡大於23的實體全部刪了


truncate清空表,並且重置auto_increment計數器

>truncate tb_name;

例:

>truncate students; 清空students表


update更新表

>update tb_name set col1=...,col2=... where 條件;(支持order by ,limit)

例:

>update students set name='zxl',age='23' where id=1 and gender='M';

將students表中,id=1且性別爲男的name改爲'zxl',age改爲23


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章