MySQL學習(入門)

一、數據庫概述

數據庫(DataBase,DB):指長期保存在計算機的存儲設備上,按照一定規則組織起來,可以被各種用戶或應用共享的數據集合。(文件系統)

數據庫管理系統(DataBase Management System,DBMS):指一種操作和管理數據庫的大型軟件,用於建立、使用和維護數據庫,對數據庫進行統一管理和控制,以保證數據庫的安全性和完整性。用戶通過數據庫管理系統訪問數據庫中的數據。

數據庫軟件應該爲數據庫管理系統,數據庫是通過數據庫管理系統創建和操作的。

數據庫:存儲、維護和管理數據的集合。

【數據庫的安裝與配置(具體步驟不再贅述,可以參考百度)】

二、Sql的分類

  • DDL(Data Definition Language):數據定義語言,用來定義數據庫對象:庫、表、列等; CREATE、 ALTER、DROP
  • DML(Data Manipulation Language):數據操作語言,用來定義數據庫記錄(數據); INSERT、 UPDATE、 DELETE
  • DCL(Data Control Language):數據控制語言,用來定義訪問權限和安全級別;
  • DQL(Data Query Language):數據查詢語言,用來查詢記錄(數據)。
    SELECT

注意:sql語句以“;”結尾

2.1 DDL:操作數據庫、表、列等

使用的關鍵字:CREATE、 ALTER、 DROP

2.1.1操作數據庫

創建

CREATE DATABASE mydb1;
CREATE DATABASE mydb2 CHARACTER SET gbk;
CREATE DATABASE mydb3 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE mydb4 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

查詢
查看當前數據庫服務器中的所有數據庫
show databases;
查看前面創建的mydb2數據庫的定義信息
Show create database mydb2;
刪除前面創建的mydb3數據庫
Drop database mydb3;

修改
查看服務器中的數據庫,並把mydb2的字符集修改爲utf8;
alter database mydb2 character set utf8;
刪除
drop database mydb3;

其他:
查看當前使用的數據庫
select database();
切換數據庫
use mydb2;

2.1.2操作數據表

語法:

create table 表名(
    字段1 字段類型,
    字段2 字段類型,
    ...
    字段n 字段類型
);

常用數據類型:

int:整型
double:浮點型,例如double(5,2)表示最多5位,其中必須有2位小數,即最大值爲999.99;
char:固定長度字符串類型; char(10) ‘abc ’
varchar:可變長度字符串類型;varchar(10) ‘abc’
text:字符串類型;
blob:字節類型;
date:日期類型,格式爲:yyyy-MM-dd;
time:時間類型,格式爲:hh:mm:ss
timestamp:時間戳類型 yyyy-MM-dd hh:mm:ss 會自動賦值
datetime:日期時間類型 yyyy-MM-dd hh:mm:ss

--查看當前數據庫中的所有表
SHOW TABLES;
--查看錶的字段信息
DESC employee;
--在上面員工表的基本上增加一個image列。
ALTER TABLE employee ADD image blob;
--修改job列,使其長度爲60。
ALTER TABLE employee MODIFY job varchar(60);
--刪除image列,一次只能刪一列。
ALTER TABLE employee DROP image;
--表名改爲user。
RENAME TABLE employee TO user;
--查看錶格的創建細節
SHOW CREATE TABLE user;
--修改表的字符集爲gbk
ALTER TABLE user CHARACTER SET gbk;
--列名name修改爲username
ALTER TABLE user CHANGE name username varchar(100);

刪除表
DROP TABLE user ;

2.2 DML操作(重要)

查詢表中的所有數據
SELECT * FROM 表名;

DML是對錶中的數據進行增、刪、改的操作。不要與DDL混淆了。
INSERT 、UPDATE、 DELETE

注意:
在mysql中,字符串類型和日期類型都要用單引號括起來。’tom’ ‘2015-09-04’
空值:null

2.2.1插入操作:INSERT:

語法: INSERT INTO 表名(列名1,列名2 ...)VALUES(列值1,列值2...);

