天天看點

MySQL(增删改查)MySQL服務的啟動和停止MySQL的常見指令MySQL的文法規範SQL的語言分類DQL語言(查詢)DML語言注意

MySQL服務的啟動和停止

方式一:計算機——右擊管理——服務

方式二:通過管理者身份運作

​	net start 服務名(啟動服務)
​	net stop 服務名(停止服務)
           

MySQL服務的登入和退出

方式一:通過mysql自帶的用戶端

隻限于root使用者

方式二:通過windows自帶的用戶端
登入:
mysql 【-h主機名 -P端口号 】-u使用者名 -p密碼

退出:
exit或ctrl+C
           

MySQL的常見指令

1.檢視目前所有的資料庫
show databases;
2.打開指定的庫
use 庫名
3.檢視目前庫的所有表
show tables;
4.檢視其它庫的所有表
show tables from 庫名;
5.建立表
create table 表名(

	列名 列類型,
	列名 列類型,
	。。。
);
6.檢視表結構
desc 表名;
7.檢視伺服器的版本
方式一:登入到mysql服務端
select version();
方式二:沒有登入到mysql服務端
mysql --version
或
mysql --V
           

MySQL的文法規範

  1. 不區分大小寫,但建議關鍵字大寫,表名、列名小寫
  2. 每條指令最好用分号結尾
  3. 每條指令根據需要,可以進行縮進 或換行
  4. 注釋
​		單行注釋:#注釋文字
​		單行注釋:-- 注釋文字
​		多行注釋:/* 注釋文字  */
           

SQL的語言分類

​	DQL(Data Query Language):資料查詢語言
​		select 
​	DML(Data Manipulate Language):資料操作語言
​		insert 、update、delete
​	DDL(Data Define Languge):資料定義語言
​		create、drop、alter
​	TCL(Transaction Control Language):事務控制語言
​		commit、rollback
	DCL(Data Control Language):
       是資料庫控制功能。是用來設定或更改資料庫使用者或角色權限的語句,包括(grant,deny,revoke等)語句。在預設狀态下,隻有sysadmin,dbcreator,db_owner或db_securityadmin等人員才有權力執行DCL

           

DQL語言(查詢)

進階1:基礎查詢

​ 文法:

​	SELECT 要查詢的東西
​	【FROM 表名】;
           

類似于Java中 :System.out.println(要列印的東西);

特點:

①通過select查詢完的結果 ,是一個虛拟的表格,不是真實存在

② 要查詢的東西 可以是常量值、可以是表達式、可以是字段、可以是函數

案例

起别名

#方式一:使用as
SELECT 100%98 AS 結果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;

#方式二:使用空格
SELECT last_name 姓,first_name 名 FROM employees;
           

去重

進階2:條件查詢

​ 條件查詢:根據條件過濾原始表的資料,查詢到想要的資料

​ 文法:

​	select 
​		要查詢的字段|表達式|常量值|函數
​	from 
​		表
​	where 
​		條件 ;
           

分類:

一、條件表達式

示例:salary>10000

條件運算符:

< >= <= = != <>

二、邏輯表達式

示例:salary>10000 && salary<20000
邏輯運算符:

and(&&):兩個條件如果同時成立,結果為true,否則為false

or(||):兩個條件隻要有一個成立,結果為true,否則為false

not(!):如果條件成立,則not後為false,否則為true

三、模糊查詢

特點:

①一般和通配符搭配使用
	通配符:
	% 任意多個字元,包含0個字元
	_ 任意單個字元
           
示例:last_name like ‘a%’

案例

#邏輯表達式
#案例2:查詢部門編号不是在90到110之間,或者工資高于15000的員工資訊
SELECT
	*
FROM
	employees
WHERE
	NOT(department_id>=90 AND  department_id<=110) OR salary>15000;

#模糊查詢
#案例1:查詢員工名中包含字元a的員工資訊
select 
	*
from
	employees
where
	last_name like '%a%';#abc
           

進階3:排序查詢

文法:

select
	要查詢的東西
from
	表
where 
	條件
order by 排序的字段|表達式|函數|别名 【asc|desc】
           

