面試官常考的MySQL索引(MySQL進階)
881
2025-03-31
安裝:sudo apt-get install mysql-server
查看服務:ps ajx | grep mysql
停止服務:sudo service mysql stop
開啟服務:sudo service mysql start
重啟服務:sudo service mysql restart
鏈接數據庫:mysql -uroot -p后輸入密碼
查看版本:select version();
查看數據庫:show database;
創建數據庫:create database 庫名 [charset = UTF8];
查看建庫語句:show create database 庫名;
使用數據庫:use 庫名;
刪除數據庫:drop 庫名;
查看表:show table;
查看表結構:desc 表名;
創建表:
CREATE TABLE table_name( column1 datatype contrai, column2 datatype, column3 datatype, ..... columnN datatype, PRIMARY KEY(one or more columns) );
創建表常用屬性字段:
-- auto_inorement 表示自動增長 -- not null 表示不為空 -- primary key 表示為主鍵 -- defaul 表示默認值
刪除表:drop table;
修改表結構:
添加字段:alter table 表名 add 列名 類型; 修改字段(重命名):alter table 表名 change 原名 新名 類型及約束; 修改字段(不重命名):alter table 表名 modify 列名 類型及約束; 刪除字段:alter table 表名 drop 列名;
查看所有列:select * from 表名;
查看指定列:select 列1,列2,... from 表名;
全列插入:insert into 表名 values(...); --需要給主鍵留下占位符,用0或null皆可。
部分列插入:insert into 表名(列1,...) values(值1,...);
插入多行全列數據:insert into 表名 values(...),(...)...;
插入多行部分列數據:insert into 表名(列1,...) values(值1,...),(值1,...)...;
更新操作:update 表名 set 列1=值1,列2=值2... where 條件;
刪除操作(不推薦):delete from 表名 where 條件;
邏輯刪除:update 字段名 set isvalid=0 where id=1; --設置刪除字段,執行刪除字段的操作即對該字段更新。
查詢消除重復行:select distinct 列1,... from 表名;
where條件查詢:select * from 表名 where 條件;
where可以與比較運算符、邏輯運算符、模糊查詢、范圍查詢、空判斷搭配使用
等于: = 大于: > 大于等于: >= 小于: < 小于等于: <= 不等于: != 或 <>
舉個栗子:
select * from students where id > 1; select * from students where id <= 2; select * from students where name != '咸魚'; select * from students where is_delete=0;
and or not
舉個栗子:
select * from students where id > 3 and gender=0; select * from students where id < 4 or is_delete=0; select * from students where id not 4;
like % 表示任意多個任意字符 _ 表示一個任意字符 rlike
舉個栗子:
select * from students where name like '咸%'; --查詢以咸字開頭的內容 select * from students where name like '咸_'; --查詢以咸字開頭且后面只有一個字的內容 select * from students where name like '咸%' or name like '%魚'; -- 查詢以咸字開頭或以魚字結尾的內容
in 表示在一個非連續的范圍內 no in 表示不在一個非連續的范圍內 between ... and ... 表示在一個連續的范圍內 rlike 表示正則查詢,可以使用正則表達式查詢數據
舉個栗子:
select * from students where id in(1,3,8); -- 查詢 id 在 1,3,8 當中的內容 select * from students where id not in(1,3,8); -- 查詢 id 不在 1,3,8 當中的內容 select * from students where id between 3 and 8; -- 查詢 id 在3到8之間的內容 select * from students where name rlike "^咸"; -- 查詢 name 是以咸字開頭的內容
判斷是否為空 is null
舉個栗子:
select * from students where height is null;
以上幾種預算符優先級為:
優先級由高到低的順序為:小括號、not、比較運算符、邏輯運算符。
and比or先運算,如果同時出現并希望先算or,需要結合()使用。
asc 升序
desc 降序
舉個栗子:
select * from students order by age desc,height desc; --顯示所有的學生信息,先按照年齡從大到小排序,當年齡相同時 按照身高從高到矮排序
count(*)查詢總數
max(列)表示求此列的最大值
min(列)表示求此列的最小值
sum(列)表示求此列的和
avg(列)表示求此列的平均值
舉個栗子:
select count(*) from students;
select max(id) from students where gender=2;
select min(id) from students where is_delete=0;
select sum(age) from students where gender=1;
select sum(age)/count(*) from students where gender=1; --求平均年齡
select avg(id) from students where is_delete=0 and gender=2;
group by 將查詢結果按照1個或多個字段進行分組,字段值相同的為一組
group_concat 表示分組之后,根據分組結果,使用group_concat()來放置每一組的某字段的值的集合
select gender from students group by gender; -- 將學生按照性別分組 輸出結果: +--------+ | gender | +--------+ | 男 | | 女 | | 中性 | | 保密 | +--------+ select gender,group_concat(name) from students group by gender; 輸出結果: +--------+-----------------------------------------------------------+ | gender | group_concat(name) | +--------+-----------------------------------------------------------+ | 男 | 小彭,小劉,小周,小程,小郭 | | 女 | 小明,小月,小蓉,小賢,小菲,小香,小杰 | | 中性 | 小金 | | 保密 | 小鳳 | +--------+-----------------------------------------------------------+
select * from 表名 limit start,count
舉個栗子:
select * from students where gender=1 limit 0,3; --查詢前三行的數據
語法:
select * from 表1 inner/left/right join 表2 on 表1.列 = 表2.列
其中:
inner join(內連接查詢):查詢的結果為兩個表匹配到的數據 right join(右連接查詢):查詢的結果為兩個表匹配到的數據,右表特有的數據,對于左表中不存在的數據使用null填充 left join(左連接查詢):查詢的結果為兩個表匹配到的數據,左表特有的數據,對于右表中不存在的數據使用null填充
舉個栗子:
select * from students inner join classes on students.cls_id = classes.id;
select * from students as s left join classes as c on s.cls_id = c.id;
select * from students as s right join classes as c on s.cls_id = c.id;
在一個 select 語句中,嵌入了另外一個 select 語句, 那么被嵌入的 select 語句稱之為子查詢語句。
子查詢可以和 in 搭配使用
主查詢 where 條件 in (子查詢)
mysqldump –uroot –p 數據庫名 > 備份文件名.sql;
mysql -uroot –p 新數據庫名 < 備份文件名.sql
安裝相關庫:pip install pymysql
導入:from pymysql import *
connection = connect(host, port, database, user, password, charset)
其中參數如下:
host:連接的mysql主機,如果本機是'localhost' port:連接的mysql主機的端口,默認是3306 database:數據庫的名稱 user:連接的用戶名 password:連接的密碼 charset:通信采用的編碼方式,推薦使用utf8
connection對象方法如下:
close()關閉連接
commit()提交
cursor()返回Cursor對象,用于執行sql語句并獲得結果
cursor=connection.cursor()
其中常用方法:
close():關閉cursor execute(operation [, parameters ]):執行語句,返回受影響的行數,主要用于執行insert、update、delete語句,也可以執行create、alter、drop等語句。 fetchone():執行查詢語句時,獲取查詢結果集的第一個行數據,返回一個元組 fetchall():執行查詢時,獲取結果集的所有行,一行構成一個元組,再將這些元組裝入一個元組返回
舉個栗子:
from pymysql import * def main(): conn = connect(host='localhost',port=3306,database='xianyuplus',user='root',password='mysql',charset='utf8') cs1 = conn.cursor() count = cs1.execute('insert into xianyufans(name) values("666")') conn.commit() cs1.close() conn.close() if __name__ == '__main__': main()
視圖是對若干張基本表的引用,一張虛表,查詢語句執行的結果,不存儲具體的數據。
創建視圖:create view 視圖名稱 as select語句; --建議視圖以v_開頭 查看視圖:show tables; 使用視圖:select * from 視圖名稱; 刪除視圖:drop view 視圖名稱;
提高了重用性,就像一個函數
對數據庫重構,卻不影響程序的運行
提高了安全性能,可以對不同的用戶
讓數據更加清晰
事務,它是一個操作序列,這些操作要么都執行,要么都不執行,它是一個不可分割的工作單位。
原子性,一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要么全部提交成功,要么全部失敗回滾,對于一個事務來說,不可能只執行其中的一部分操作,這就是事務的原子性。
一致性,數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。
隔離性,一個事務所做的修改在最終提交以前,對其他事務是不可見的。
持久性,一旦事務提交,則其所做的修改會永久保存到數據庫。
開啟事務:start transaction; 或者 begin; 提交事務:commit; 回滾事務:rollback;
數據庫索引好比是一本書前面的目錄,能加快數據庫的查詢速度
創建索引:create index 索引名稱 on 表名(字段名稱(長度)) --當指定索引的字段類型為字符串時,應填寫長度 查看索引:show index from 表名; 刪除索引:drop index 索引名稱 on 表名;
建立太多的索引將會影響更新和插入的速度,因為它需要同樣更新每個索引文件。對于一個經常需要更新和插入的表格,就沒有必要為一個很少使用的where字句單獨建立索引了,對于比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。
建立索引會占用磁盤空間。
【生長吧!Python】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/278897
MySQL Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。