注意:列名與列值的類型、個數、順序要一一對應。可以把列名當做java中的形參,把列值當做實參。值不要超出列定義的長度。如果插入空值,請使用null。插入的日期和字符一樣,都使用引號括起來。

練習 :

create table emp(
id int,
name varchar(100),
gender varchar(10),
birthday date,
salary float(10,2),
entry_date date,
resume text
);

INSERT INTO emp(id,name,gender,birthday,salary,entry_date,resume)
VALUES(1,'zhangsan','female','1990-5-10',10000,'2015-5-5-','good girl');
......

批量插入:
INSERT INTO emp VALUES
(4,'zs','m','2015-09-01',10000,'2015-09-01',NULL),
(5,'li','m','2015-09-01',10000,'2015-09-01',NULL),
(6,'ww','m','2015-09-01',10000,'2015-09-01',NULL);

2.2.2 修改操作 UPDATE:

語法:UPDATE 表名 SET 列名1=列值1,列名2=列值2 。。。 WHERE 列名=值

練習:

--將所有員工薪水修改爲5000元。
UPDATE emp SET salary=5000 
--將姓名爲’zs’的員工薪水修改爲3000元。
UPDATE emp SET salary=3000 WHERE name=’ zhangsan’;
--將姓名爲’aaa’的員工薪水修改爲4000元,job改爲ccc。
 UPDATE emp SET salary=4000,gender='female' WHERE name='lisi';
--將wu的薪水在原有基礎上增加1000元。
 UPDATE emp SET salary=salary+1000 WHERE gender='male'; 

2.2.3 刪除操作 DELETE:

語法 :DELETE FROM 表名 【WHERE 列名=值】

練習 :

--刪除表中名稱爲’zs’的記錄。
DELETE FROM emp WHERE name=‘zs’;
--刪除表中所有記錄。
DELETE FROM emp;
--使用truncate刪除表中記錄。
TRUNCATE TABLE emp;

DELETE 刪除表中的數據,表結構還在;刪除後的數據可以找回
TRUNCATE 刪除是把表直接DROP掉,然後再創建一個同樣的新表。
刪除的數據不能找回。執行速度比DELETE快。

2.3 DQL操作

DQL數據查詢語言 (重要)
數據庫執行DQL語句不會對數據進行改變,而是讓數據庫發送結果集給客戶端。
查詢返回的結果集是一張虛擬表。

查詢關鍵字:SELECT
語法:
SELECT 列名 FROM 表名
【WHERE --> GROUP BY -->HAVING--> ORDER BY】

語法:

SELECT selection_list /*要查詢的列名稱*/
  FROM table_list /*要查詢的表名稱*/
  WHERE condition /*行條件*/
  GROUP BY grouping_columns /*對結果分組*/
  HAVING condition /*分組後的行條件*/
  ORDER BY sorting_columns /*對結果分組*/
  LIMIT offset_start, row_count /*結果限定*/

創建表:

學生表:stu
字段名稱 字段類型 說明
sid char(6) 學生學號
sname varchar(50) 學生姓名
age int 學生年齡
gender varchar(50) 學生性別

CREATE TABLE stu (
    sid CHAR(6),
    sname       VARCHAR(50),
    age     INT,
    gender  VARCHAR(50)
);
INSERT INTO stu VALUES('S_1001', 'liuYi', 35, 'male');
INSERT INTO stu VALUES('S_1002', 'chenEr', 15, 'female');
INSERT INTO stu VALUES('S_1003', 'zhangSan', 95, 'male');
INSERT INTO stu VALUES('S_1004', 'liSi', 65, 'female');
INSERT INTO stu VALUES('S_1005', 'wangWu', 55, 'male');
INSERT INTO stu VALUES('S_1006', 'zhaoLiu', 75, 'female');
INSERT INTO stu VALUES('S_1007', 'sunQi', 25, 'male');
INSERT INTO stu VALUES('S_1008', 'zhouBa', 45, 'female');
INSERT INTO stu VALUES('S_1009', 'wuJiu', 85, 'male');
INSERT INTO stu VALUES('S_1010', 'zhengShi', 5, 'female');
INSERT INTO stu VALUES('S_1011', 'xxx', NULL, NULL);

