1. 程式人生 > >mysql 之單表查詢基礎sql

mysql 之單表查詢基礎sql

建立測試表

CREATE TABLE `student` (
	`id` INT ,
	`stuName` VARCHAR (60),
	`age` INT ,
	`sex` VARCHAR (30),
	`gradeName` VARCHAR (60)
); 
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('1','張三','23','男','一年級');
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('2','張三丰','25','男','二年級');
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('3','李四','23','男','一年級');
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('4','王五','22','男','三年級');
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('5','珍妮','21','女','一年級');
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('6','李娜','26','女','二年級');
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('7','王峰','20','男','三年級');
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('8','夢娜','21','女','二年級');
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('9','小黑','22','男','一年級');
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('10','追風','25','男','二年級');
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('11','小小張三','21',NULL,'二年級');
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('12','小張三','23','男','二年級');
INSERT INTO `student` (`id`, `stuName`, `age`, `sex`, `gradeName`) VALUES('13','張三鋒小','24',NULL,'二年級');

查詢所有欄位

SELECT 欄位 1,欄位 2,欄位 3...FROM 表名;
SELECT id,stuName,age,sex,gradeName FROM student ;
SELECT * FROM 表名
SELECT * FROM student;

帶 IN 關鍵字查詢

SELECT 欄位 1,欄位 2,欄位 3...FROM 表名 WHERE 欄位 [NOT] IN (元素 1,元素 2,元素 3);
SELECT * FROM student WHERE age IN (21,23);
SELECT * FROM student WHERE age NOT IN (21,23);

帶 BETWEENAND 的範圍查詢

SELECT 欄位 1,欄位 2,欄位 3...FROM 表名 WHERE 欄位 [NOT] BETWEEN 取值 1 AND 取值 2;
SELECT * FROM student WHERE age BETWEEN 21 AND 24;/*包含21歲和24歲的學生*/
SELECT * FROM student WHERE age NOT BETWEEN 21 AND 24;

帶 LIKE 的模糊查詢

SELECT 欄位 1,欄位 2,欄位 3...FROM 表名 WHERE 欄位 [NOT] LIKE ‘字串’;
“%”代表任意字元;
“_” 代表單個字元;

SELECT * FROM student WHERE stuName LIKE '張三';/*全匹配相當於where =*/
SELECT * FROM student WHERE stuName LIKE '張三%';/*右匹配,張三開頭的學生*/
SELECT * FROM student WHERE stuName LIKE '%張三';/*左匹配,張三結尾的學生*/
SELECT * FROM student WHERE stuName LIKE '張三_';/*三個名字的學生,開頭是張三*/
SELECT * FROM student WHERE stuName LIKE '%張三%';/*模糊全匹配,只要包含就查出來*/

空值查詢

SELECT 欄位 1,欄位 2,欄位 3...FROM 表名 WHERE 欄位 IS [NOT] NULL;

SELECT * FROM student WHERE sex IS NULL;
SELECT * FROM student WHERE sex IS NOT NULL;

帶 AND 的多條件查詢

SELECT 欄位 1,欄位 2...FROM 表名 WHERE 條件表示式 1 AND 條件表示式 2 [...AND 條件表示式 n]
SELECT * FROM student WHERE gradeName='一年級' AND age=23/*並的關係*/

帶 OR 的多條件查詢

SELECT 欄位 1,欄位 2...FROM 表名 WHERE 條件表示式 1 OR 條件表示式 2 [...OR 條件表示式 n]
SELECT * FROM student WHERE gradeName='一年級' OR age=23/*或的關係*/

DISTINCT 去重複查詢

SELECT DISTINCT 欄位名 FROM 表名;

SELECT DISTINCT gradeName FROM student;

查詢結果排序

SELECT 欄位 1,欄位 2...FROM 表名 ORDER BY 屬性名 [ASC|DESC]

SELECT * FROM student ORDER BY age ASC;/*升序*/
SELECT * FROM student ORDER BY age DESC;/*降序*/

GROUP BY 分組查詢

GROUP BY 屬性名 [HAVING 條件表示式][WITH ROLLUP]
1,單獨使用(毫無意義);
2,與 GROUP_CONCAT()函式一起使用;
3,與聚合函式一起使用;
4,與 HAVING 一起使用(限制輸出的結果);
5,與 WITH ROLLUP 一起使用(最後加入一個總和行)

SELECT * FROM student GROUP BY gradeName;

SELECT gradeName,GROUP_CONCAT(stuName) FROM student GROUP BY gradeName;

SELECT gradeName,COUNT(stuName) FROM student GROUP BY gradeName;

SELECT gradeName,COUNT(stuName) FROM student GROUP BY gradeName HAVING COUNT(stuName)>3;

SELECT gradeName,COUNT(stuName) FROM student GROUP BY gradeName WITH ROLLUP;
SELECT gradeName,GROUP_CONCAT(stuName) FROM student GROUP BY gradeName WITH ROLLUP;

LIMIT 分頁查詢

SELECT 欄位 1,欄位 2...FROM 表名 LIMIT 初始位置,記錄數;