特點:

1、asc代表的是升序,可以省略
desc代表的是降序

2、order by子句可以支援 單個字段、别名、表達式、函數、多個字段

3、order by子句在查詢語句的最後面,除了limit子句
           

案例

#3、按表達式排序
#案例:查詢員工資訊 按年薪降序

SELECT *,salary*12*(1+IFNULL(commission_pct,0))
FROM employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;

#5、按函數排序
#案例:查詢員工名,并且按名字的長度降序

SELECT LENGTH(last_name),last_name 
FROM employees
ORDER BY LENGTH(last_name) DESC;

#6、按多個字段排序
#案例:查詢員工資訊,要求先按工資降序,再按employee_id升序

SELECT *
FROM employees
ORDER BY salary DESC,employee_id ASC;
           

進階4:常見函數

​ 一、單行函數

​ 1、字元函數

​ concat拼接

​ substr截取子串

​ upper轉換成大寫

​ lower轉換成小寫

​ trim去前後指定的空格和字元

​ ltrim去左邊空格

​ rtrim去右邊空格

​ replace替換

​ lpad左填充

​ rpad右填充

​ instr傳回子串第一次出現的索引

​ length 擷取位元組個數

​ 2、數學函數

​ round 四舍五入

​ rand 随機數

​ floor向下取整

​ ceil向上取整

​ mod取餘

​ truncate截斷

​ 3、日期函數

​ now目前系統日期+時間

​ curdate目前系統日期

​ curtime目前系統時間

​ str_to_date 将字元轉換成日期

​ date_format将日期轉換成字元

​ 4、流程控制函數

​ if 處理雙分支

​ case語句 處理多分支

​ 情況1:處理等值判斷

​ 情況2:處理條件判斷

​ 5、其他函數

​ version版本

​ database目前庫

​ user目前連接配接使用者

二、分組函數

sum 求和

max 最大值

min 最小值

avg 平均值

count 計數

特點:

1、以上五個分組函數都忽略null值,除了count()

2、sum和avg一般用于處理數值型

max、min、count可以處理任何資料類型

3、都可以搭配distinct使用,用于統計去重後的結果

4、count的參數可以支援:

字段、、常量值,一般放1

建議使用 count(*)
           

進階5:分組查詢

​ 文法:

​	select 查詢的字段,分組函數
​	from 表
​	group by 分組的字段
           

特點:

1、可以按單個字段分組
2、和分組函數一同查詢的字段最好是分組後的字段
3、分組篩選
		針對的表	位置			關鍵字
分組前篩選:	原始表		group by的前面		where
分組後篩選:	分組後的結果集	group by的後面		having

4、可以按多個字段分組,字段之間用逗号隔開
5、可以支援排序
6、having後可以支援别名
           

案例

#案例2:每個工種有獎金的員工的最高工資>12000的工種編号和最高工資