僱員表:emp

字段名稱 字段類型 說明
empno int 員工編號
ename varchar(50) 員工姓名
job varchar(50) 員工工作
mgr int 領導編號
hiredate date 入職日期
sal decimal(7,2) 月薪
comm decimal(7,2) 獎金
deptno int 部分編號

CREATE TABLE emp(
    empno       INT,
    ename       VARCHAR(50),
    job     VARCHAR(50),
    mgr     INT,
    hiredate    DATE,
    sal     DECIMAL(7,2),
    comm        decimal(7,2),
    deptno      INT
) ;
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);

部分表:dept

字段名稱 字段類型 說明
deptno int 部分編碼
dname varchar(50) 部分名稱
loc varchar(50) 部分所在地點

CREATE TABLE dept(
    deptno      INT,
    dname       varchar(14),
    loc     varchar(13)
);
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');

1 基礎查詢
1.1 查詢所有列
SELECT * FROM stu;

1.2 查詢指定列
SELECT sid, sname, age FROM stu;

2 條件查詢
2.1 條件查詢介紹
條件查詢就是在查詢時給出WHERE子句,在WHERE子句中可以使用如下運算符及關鍵字:

  • =、!=、<>、<、<=、>、>=;
  • BETWEEN…AND;
  • IN(set);
  • IS NULL; IS NOT NULL
  • AND;
  • OR;
  • NOT;

2.2 查詢性別爲女,並且年齡50的記錄

SELECT * FROM stu 
WHERE gender='female' AND ge<50;

2.3 查詢學號爲S_1001,或者姓名爲liSi的記錄

SELECT * FROM stu 
WHERE sid ='S_1001' OR sname='liSi';

2.4 查詢學號爲S_1001,S_1002,S_1003的記錄

SELECT * FROM stu 
WHERE sid IN ('S_1001','S_1002','S_1003');

2.5 查詢學號不是S_1001,S_1002,S_1003的記錄

SELECT * FROM tab_student 
WHERE s_number NOT IN ('S_1001','S_1002','S_1003');

2.6 查詢年齡爲null的記錄

SELECT * FROM stu
WHERE age IS NULL;

2.7 查詢年齡在20到40之間的學生記錄

SELECT * 
FROM stu
WHERE age>=20 AND age<=40;
或者
SELECT * 
FROM stu 
WHERE age BETWEEN 20 AND 40;

2.8 查詢性別非男的學生記錄

SELECT * 
FROM stu
WHERE gender!='male';
或者
SELECT * 
FROM stu
WHERE gender<>'male';
或者
SELECT * 
FROM stu
WHERE NOT gender='male';

2.9 查詢姓名不爲null的學生記錄

SELECT * 
FROM stu
WHERE sname IS NOT NULL;
或者
SELECT * 
FROM stu
WHERE NOT sname IS NULL;

3 模糊查詢
當想查詢姓名中包含a字母的學生時就需要使用模糊查詢了。模糊查詢需要使用關鍵字LIKE。
通配符:

_ 任意一個字符
%:任意0~n個字符
'%張%'  '張_'

3.1 查詢姓名由5個字母構成的學生記錄

SELECT * 
FROM stu
WHERE sname LIKE '_____';

模糊查詢必須使用LIKE關鍵字。其中 “”匹配任意一個字母,5個“”表示5個任意字母。

3.2 查詢姓名由5個字母構成,並且第5個字母爲“i”的學生記錄

SELECT * 
FROM stu
WHERE sname LIKE '____i';

3.3 查詢姓名以“z”開頭的學生記錄

SELECT * 
FROM stu
WHERE sname LIKE 'z%';
--其中“%”匹配0~n個任何字母。

3.4 查詢姓名中第2個字母爲“i”的學生記錄