SELECT * FROM student LIMIT 0,5;
SELECT * FROM student LIMIT 5,5;
SELECT * FROM student LIMIT 10,5;

聚合函式

更改資料以測試聚合函式->此時學生表只有叫張三和王峰的學生了

UPDATE student SET stuname='張三' WHERE stuname='小小張三'

UPDATE student SET stuname='王峰' WHERE stuname!='張三'

  COUNT()函式

COUNT()函式用來統計記錄的條數;
SELECT COUNT(*) FROM student;
SELECT stuName,COUNT(*) FROM student GROUP BY stuName;

SUM()函式

SUM()函式是求和函式;

SELECT stuName,SUM(age) FROM student WHERE stuName="張三";
SELECT stuName,SUM(age) FROM student GROUP BY stuName;

AVG()函式

AVG()函式是求平均值的函式;

SELECT stuName,AVG(age) FROM student WHERE stuName="張三";
SELECT stuName,AVG(age) FROM student GROUP BY stuName;

MAX()函式

MAX()函式是求最大值的函式;

SELECT stuName,MAX(age) FROM student WHERE stuName="張三";
SELECT stuName,MAX(age) FROM student GROUP BY stuName;

MIN()函式

MIN()函式是求最小值的函式;

SELECT stuName,MIN(age) FROM student WHERE stuName="張三";
SELECT stuName,MIN(age) FROM student GROUP BY stuName;

連線查詢

連線查詢是將兩個或兩個以上的表按照某個條件連線起來,從中選取需要的資料;

建表

