如何用mysql建立數據庫(MySQL數據庫基礎知識及優化)
SQL語句基礎知識及優化
SQL語句主要分為哪幾類 *
- 數據據定義語言DDL(Data Definition Language):主要有CREATE,DROP,ALTER等對邏輯結構有操作的,包括表結構、視圖和索引。
- 數據庫查詢語言DQL(Data Query Language):主要以SELECT為主
- 數據操縱語言DML(Data Manipulation Language):主要包括INSERT,UPDATE,DELETE
- 數據控制功能DCL(Data Control Language):主要是權限控制能操作,包括GRANT,REVOKE,COMMIT,ROLLBACK等。
SQL約束有哪些? **
- 主鍵約束:主鍵為在表中存在一列或者多列的組合,能唯一標識表中的每一行。一個表只有一個主鍵,并且主鍵約束的列不能為空。
- 外鍵約束:外鍵約束是指用于在兩個表之間建立關系,需要指定引用主表的哪一列。只有主表的主鍵可以被從表用作外鍵,被約束的從表的列可以不是主鍵,所以創建外鍵約束需要先定義主表的主鍵,然后定義從表的外鍵。
- 唯一約束:確保表中的一列數據沒有相同的值,一個表可以定義多個唯一約束。
- 默認約束:在插入新數據時,如果該行沒有指定數據,系統將默認值賦給該行,如果沒有設置沒默認值,則為NULL。
- Check約束:Check會通過邏輯表達式來判斷數據的有效性,用來限制輸入一列或者多列的值的范圍。在列更新數據時,輸入的內容必須滿足Check約束的條件。
什么是子查詢? **
子查詢:把一個查詢的結果在另一個查詢中使用
子查詢可以分為以下幾類:
- 標量子查詢:指子查詢返回的是一個值,可以使用 =,>,<,>=,<=,<>等操作符對子查詢標量結果進行比較,一般子查詢會放在比較式的右側。SELECT * FROM user WHERE age = (SELECT max(age) from user) //查詢年紀最大的人
- 列子查詢:指子查詢的結果是n行一列,一般應用于對表的某個字段進行查詢返回。可以使用IN、ANY、SOME和ALL等操作符,不能直接使用SELECT num1 FROM table1 WHERE num1 > ANY (SELECT num2 FROM table2)
- 行子查詢:指子查詢返回的結果一行n列SELECT * FROM user WHERE (age,sex) = (SELECT age,sex FROM user WHERE name="zhangsan")
- 表子查詢:指子查詢是n行n列的一個數據表SELECT * FROM student WHERE (name,age,sex) IN (SELECT name,age,sex FROM class1) //在學生表中找到班級在1班的學生
了解MySQL的幾種連接查詢嗎? ***
MySQl的連接查詢主要可以分為外連接,內連接,交叉連接
- 外連接外連接主要分為左外連接(LEFT JOIN)、右外連接(RIGHT JOIN)、全外連接。左外連接:顯示左表中所有的數據及右表中符合條件的數據,右表中不符合條件的數據為null。
右外連接:顯示左表中所有的數據及右表中符合條件的數據,右表中不符合條件的數據為null。
MySQL中不支持全外連接。
- 內連接:只顯示符合條件的數據
- 交叉連接:使用笛卡爾積的一種連接。笛卡爾積,百度百科的解釋:兩個集合X和Y的笛卡爾積表示為X × Y,第一個對象是X的成員而第二個對象是Y的所有可能有序對的其中一個成員 。例如:A={a,b},B={0,1,2},A × B = {(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}
舉例如下:有兩張表分為L表和R表。
L表
R表
- 左外連接 :select L.`*`,R.`*` from L left join R onL.b=R.b
- 右外連接:select L.`*`,R.`*` from L right join R onL.b=R.b
- 內連接:select L.`*`,R.`*` from L inner join R on L.b=R.b
- 交叉連接:select L.`*`,R.`*` from L,R
mysql中in和exists的區別? **
in和exists一般用于子查詢。
- 使用exists時會先進行外表查詢,將查詢到的每行數據帶入到內表查詢中看是否滿足條件;使用in一般會先進行內表查詢獲取結果集,然后對外表查詢匹配結果集,返回數據。
- in在內表查詢或者外表查詢過程中都會用到索引。
- exists僅在內表查詢時會用到索引
- 一般來說,當子查詢的結果集比較大,外表較小使用exist效率更高;當子查詢尋得結果集較小,外表較大時,使用in效率更高。
- 對于not in和not exists,not exists效率比not in的效率高,與子查詢的結果集無關,因為not in對于內外表都進行了全表掃描,沒有使用到索引。not exists的子查詢中可以用到表上的索引。
varchar和char的區別? ***
- varchar表示變長,char表示長度固定。當所插入的字符超過他們的長度時,在嚴格模式下,會拒絕插入并提示錯誤信息,在一般模式下,會截取后插入。如char(5),無論插入的字符長度是多少,長度都是5,插入字符長度小于5,則用空格補充。對于varchar(5),如果插入的字符長度小于5,則存儲的字符長度就是插入字符的長度,不會填充。
- 存儲容量不同,對于char來說,最多能存放的字符個數為255。對于varchar,最多能存放的字符個數是65532。
- 存儲速度不同,char長度固定,存儲速度會比varchar快一些,但在空間上會占用額外的空間,屬于一種空間換時間的策略。而varchar空間利用率會高些,但存儲速度慢,屬于一種時間換空間的策略。
MySQL中int(10)和char(10)和varchar(10)的區別? ***
int(10)中的10表示的是顯示數據的長度,而char(10)和varchar(10)表示的是存儲數據的大小。
drop、delete和truncate的區別? **
dropdeletetruncate速度快逐行刪除,慢較快類型DDLDMLDDL回滾不可回滾可回滾不可回滾刪除內容刪除整個表,數據行、索引都會被刪除表結構還在,刪除表的一部分或全部數據表結構還在,刪除表的全部數據
一般來講,刪除整個表,使用drop,刪除表的部分數據使用delete,保留表結構刪除表的全部數據使用truncate。
UNION和UNION ALL的區別? **
union和union all的作用都是將兩個結果集合并到一起。
- union會對結果去重并排序,union all直接直接返回合并后的結果,不去重也不進行排序。
- union all的性能比union性能好。
點個贊! ()