SELECT * 
FROM stu
WHERE sname LIKE '_i%';

3.5 查詢姓名中包含“a”字母的學生記錄

SELECT * 
FROM stu
WHERE sname LIKE '%a%';

4 字段控制查詢
4.1 去除重複記錄
去除重複記錄(兩行或兩行以上記錄中系列的上的數據都相同),例如emp表中sal字段就存在相同的記錄。當只查詢emp表的sal字段時,那麼會出現重複記錄,那麼想去除重複記錄,需要使用DISTINCT:

SELECT DISTINCT sal FROM emp;

4.2 查看僱員的月薪與佣金之和
因爲sal和comm兩列的類型都是數值類型,所以可以做加運算。如果sal或comm中有一個字段不是數值類型,那麼會出錯。

SELECT *,sal+comm FROM emp;

comm列有很多記錄的值爲NULL,因爲任何東西與NULL相加結果還是NULL,所以結算結果可能會出現NULL。下面使用了把NULL轉換成數值0的函數IFNULL:

SELECT *,sal+IFNULL(comm,0) FROM emp;

4.3 給列名添加別名
在上面查詢中出現列名爲sal+IFNULL(comm,0),這很不美觀,現在我們給這一列給出一個別名,爲total:
SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
給列起別名時,是可以省略AS關鍵字的:
SELECT *,sal+IFNULL(comm,0) total FROM emp;

5 排序 order by 列名 asc(默認) desc
5.1 查詢所有學生記錄,按年齡升序排序

SELECT *
FROM stu
ORDER BY sage ASC;
或者
SELECT *
FROM stu
ORDER BY sage;

5.2 查詢所有學生記錄,按年齡降序排序

SELECT *
FROM stu
ORDER BY age DESC;

5.3 查詢所有僱員,按月薪降序排序,如果月薪相同時,按編號升序排序

SELECT * FROM emp
ORDER BY sal DESC,empno ASC;

6 聚合函數 sum avg max min count
聚合函數是用來做縱向運算的函數:

  • COUNT():統計指定列不爲NULL的記錄行數;
  • MAX():計算指定列的最大值,如果指定列是字符串類型,那麼使用字符串排序運算;
  • MIN():計算指定列的最小值,如果指定列是字符串類型,那麼使用字符串排序運算;
  • SUM():計算指定列的數值和,如果指定列類型不是數值類型,那麼計算結果爲0;
  • AVG():計算指定列的平均值,如果指定列類型不是數值類型,那麼計算結果爲0;

6.1 COUNT
當需要縱向統計時可以使用COUNT()。

  • 查詢emp表中記錄數:
    SELECT COUNT(*) AS cnt FROM emp;

  • 查詢emp表中有佣金的人數:
    SELECT COUNT(comm) cnt FROM emp;

    注意,因爲count()函數中給出的是comm列,那麼只統計comm列非NULL的行數。

  • 查詢emp表中月薪大於2500的人數:
    SELECT COUNT(*) FROM emp WHERE sal > 2500;

  • 統計月薪與佣金之和大於2500元的人數:
    SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;

  • 查詢有佣金的人數,有領導的人數:
    SELECT COUNT(comm), COUNT(mgr) FROM emp;

6.2 SUM和AVG
當需要縱向求和時使用sum()函數。

  • 查詢所有僱員月薪和:
    SELECT SUM(sal) FROM emp;

  • 查詢所有僱員月薪和,以及所有僱員佣金和:
    SELECT SUM(sal), SUM(comm) FROM emp;

  • 查詢所有僱員月薪+佣金和:
    SELECT SUM(sal+IFNULL(comm,0)) FROM emp;

  • 統計所有員工平均工資:
    SELECT AVG(sal) FROM emp;

6.3 MAX和MIN

  • 查詢最高工資和最低工資:
    SELECT MAX(sal), MIN(sal) FROM emp;

7 分組查詢

當需要分組查詢時需要使用GROUP BY子句,例如查詢每個部門的工資和,這說明要使用部門來分組。