SELECT job_id,MAX(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;

#5.按多個字段分組
#案例:查詢每個工種每個部門的最低工資,并按最低工資降序

SELECT MIN(salary),job_id,department_id
FROM employees
GROUP BY department_id,job_id
ORDER BY MIN(salary) DESC;

#4.查詢所有部門的編号,員工數量和工資平均值,并按平均工資降序
SELECT department_id,COUNT(*),AVG(salary) a
FROM employees
GROUP BY department_id
ORDER BY a DESC;
           

進階6:多表連接配接查詢

笛卡爾乘積:如果連接配接條件省略或無效則會出現
解決辦法:添加上連接配接條件
           

一、傳統模式下的連接配接 :等值連接配接——非等值連接配接

1.等值連接配接的結果 = 多個表的交集
2.n表連接配接,至少需要n-1個連接配接條件
3.多個表不分主次,沒有順序要求
4.一般為表起别名,提高閱讀性和性能
           

二、sql99文法:通過join關鍵字實作連接配接

含義:1999年推出的sql文法
支援:
等值連接配接、非等值連接配接 (内連接配接)
外連接配接
交叉連接配接

文法:

select 字段,...
from 表1
【inner|left outer|right outer|cross】join 表2 on  連接配接條件
【inner|left outer|right outer|cross】join 表3 on  連接配接條件
【where 篩選條件】
【group by 分組字段】
【having 分組後的篩選條件】
【order by 排序的字段或表達式】

好處:語句上,連接配接條件和篩選條件實作了分離,簡潔明了!
           

左連接配接

#一、查詢編号>3的女神的男朋友資訊,如果有則列出詳細,如果沒有,用null填充

SELECT b.id,b.name,bo.*
FROM beauty b
LEFT OUTER JOIN boys bo
ON b.`boyfriend_id` = bo.`id`
WHERE b.`id`>3;
           

右連接配接

​#二、查詢哪個城市沒有部門

SELECT city

FROM departments d

RIGHT OUTER JOIN locations l

ON d.

location_id

=l.

location_id

WHERE d.

department_id

IS NULL;

三、自連接配接

案例:查詢員工名和直接上級的名稱

sql99

SELECT e.last_name,m.last_name
FROM employees e
JOIN employees m ON e.`manager_id`=m.`employee_id`;
           

sql92

SELECT e.last_name,m.last_name
FROM employees e,employees m 
WHERE e.`manager_id`=m.`employee_id`;
           

左連接配接和有連接配接的差別

左連接配接:是已左邊表中的資料為基準,若左表有資料右表沒有資料,則顯示左表中的資料右表中的資料顯示為空。(左邊有的,右邊沒有的為null)

左邊的表是全部資料,右邊的隻有符合條件的才有資料;

右聯接:是左向外聯接的反向聯接。将傳回右表的所有行。如果右表的某行在左表中沒有比對行,則将為左表傳回空值。(左邊沒有的,右邊有的為null )

右連接配接 右邊的表資料全,左邊的符合條件的有資料;

内連接配接和外連接配接的差別

内連接配接是隻有符合條件的才顯示;

MySql不支援全連接配接FUll JOIN,不過可以通過聯合UNION來模拟。

兩個表資料都有

案例

第一張表

id:1,2,3

第二張

id:1,2,4

都有

id:1,2

進階7:子查詢

含義:

一條查詢語句中又嵌套了另一條完整的select語句,其中被嵌套的select語句,稱為子查詢或内查詢在外面的查詢語句,稱為主查詢或外查詢

特點:

1、子查詢都放在小括号内
2、子查詢可以放在from後面、select後面、where後面、having後面,但一般放在條件的右側
3、子查詢優先于主查詢執行,主查詢使用了子查詢的執行結果
4、子查詢根據查詢結果的行數不同分為以下兩類:
① 單行子查詢
	結果集隻有一行
	一般搭配單行操作符使用:> < = <> >= <= 
	非法使用子查詢的情況:
	a、子查詢的結果為一組值
	b、子查詢的結果為空
	
② 多行子查詢
	結果集有多行
	一般搭配多行操作符使用:any、all、in、not in
	in: 屬于子查詢結果中的任意一個就行
	any和all往往可以用其他查詢代替
           

案例

#③ 在②基礎上篩選,滿足min(salary)>①
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary)>(
	SELECT  MIN(salary)
	FROM employees
	WHERE department_id = 50
);

#③查詢部門資訊
SELECT *
FROM departments
WHERE department_id=(
	SELECT department_id
	FROM employees
	GROUP BY department_id
	ORDER BY AVG(salary) 
	LIMIT 1
);
           

進階8:分頁查詢

應用場景:實際的web項目中需要根據使用者的需求送出對應的分頁查詢的sql語句

文法:

select 字段|表達式,...
from 表
【where 條件】
【group by 分組字段】
【having 條件】
【order by 排序的字段】
limit 【起始的條目索引,】條目數;
           

特點:

1.起始條目索引從0開始

2.limit子句放在查詢語句的最後

3.公式:select * from  表 limit (page-1)*sizePerPage,sizePerPage
假如:
每頁顯示條目數sizePerPage
要顯示的頁數 page
           

案例

#案例2:查詢第11條——第25條
SELECT * FROM  employees LIMIT 10,15;
           

進階9:聯合查詢

引入:

union 聯合、合并

文法:

select 字段|常量|表達式|函數 【from 表】 【where 條件】 union 【all】
select 字段|常量|表達式|函數 【from 表】 【where 條件】 union 【all】
select 字段|常量|表達式|函數 【from 表】 【where 條件】 union  【all】
.....
select 字段|常量|表達式|函數 【from 表】 【where 條件】
           

特點:

1、多條查詢語句的查詢的列數必須是一緻的
2、多條查詢語句的查詢的列的類型幾乎相同
3、union代表去重,union all代表不去重
           

案例

#引入的案例:查詢部門編号>90或郵箱包含a的員工資訊

SELECT * FROM employees WHERE email LIKE '%a%' OR department_id>90;;

SELECT * FROM employees  WHERE email LIKE '%a%'
UNION
SELECT * FROM employees  WHERE department_id>90;


#案例:查詢中國使用者中男性的資訊以及外國使用者中年男性的使用者資訊

SELECT id,cname FROM t_ca WHERE csex='男'
UNION ALL
SELECT t_id,tname FROM t_ua WHERE tGender='male';
           

DML語言

插入

文法:

insert into 表名(字段名,...)
values(值1,...);
           

特點:

1、字段類型和值類型一緻或相容,而且一一對應

2、可以為空的字段,可以不用插入值,或用null填充

3、不可以為空的字段,必須插入值

4、字段個數和值的個數必須一緻

5、字段可以省略,但預設所有字段,并且順序和表中的存儲順序一緻

案例

#4.列數和值的個數必須一緻
INSERT INTO beauty(NAME,sex,id,phone)
VALUES('關曉彤','女',17,'110');

#5.可以省略列名,預設所有列,而且列的順序和表中列的順序一緻
INSERT INTO beauty
VALUES(18,'張飛','男',NULL,'119',NULL,NULL);

#方式二:
/*

文法:
insert into 表名
set 列名=值,列名=值,...
*/


INSERT INTO beauty
SET id=19,NAME='劉濤',phone='999';


#兩種方式大pk ★


#1、方式一支援插入多行,方式二不支援

INSERT INTO beauty
VALUES(23,'唐藝昕1','女','1990-4-23','1898888888',NULL,2)
,(24,'唐藝昕2','女','1990-4-23','1898888888',NULL,2)
,(25,'唐藝昕3','女','1990-4-23','1898888888',NULL,2);

#2、方式一支援子查詢,方式二不支援

INSERT INTO beauty(id,NAME,phone)
SELECT 26,'宋茜','11809866';

INSERT INTO beauty(id,NAME,phone)
SELECT id,boyname,'1234567'
FROM boys WHERE id<3;

           

修改

修改單表文法:

update 表名 set 字段=新值,字段=新值
【where 條件】
           

修改多表文法:

update 表1 别名1,表2 别名2
set 字段=新值,字段=新值
where 連接配接條件
and 篩選條件
           

删除

方式1:delete語句

單表的删除: ★

delete from 表名 【where 篩選條件】
           

多表的删除:

delete 别名1,别名2
from 表1 别名1,表2 别名2
where 連接配接條件
and 篩選條件;
           

方式2:truncate語句

truncate table 表名
           

兩種方式的差別【面試題】

#1.truncate不能加where條件,而delete可以加where條件

#2.truncate的效率高一丢丢

#3.truncate 删除帶自增長的列的表後,如果再插入資料,資料從1開始
#delete 删除帶自增長列的表後,如果再插入資料,資料從上一次的斷點處開始

#4.truncate删除不能復原,delete删除可以復原
           

案例

#2.多表的删除

#案例:删除張無忌的女朋友的資訊

DELETE b
FROM beauty b
INNER JOIN boys bo ON b.`boyfriend_id` = bo.`id`
WHERE bo.`boyName`='張無忌';

#方式二:truncate語句

#案例:将魅力值>100的男神資訊删除
TRUNCATE TABLE boys ;
           

注意

聚合函數無法用在WHERE中

錯誤案例

SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id IS NOT NULL and MIN(salary)>=6000
GROUP BY manager_id;
           

正确寫法

SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary)>=6000;