MYSQL資料庫學習(一)—初學常用語句命令
MySQL是一種開放原始碼的關係型資料庫管理系統(RDBMS),MySQL資料庫系統使用最常用的資料庫管理語言--結構化查詢語言(SQL)進行資料庫管理。現歸屬於Oracle(甲骨文)公司所有。
Mysql常用命令:
1、登入連線資料庫。
mysql -u root -p
2、顯示幫助命令清單。
mysql> \h; //(加分號和不加分號結束都不影響命令執行)
3、清除當前輸入的語句(命令)。
mysql> \c
4、查詢當前安裝的MySQL伺服器的版本號。
mysql> select version();
5、檢視MySQL伺服器狀態資訊(包含版本號,下面兩個命令執行效果相同)。
mysql> status; //(加分號和不加分號結束都不影響命令執行)
mysql> \s
6、退出資料庫。
mysql> \q; //(加分號和不加分號結束都不影響命令執行,會返回一個Bye)
7、資料庫的匯入匯出。
匯出資料庫:mysqldump -u 使用者名稱 -p 資料庫名>資料庫名.sql
匯入資料庫:source 資料庫名.sql
8、顯示所有資料庫。
mysql> show databases; //(注意,最後有個s)
9、選擇資料庫。
mysql> use 資料庫名; //會返回Database changed
10、檢視當前選擇的資料庫中的所有的表
mysql> show tables; //(注意,最後有個s)
11、檢視當前選擇的資料庫。
mysql> select database();
一、DDL:資料定義語言 (Data Definition Language)
作用:定義資料庫或者表結構的。操作的物件:資料庫或表的結構的。
關鍵字:CREATE、 ALTER、 DROP
1、建立資料庫。
mysql> create database 資料庫名; //如果要建立的資料庫已經存在,或者沒有建立它的適當許可權,則此語句執行失敗。
例:mysql> create database company;//建立一個公司資料庫
2、刪除資料庫。
mysql> drop database 資料庫名;
例:mysql>drop database company; //刪除公司資料庫
3、建立表結構。
mysql>create table 表名(列名 列的資料型別
[<列的完整性約束>],列名 列的資料型別[<列的完整性約束>],......);
例:mysql>create table dept( //建立部門表
deptno int(11) primary key, //部門編號,int型,主鍵約束
deptname varchar(12) unique //部門名稱,varchar型別,唯一性約束
);
注意:建立表之前,必須先選擇資料庫,在選定的資料庫中才能建立表。
列(column)有時候也稱欄位(field),同一個意思。
附:常用約束:
a)主鍵約束:primary key --非空且唯一,一張表就定義一個主鍵
b)主鍵自增長:auto_increment
c)非空:not null --不允許插入null值,可定義多個非空約束
d)唯一性:unique --不允許重複,但可以為空,可定義多個唯一約束
e)預設值:default 預設值 --指定預設值,在沒有新增值得情況下使用default後指定的預設值
f)外來鍵:foreign key(列名) references 外來鍵表名(外來鍵列名); //注意:有外來鍵時,建立表,先建立父表,再建立子表;插入資料,先插入父表,再插入子表;刪除資料,先刪除子表中的資料,再刪除父表中的資料。
4、查看錶結構。(下面三種方式實現效果相同)
mysql> desc
表名; //常用
mysql> describe 表名;
mysql> show columns from 表名;
5、修改表的名稱。(下面兩種寫法都可以實現修改表名)
mysql> alter table 原表名 rename to 新表名;
mysql> rename table 原表名 to 新表名;
例:mysql> alter table dept rename to de; //將dept表名稱改為de
6、修改表的編碼字符集。
mysql>alter table 表名 character set 字符集;
例:mysql>alter table 表名 character set gbk; //修改表的編碼字符集為gbk
7、向表中新增新的列。
mysql> alter table 表名 add <column> 列名 列的資料型別 [<列的完整性約束>];//column可省略
8、修改表中的某一列。
a)修改表中某一列的列名(同時可修改列的資料型別)
mysql>alter table 表名 change 原列名 新列名 列資料型別;
b)修改表中某一列的資料型別
mysql>alter table 表名 modify 列名 列新的資料型別;
9、刪除表中的某一列。
mysql>alter table 表名 drop <column> 列名; //column可省略
10、刪除表。
mysql>drop table 表名; //徹底刪除表,資料庫中不會保留表結構。注意與delete和truncate區別。
mysql>truncate 表名;
二、DML: 資料操作語言(Data Manipulation Language)
作用:操作表中的資料的。
關鍵字:INSERT、 UPDATE 、DELETE
1、向表中插入資料(每一行資料就是一條記錄),以下三種插入資料的方法皆可。
mysql>insert <into> 表名 values(列值1,列值2,......);
//into可以省略,插入的順序必須和建表的順序對應。
mysql>insert <into> 表名 (列名1,列名2,......)values(列值1,列值2,......); //建議使用
mysql>insert <into> 表名 values(列值1,列值2,......),(列值1,列值2,......),......;//一次性插入多條資料
例:向dept表中插入資料。
mysql>insert into dept(deptno,deptname)values(100,'銷售部');
2、修改某一列的所有欄位值為新的欄位值。
mysql>update 表名 set 列名=新欄位值;
mysql>update 表名 set 列名=新欄位值,列名=新欄位值...;
//批量修改多個列的所有欄位值都新欄位值。
3、修改某一條記錄的欄位值。
mysql>update 表名 set列名=新欄位值 where 列名=欄位值;
mysql>update 表名 set
列名=新欄位值,列名=新欄位值... where
列名=欄位值; //批量修改多個欄位的欄位值都為該值。
例:將學生表(student)中學號(sno)為520的學生的年齡(sage)改為21歲。
mysql>update student set sage=21 where sno=520;
4、刪除表中的某一條記錄。
mysql>delete from 表名 where 列名=列值;
例:刪除學生表(student)中名字(sname)為'張三'的學生的記錄
mysql>delete from student where sname='張三'; //注意,由於學生名字有重複的可能,所以會把所有名字叫張三的學生資訊都從student表中刪除掉,所以刪除單條記錄的條件可以參照主鍵約束的列,或者唯一約束的列,或者在已確定沒有重複的情況下自行確定where後面選的條件。
5、刪除表。
mysql>delete from 表名;
附:drop、truncate、delete的區別?
a)drop和truncate是DDL,而delete是DML。
b)truncate和delete只刪除資料,不會刪除表的結構,而drop會把資料和表結構都刪除。
c)delete可以帶where有條件的刪除,可以回滾(rollback),但刪除速度較truncate較慢。而truncate則不可以刪除特定的資料,也不可以回滾(rollback),但刪除速度比delete快。
建議:小心使用drop和truncate,尤其在資料沒有備份的情況下。
三、DQL:資料查詢語言(Data Query Language)
關鍵字:SELECT
1、查詢表中所有的記錄。
mysql> select * from 表名;
//*指代表中所有的列
mysql> select 列1,列2,... from 表名; //將表中所有的列都寫出來和上面效果相同。
例:查詢dept表中的所有資料
mysql> select * from dept; 或者 select deptno,deptname from dept;
2、查詢表中的某一條記錄。
mysql>select * from 表名 where 列名=欄位值;
例:查詢學生表(student)中名字(sname)叫'張三'的學生的學號(sno)、成績(grade)資訊。
mysql>select sno,grade from student where sname='張三';//當指定了要查詢的資訊,就不要用*號代替所有了。
3、過濾表中重複的資料(關鍵字distinct)
mysql>select distinct 列名 from 表名; //返回該欄位下的所有欄位值,若有相同欄位值,則只返回一個。
4、排序(關鍵字order by)。
mysql>select * from 表名 order by 列名 asc; //升序(預設),asc可省略不寫。
mysql>select * from 表名 order by 列名 desc; //降序
例:按照學生表(student)中學生成績(grade)的由高到低順序輸出學生的學號(sno)、姓名(sname)和成績(grade).
mysql>select sno,sname,grade from student order by grade desc;
5、分頁查詢(關鍵字limit)。
mysql>select * from 表名 limit (pageNo-1)*pagesize,pagesize; // pageNo-->要查詢的頁數,pageSize-->每頁顯示的記錄數
例:查詢dept表中第一頁(每頁2條資料)的記錄。
mysql>select * from 表名 limit 0,2;
6、模糊查詢(關鍵字like)。
mysql>select * from 表名 where 列名 like ' % '; //%指代任意字元
例:查詢學生表(student)中姓劉的學生的資訊。
mysql>select * from student where sname like '劉%';
例:查詢學生表中姓名第二個字為陽的學生資訊。
mysql>select * from student where sname like '_陽%';
//_指代一個字元
7、範圍查詢(關鍵字between .. and .. , in())。
mysql>select * from 表名 where 列名 between 欄位值(小) and 欄位值(大);//包含兩端的欄位值
mysql>select * from 表名 where 列名 in (欄位值1,欄位值2,......);
例如:查詢學生表(student)中語文成績chinese在80~90分之間的所有學生資訊(包含80和90)
mysql>select * from student where chinese between 80 and 90;
例如:查詢學生表(student)中數學成績math為60分,70分,80分和90分的所有學生資訊。
mysql>select * from student where math in (60,70,80,90);
8、使用別名。
mysql>select 欄位名 <as> 別名,欄位名 別名,... from 表名; //as可省略
例如:查詢學生成績表(sc)中學生姓名(sname)及總成績,sname欄位用姓名錶示,所有科目得分總和用總分表示。
mysql>select sname as 姓名,chinese+math+english 總分 from sc;
9、分組查詢(關鍵字group by)。
mysql>select 列名,count(列名) from 表名 group by 列名;
例如:查詢每個部門的員工人數,根據部門編號(deptno)對員工進行分組,返回各部門員工人數。
mysql>select deptno,count(empno) from emp group by deptno; //empno--員工編號,emp--員工表
having:對分組後的結果進行條件限制
例如:查詢每個部門員工人數大於2的所有記錄,返回人數大於2人的部門編號及其部門人數。
mysql>select deptno,count(empno) from emp group by deptno having count(empno)>2;
10、表連線查詢(同時涉及多個表的查詢稱為連線查詢,用來連線兩個表的條件稱為連線條件)。
內連線:表1 join 表2 on 表1.列名=表2.咧名;
例:查詢員工表(emp)中的員工號(empno)、員工姓名(empname)、部門號(deptno)和部門名稱(deptname),部門名稱欄位在部門表(dept)中.
mysql> select empno,empname,emp.deptno,deptname from emp join dept on emp.deptno=dept.deptno;
左外連線:表1 left join 表2 on 表1.列名=表2.列名;
表1作為主表,主表中的所有記錄都會輸出,和從表匹配不上的欄位用null進行補齊。
例:以員工表(emp)為主表實現上述查詢。
mysql> select empno,empname,emp.deptno,deptname from emp left join dept on emp.deptno=dept.deptno;
右外連線:表1 right join 表2 on 表1.列名=表2.列名;
表2為主表,主表中的所有記錄都會輸出,和從表匹配不上的欄位用null進行補齊。
例:以部門表(dept)為主表實現上述查詢。
mysql> select empno,empname,emp.deptno,deptname from emp right join dept on emp.deptno=dept.deptno;
11、表的複製。
mysql>create table 新表表名 select * from 被複製表表名; //新表的表結構和資料與原表相同。
mysql>create table 新表表名 select 列名1,列名2,... from 被複製表表名; //可以通過在select查詢中指定欄位來限制出現在新表中的欄位
mysql>create table 新表表名 select * from 被複製表表名 where 0=1; //通過使用select語句建立已存在表的空副本(即建立相同表結構,但不復制原表資料過來),並且返回一個空結果集。
12、聚合函式。
a)返回指定列非空值的個數
mysql>select count(列名) from 表名;
例:查詢學生表(student)中學生的總人數。
mysql>select count(sno) from student; //根據學生學號計算學生個數,學號不為空且唯一
b)返回指定列的最值
mysql>select max(列名) from 表名; //返回指定列的最大值
例:查詢學生表(student)中年齡(sage)最大的學生姓名(sname)和年齡。
mysql>select sname,max(sage) from student;
mysql>select min(列名) from 表名; //返回指定列的最小值
例:查詢學生成績表(sc)中語文成績(chinese) 最低的學生的學號(sno)和語文成績。
mysql>select sno,min(chinese) from sc;
c)返回指定列的平均值
mysql>select avg(列名) from 表名;
d)返回指定列的所有值之和
mysql>select sum(列名) from 表名;