注:凡和聚合函數同時出現的列名,一定要寫在group by 之後

7.1 分組查詢

  • 查詢每個部門的部門編號和每個部門的工資和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno;
  • 查詢每個部門的部門編號以及每個部門的人數:
SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno;
  • 查詢每個部門的部門編號以及每個部門工資大於1500的人數:
SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;

7.2 HAVING子句

  • 查詢工資總和大於9000的部門編號以及工資和:
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;

注:having與where的區別:

1.having是在分組後對數據進行過濾.
where是在分組前對數據進行過濾

2.having後面可以使用聚合函數(統計函數)
where後面不可以使用聚合函數。

WHERE是對分組前記錄的條件,如果某行記錄沒有滿足WHERE子句的條件,那麼這行記錄不會參加分組;而HAVING是對分組後數據的約束。

8 LIMIT 方言
LIMIT用來限定查詢結果的起始行,以及總行數。

8.1 查詢5行記錄,起始行從0開始
SELECT * FROM emp LIMIT 0, 5;

注意,起始行從0開始,即第一行開始!

8.2 查詢10行記錄,起始行從3開始
SELECT * FROM emp LIMIT 3, 10;

8.3 分頁查詢
如果一頁記錄爲10條,希望查看第3頁記錄應該怎麼查呢?

  • 第一頁記錄起始行爲0,一共查詢10行;
  • 第二頁記錄起始行爲10,一共查詢10行;
  • 第三頁記錄起始行爲20,一共查詢10行;

8.4 查詢代碼的書寫順序和執行順序

查詢語句書寫順序:select -> from -> where -> group by -> having -> order by -> limit
查詢語句執行順序:from -> where -> group by -> having -> select -> order by -> limit 

三、數據的完整性

作用:保證用戶輸入的數據保存到數據庫中是正確的。
確保數據的完整性 = 在創建表時給表中添加約束
完整性的分類:

  1. 實體完整性
  2. 域完整性
  3. 引用完整性

1、實體完整性
實體:即表中的一行(一條記錄)代表一個實體(entity)
實體完整性的作用:標識每一行數據不重複。
約束類型: 主鍵約束(primary key) 唯一約束(unique) 自動增長列(auto_increment)

1.1主鍵約束(primary key)
特點:數據唯一,且不能爲null
例:
第一種添加方式:

CREATE TABLE student(
Id int primary key,
Name varchar(50)
);

第二種添加方式:此種方式優勢在於,可以創建聯合主鍵

CREATE TABLE student(
id int,
Name varchar(50),
Primary key(id)
);
CREATE TABLE student(
id int,
Name varchar(50),
Primary key(id,name)
);

第三種添加方式:

CREATE TABLE student(
Id int,
Name varchar(50)
);
ALTER TABLE student
ADD  PRIMARY KEY (id);

1.2唯一約束(unique):

CREATE TABLE student(
Id int primary key,
Name varchar(50) unique
);

1.3自動增長列(auto_increment)

給主鍵添加自動增長的數值,列只能是整數類型,但是如果刪除之前增長的序號,後面再添加的時候序號不會重新開始,而是會接着被刪除的那一列的序號

CREATE TABLE student(
Id int primary key auto_increment,
Name varchar(50)
);

INSERT INTO student(name) values(‘tom’);

2、域完整性
域完整性的作用:限制此單元格的數據正確,不對照此列的其它單元格比較
域代表當前單元格
域完整性約束:數據類型 非空約束(not null) 默認值約束(default)
Check約束(mysql不支持) check();
2.1 數據類型:(數值類型、日期類型、字符串類型)
2.2 非空約束:not null

CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10)
);

INSERT INTO student values(1,’tom’,null);

2.3 默認值約束 default

CREATE TABLE student(
Id int pirmary key,
Name varchar(50) not null,
Sex varchar(10) default ‘男’
);

insert into student1 values(1,'tom','女');
insert into student1 values(2,'jerry',default);

3、引用完整性
要有外鍵必須先有主鍵,主鍵和外鍵的類型必須一致

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章