CREATE TABLE `book` (
  `id` INT (11) NOT NULL AUTO_INCREMENT,
  `bookName` VARCHAR (20) DEFAULT NULL,
  `price` DECIMAL (6, 2) DEFAULT NULL,
  `author` VARCHAR (20) DEFAULT NULL,
  `bookTypeId` INT (11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE = INNODB AUTO_INCREMENT = 5 DEFAULT CHARSET = utf8 ;

INSERT  INTO `book`(`id`,`bookName`,`price`,`author`,`bookTypeId`) VALUES (1,'Java程式設計思想','100.00','埃史爾',1),(2,'Java從入門到精通','80.00','李鍾尉',1),(3,'三劍客','70.00','大仲馬',2),(4,'生理學(第二版)','24.00','劉先國',4);

CREATE TABLE `booktype` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `bookTypeName` VARCHAR(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT  INTO `booktype`(`id`,`bookTypeName`) VALUES (1,'計算機類'),(2,'文學類'),(3,'教育類');

內連線查詢

SELECT * FROM  book b  CROSS JOIN booktype t  

/*
CROSS JOIN 可以省略

*/SELECT * FROM book,booktype ;/*笛卡兒積*/

內連線查詢是一種最常用的連線查詢。內連線查詢可以查詢兩個或者兩個以上的表;

SELECT * FROM  book b,booktype t WHERE b.bookTypeId=t.id
SELECT * FROM  book b  INNER JOIN booktype t  ON b.bookTypeId=t.id


外連線查詢

外連線可以查出某一張表的所有資訊;
SELECT 屬性名列表 FROM 表名 1 LEFT|RIGHT JOIN 表名 2 ON 表名 1.屬性名 1=表名 2.屬性名 2;

左連線查詢

可以查詢出“表名 1”的所有記錄,而“表名 2”中,只能查詢出匹配的記錄;
SELECT b.*,t.* FROM  book b LEFT JOIN booktype t ON b.bookTypeId=t.id   

右連線查詢

可以查詢出“表名 2”的所有記錄,而“表名 1”中,只能查詢出匹配的記錄;
SELECT b.*,t.* FROM  book b RIGHT JOIN booktype t ON b.bookTypeId=t.id   

LEFT JOIN 是LEFT OUTER JOIN 的縮寫,同理,RIGHT JOIN 是 RIGHT OUTER JOIN 的縮寫;JOIN 是 INNER JOIN 的縮寫。

全外連線(full outer join)<mysql 不支援,替換方案union>

返回左表中不符合連線條件單符合查詢條件的資料行,並且還返回右表中不符合連線條件單符合查詢條件的資料行。全外連線實際是上左外連線和右外連線的數學合集(去掉重複),即“全外=左外 UNION 右外”。

UNION 

SELECT b.*,t.* FROM  book b  LEFT  JOIN booktype t  ON b.bookTypeId=t.id
 UNION 
SELECT b1.*,t1.* FROM  book b1  RIGHT  JOIN booktype t1  ON b1.bookTypeId=t1.id
 

join語句優化:

1.儘可能減少join語句中的NestedLoop的迴圈總次數:永遠使用小結果集驅動大的結果集

2.優先優化NestedLoop的內層迴圈

3.保證Join語句中被驅動表Join條件欄位已經被索引

4.當無法保證被驅動表的Join條件欄位被索引且記憶體資源充足的前提下,不要太吝惜JoinBuffer的設定

相關推薦

mysql 查詢基礎sql

建立測試表 CREATE TABLE `student` ( `id` INT , `stuName` VARCHAR (60), `age` INT , `sex` VARCHAR (30), `gradeName` VARCHAR (60) ); INSER

MySQL查詢

字符串 所有 order 多列 成員 off ati 表達式 opera 一、單表查詢的語法 SELECT 字段1,字段2... FROM 表名 WHERE 條件 GROUP BY field HAVI

day 38 資料庫MySQL查詢

一 . 單表查詢的語法   select  *  from   select  *  指的就是要查詢所有欄位的資料。   select  distinct   欄位1,欄位2  from  庫名,

mysql查詢和多查詢

註釋:單表查詢就是記錄的詳細操作(增刪查,改的需求以及方法比較多) 一,複製表(索引和自增的屬性不能複製,需要自己新增) 拷貝結構以及資料 create table 新表名 select * from 舊錶名; 例:create table copy_customer

mysql查詢__我自己敲的程式碼

1、select * from person; #檢視全部 2、select name,sex from person;   #只選擇name和sex這兩列name和sex之間有一個逗號的 3、select name,sex as '性別' from person #將name

MySQL 數據庫查詢

and 使用 count 得到 註意 記錄 order by 我們 函數 一.查詢語法 SELECT 字段1,字段2... FROM 表名 WHERE 條件 GROUP BY field

sql語句查詢

mit 某個字段 之前 OS 條件 單表查詢 where clas 分組 語法順序: select distinct 字段1,字段2,字段3 from 庫.表   where 條件       group by 分組條件     having 過濾    # 執行順序的

MySQL查詢查詢與多查詢

顯示效果 ffi tinc rom concat var id號 補充 date 單表查詢 前期準備 create table emp( id int not null unique auto_increment, name varchar(20) not null

mysql數據庫查詢查詢

限制 應用 獲取 ffice 一個 expand 大於 為什麽 min 單表查詢 前期表準備 create table emp( id int not null unique auto_increment, name varchar(20) not null, s

3.MySQL優化---查詢優化的一些小總結(非索引設計)

sql優化 所有 結果集 單表 搜索 結果 查詢語句 cnblogs sel 整理自互聯網.摘要: 接下來這篇是查詢優化。其實,大家都知道,查詢部分是遠遠大於增刪改的,所以查詢優化會花更多篇幅去講解。本篇會先講單表查詢優化(非索引設計)。然後講多表查詢優化。索引優化設計以及

oracle數據庫查詢

數據 方法 第一個 常用 單表 分組查詢 創建表 如果 value 作為一合格的測試人員對數據庫的單表查詢、多表查詢、分組查詢、子查詢等等這些基本查詢方法還是要會的。不然到企業中,容易被一些人鄙視,或者說如果數據庫學不好,表查不明白,那麽對自己能力來說也是一種侮辱,因為

數據庫查詢

年齡 tween 員工 分頁 lar 取出 arc windows mit select * from emp where name regexp ‘^jin.*(n|g)$‘; 找到表:from 2.拿著where指定的約束條件,去文件/表中取出一條條記錄 3

MySQL查詢

lap max not 包含 one 插入記錄 比較運算符 ffice create 一,多表連接查詢 ex:創建2張表 部門表(department)、員工表(employee) create table department( id int, name varcha

MySQL(增刪改查)+ 基本命令

偏移量 update 不為 也會 其他 insert 分享圖片 UNC 插入 1、MySQL之最基本命令    1、創建數據庫 命令:CREATE DATABASE 數據庫名; 舉例:CREATE DATABASE student; 2、指定要操作的數據庫 命令:USE 數

MySQL查詢練習

info 工資 join ada 員工 ear 利潤表 mgr 沒有 一、表格 表一 emp 表二 dept 表三 salgrade; 表四 年度利潤表 二、習題 1. 查出至少有一個員工的部門。顯示部門編號、部門名稱、部門位置、部門人數。 2. 列出所有員

mysql查詢的其他查詢

1,臨時表查詢 (1)需求:查詢高於本部門平均工資的人員 select * from person as p, (select dept_id, avg(salary) as '平均工資' from person GROUP BY dept_id) as ptable where p.dept_

mysql查詢和連查詢

1,新建表和插入資料 建立表,設定欄位的約束條件 create table employee( id int primary key auto_increment, name varchar(20) not null, sex enum('male','female') no

django查詢

一、建立表 1、建立模型: 建立名為book的app,在book下的models.py中建立模型: from django.db import models # Create your models here. class Book(models.Model): id = m

Mysql優化查詢

pla 函數 建立索引 條件 註意 src inf .com 查詢 借助explain分析SQL,判斷該怎麽建立索引。 還需要註意,有些情況會導致索引失效,用不上索引,應該優化SQL,應用上索引。 什麽情況導致索引失效?   1、在索引列上做任何操作(計算、函數、類型轉換(

Oracle查詢及常用函式

1.語法:   select 欄位列表   from 表名   [where 查詢條件]   [group by 分組]   [having 分組條件]   [order by 排序] select * 代表查詢所有的欄位 select