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