mysql

  1. =======選擇或創建一個數據庫=======

+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+

新建語法: create database 數據庫名字;

create database test2;

使用(切換)庫: use 數據庫名;

use test2;

  1. =======顯示錶=======
    show tables;

  2. =======創建表=======
    create table 表名(
    列名1 類型 約束,
    列名2 類型 約束,
    ...
    列名n 類型 約束,
    約束
    );

create table Student(
id int,
name varchar(10)
);

  1. =======查看錶結構=======
    desc 表名;

  2. =======插入數據=======
    insert into 表名(列1, 列2...列n) values (值1,值2... 值n);

insert into student(id,name) values(1, '張三');
insert into student(id,name) values(2, '李四');

  1. =======查詢數據=======
    select 列1,列2....列n from 表名;

select id,name from student;
select * from student;

  1. =======數據類型=======
    整數類型
    int -2^31 ~ 2^31-1 四個字節
    tinyint 一個字節
    smallint 兩個字節
    bigint 八個字節
    小數類型
    浮點類型
    FLOAT
    DOUBLE
    定點類型 (小數部分不會丟失精度,佔用空間高)
    DECIMAL(p, s)
    p 有效數字長度
    s 小數位數

    decimal(10, 2)
    12345678.77  ok
    123456789.44  存不下
    12345678.456  小數部分變爲46

字符串類型
char(最大長度) 定長的字符類型
varchar(最大長度) 變長的字符類型

name char(5)  'abc'  存儲後  'abc  '  用空格補齊不足的部分, 再查詢時會去掉, 效率高,但佔用空間多, 最大值255
name varchar(5) 'abc'  存儲後 'abc'    不會用空格補齊                , 不會佔用額外空間, 效率較char低, 最大值65535

日期類型
datetime 包括年月日,時分秒 時間範圍短(1000-1-1 ~ 9999-12-31)
date 只包括年月日
time 只包括時分秒
timestamp 也可以包括年月日時分秒, 時間範圍短(1970-1-1 ~ 2038-1-19)

create table test(
a datetime,
b date,
c time,
d timestamp
);
now() 獲取當前時間

insert into test(a,b,c,d) values(now(),now(),now(),now());
insert into test(a) values('1999-5-8 10:30:00');

  1. =======約束=======
    學生表 student
    編號 int sid
    姓名 varchar sname
    生日 date birthday
    性別 char sex

-- 把約束加在類型之後
create table student(
sid int unique,
sname varchar(20),
birthday date,
sex char(1)
);
-- 把約束單獨一行
create table student(
sid int not null,
sname varchar(20) not null,
birthday date,
sex char(1),
unique(sid)
);
刪除表可以使用 drop table 表名;

可以使用 unique 唯一約束,一個表中可以有多個唯一約束
not null 非空約束, 讓列的取值不能爲空
primary key 主鍵約束, 效果上綜合的唯一和非空, 一個表只能有一個主鍵
foreign key 外鍵約束, 檢查兩表的關係列是否合法, 被引用的列必須是唯一的
check (mysql不支持)
create table student(
sid int primary key,
sname varchar(20) not null,
birthday date,
sex char(1),
cid int,
foreign key(cid) references class(cid) / student中的cid取值必須引用class中的cid的值 /
);
create table student(
sid int,
sname varchar(20) not null,
birthday date,
sex char(1),
cid int,
primary key(sid),
foreign key(cid) references class(cid) / student中的cid取值必須引用class中的cid的值 /
);
insert into student(sid,sname,birthday,sex,cid)values(1,'張三',now(),'男',2);
insert into student(sid,sname,birthday,sex,cid)values(2,'李四',now(),'男',3);

create table class(
cid int primary key,
cname varchar(20)
);

  1. 自增列 (主要用在給主鍵產生一個唯一值)
    create table course(
    cid int primary key auto_increment, /產生一個自動增長的值/
    cname varchar(10)
    );
    insert into course(cid, cname) values(null, 'java se'); -- 給null
    insert into course(cname) values('web'); -- 直接把名字和值從insert中去掉
    注意用了自增長,就不要手動賦值了,否則會使用手動賦的值

不從1開始的例子
create table course(
cid int primary key auto_increment, /產生一個自動增長的值/
cname varchar(10)
) auto_increment=1000;

  1. 默認值 (default)
    create table person(
    id int primary key auto_increment,
    cname varchar(10),
    sex char(1) default '男',
    lastmodify timestamp default current_timestamp on update current_timestamp
    );
    -- default current_timestamp 插入數據時,採用當前時間作爲默認值
    -- on update current_timestamp 修改數據時,採用修改那個時刻的時間來更新這一列
    insert into person(cname) values('張三');
    insert into person(cname,sex) values('李四','女');

  2. 修改
    update 表 set 列名=新值, 列2=值2 ...; -- 修改表中所有的行
    update 表 set 列名=新值, 列2=值2 ... where 列名=條件; -- 僅更新符合條件的記錄

update course set cname='java se'; -- 修改表中所有課程名稱
update course set cname='spring' where cid=1000; -- 僅修改了cid=1000 這條記錄的課程名稱

  1. 刪除
    delete from 表名; -- 刪除這個表中所有記錄,但表的定義不動
    delete from 表名 where 列名=條件; -- 僅刪除符合條件的記錄

drop table 表名; -- 刪除這個表,連同裏面的數據

  1. 導入數據
    1) 可以用
    mysql > source 路徑\sql文件的名稱;

    例如:source E:\6.23實訓班共享\預習\數據庫(詳)\scott.sql

2) 在cmd窗口運行
mysql -uroot -p test3 < E:\6.23實訓班共享\預習\數據庫(詳)\scott.sql
其中test3是數據庫的名字

  1. 導出數據
    在cmd窗口運行
    mysqldump -uroot -p test3 > a.sql
    #1. SQL 結構化查詢語言 structured query language
    sql語句對於不同數據庫有微小差異

1) DDL 數據定義語言
create 創建表、視圖、索引...
drop 刪除表、視圖、索引...
alter 修改表
truncate 截斷

2) DML 數據操控語言 (**)
insert 插入數據
update 修改數據
delete 刪除數據
select 查詢數據

3) DCL 數據控制語言
grant 授權
revoke 回收授權

4) TCL 事務控制語言 transaction control
start transaction 開始事務(begin)
commit
rollback

#2. DDL

##2.1 組合主鍵
unique 唯一
not null 非空
primary key 主鍵 (只要有一個)
foreign key 外鍵 (需要引用另一個表的主鍵或唯一列)

|     1001 | 張三     |        1 | 企業管理 |   50 |
|     1001 | 張三     |        1 | 企業管理 |   90 |  非法記錄
|     1001 | 張三     |        2 | 馬克思   |   70 |
|     1003 | 王五     |        2 | 馬克思   |   70 |

1001 + 1
1001 + 1 非法
1001 + 2 
1003 + 2

create table sc(
...
primary key (sid, cid) /組(復)合主鍵/
);

2.1 alter 修改

給老師表添加一列年齡 alter table teacher add age tinyint;
給老師表的姓名列擴展長度 alter table teacher modify tname varchar(30);

2.2 truncate 截斷

delete from 表; -- 如果和事務sql結合使用,是有機會恢復
truncate table 表; -- 沒法和事務結合,不能恢復,效率更高

#3. DML

3.1 insert 插入數據

標準語法: insert into 表(多個列...) values (多個值...);
mysql獨有的: 一次插入多行數據
insert into 表(多個列...) values
(多個值), (多個值), (多個值) ...;
標準SQL寫法:
insert into student values(null,'張三','1990-10-10','男');
insert into student values(null,'李四','1981-10-10','男');
insert into student values(null,'王五','1981-11-10','女');
insert into student values(null,'趙六','1988-10-10','男');
insert into student values(null,'孫七','1989-01-10','女');
insert into student values(null,'周八','1990-10-10','男');
insert into student values(null,'張三','1990-06-10','女');
mysql寫法:
insert into student values(null,'張三','1990-10-10','男'),
(null,'李四','1981-10-10','男'),
(null,'王五','1981-11-10','女'),
(null,'趙六','1988-10-10','男'),
(null,'孫七','1989-01-10','女'),
(null,'周八','1990-10-10','男'),
(null,'張三','1990-06-10','女');

標準語法:用insert插入另一張表的數據(列的個數和類型要一致)
insert into 表1(列1,列2...) select 列1,列2... from 表2;
insert into s2(sid,sname) select sid,sname from student;

3.2 update 對已有的數據進行更新

-- 更新所有的員工工資漲100
update emp set sal=sal+100;

-- 修改7369的員工部門爲10號部門
update emp set deptno=10 where empno=7369;

-- 修改7000的員工部門爲10號部門
update emp set deptno=10 where empno=7000;
如果條件不滿足去更新不會報錯,但影響行數是0

-- 修改7369的員工工資爲9000,職務經理
update emp set sal=9000,job='manager'
where empno=7369;

注意:主鍵列主要用於查詢條件,一般不會更新

3.3 刪除

delete from 表; 全部刪除
delete from 表 where 條件; 刪除符合條件的記錄

-- 刪除不能成功,因爲員工表中有記錄引用了10號部門
delete from dept where deptno=10;

-- 刪除成功,因爲40號部門沒有員工引用
delete from dept where deptno=40;

主鍵所在表可以稱爲主表,而外界所在表稱爲從表
主表中刪除的記錄,如果被從表引用,那麼會刪除失敗,違反外鍵約束(外鍵約束默認行爲)。

外鍵約束還有一種行爲,主表記錄刪除,把從表中與之關聯的記錄一塊刪除(級聯刪除)
以員工和部門爲例:foreign key(deptno) references dept(deptno) on delete cascade
例如: 刪除10號部門,不僅會刪除10號部門,而且會被從表(emp)中的10部門下所有員工也一塊刪除

3.4 select 查詢

select 列名... from 表名 where 條件;

條件

1.比較運算
表示相等的 =
大於 >
大於等於 >=
小於 <
小於等於 <=
不等於 !=

2.邏輯運算 and(並且) or(或者) not(取反)

-- 查詢工資大於800 並且 部門等於20
where sal>800 and deptno=20
-- 部門=20 或者 等於30的
where deptno=20 or deptno=30;

  1. null值
    數據庫中的null ,比較特殊,不能使用=來比較, 必須用 is null
    例如:查詢佣金爲null的員工
    select from emp where comm is null;
    例如:查詢佣金不爲null的員工
    select
    from emp where comm is not null;

  2. like (模糊查詢)
    例如查詢以 ‘S’字母打頭的員工

select * from emp where ename like 'S%';

通配符 % 表示匹配0~多個任意的字符
通配符 _ 表示匹配一個任意字符

  1. between ... and ... 範圍匹配
    求工資大於等於1000, 小於等於2000的員工
    select * from emp where sal>=1000 and sal<=2000;

select * from emp where sal between 1000 and 2000;
1) 必須按有小到大順序
2) between 包含等於條件

  1. in 求這一列是否在一個值列表內
    求所有銷售人員和經理
    select * from emp where job='SALESMAN' or job='MANAGER';

select * from emp where job in ('SALESMAN', 'MANAGER');

  1. limit (mysql特有的)
    用來限制返回的結果數
    1) limit n; n表示最多返回幾條記錄
    2) limit m, n; m代表偏移量(下標) 注意偏移量從0開始

  2. order by 用來給結果排序
    語法: order by 列名 asc|desc, 列名 asc|desc, ...
    例如:按工資升序:
    select from emp order by sal;
    select
    from emp order by sal asc;
    按工資降序:
    select * from emp order by sal desc;
    其中如果不寫asc或desc,默認升序

如果多列排序,如果第一列取值相同,再按照第二列進行排序,例如:
先按工資排序,工資相同的,再按姓名排序:
select from emp order by sal asc, ename asc; /如果升序,兩個asc都可以省略*/

  1. select 語句的順序:
    select ... from 表 where 條件 order by 排序 limit 限制

3.5 函數

例如 lower 函數把字符變成小寫
upper 函數把字符變成大寫

常用的函數 :
1) 時間加減
date_add(原始時間, 時間間隔)
時間間隔的語法: interval 數字 時間單位
數字可以是正數或負數

select date_add(now(), interval 1 day );

2) 提取時間的某個部分
extract(時間部分 from 原始時間)
select extract(year from now());
select extract(year_month from now());
返回的結果是一個數字類型

例:要獲取1981年入職的員工
select * from emp where extract(year from hiredate)=1981;

3)類型轉換
select cast('11' as signed)+1;
select cast('12.55555' as decimal(5,2));

4)拼接字符串
concat(值1, 值2, ... 值n)
select concat('a', 'b', 'c');
select concat('a', 18, 'c'); /可以把其它類型當做字符串拼接/

5) 求長度的函數
char_length 按字符爲單位統計長度
length 按字節爲單位統計長度
utf8mb4編碼下,漢字一個字符佔三個字節,英文一個字符佔一個字節

6) 標準sql:
case
when 條件1 then 值1
when 條件2 then 值2
...
else 值n
end
整個case...end 最後返回一個值

select sal,
case
when sal>2000 then '高工資'
when sal between 1000 and 2000 then '中等'
else '低工資'
end from emp;

7) 組函數
最大值 max(列)
最小值 min(列)
和 sum(列)
個數 count(列) 會排除null值
count(*) 針對這次查詢,看看一共有多少行
平均值 avg(列)

8) 去除重複
distinct
select distinct job from emp; /去除重複後的職位有哪些/
select count(distinct job) from emp; /有幾種職位/

9) 查詢幫助
? contents 總目錄

3.6 分組語法 (group by 後的列取值相同的會被分爲一組)

select ... from 表 group by 列1,列2... having 分組條件

select deptno,count(*),max(sal) from emp group by deptno;
把部門編號取值相同的分爲一組, 配合組函數一起使用

| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |
| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |
| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |

| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |
| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000.00 | NULL | 20 |
| 7876 | ADAMS | CLERK | 7788 | 1987-07-13 | 1100.00 | NULL | 20 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |

| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |
| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |

查詢分組後個數大於3的部門編號和個數
select deptno,count(),max(sal) from emp
group by deptno having count(
)>3 order by max(sal);

分組後 select,order by 的限制
1) select,order by 中的列必須和group by中的列一樣
2) 其它沒有包含在 group by語句中的列,必須和組函數一起用

執行從先到後
where 進行一遍條件過濾 , 再執行 group by 分組, 再執行 having中的條件, 再執行select, 再執行order by, 執行limit

語法順序
select ... from ... where ... group by ... having ... order by ... limit;

列別名問題
語法: select 列名 別名 ...
語法2: select 列名 as 別名 ...

select deptno 部門編號,count() 人數,max(sal) 最高工資 from emp
group by deptno having count(
)>3 order by max(sal);

select deptno 部門編號,count() 人數,max(sal) 最高工資 from emp
group by deptno having count(
)>3 order by 人數;

select empno "員工 編號" from emp; /列別名中如果存在空格等特殊符號,需要用雙引號包圍列別名/

表別名問題
語法 : select ... from 表 別名
select e.* from emp e;

多列分組
select deptno, job, count() from emp group by deptno, job;
/
按deptno和job這兩列取值都相同的分爲一組*/

| 7934 | MILLER | CLERK | 7782 | 1982-01-23 | 1300.00 | NULL | 10 |

| 7782 | CLARK | MANAGER | 7839 | 1981-06-09 | 2450.00 | NULL | 10 |

| 7839 | KING | PRESIDENT | NULL | 1981-11-17 | 5000.00 | NULL | 10 |

| 7788 | SCOTT | ANALYST | 7566 | 1987-07-13 | 3000.00 | NULL | 20 |
| 7902 | FORD | ANALYST | 7566 | 1981-12-03 | 3000.00 | NULL | 20 |

| 7369 | SMITH | CLERK | 7902 | 1980-12-17 | 800.00 | NULL | 20 |
| 7876 | ADAMS | CLERK | 7788 | 1987-07-13 | 1100.00 | NULL | 20 |

| 7566 | JONES | MANAGER | 7839 | 1981-04-02 | 2975.00 | NULL | 20 |

| 7900 | JAMES | CLERK | 7698 | 1981-12-03 | 950.00 | NULL | 30 |

| 7698 | BLAKE | MANAGER | 7839 | 1981-05-01 | 2850.00 | NULL | 30 |

| 7499 | ALLEN | SALESMAN | 7698 | 1981-02-20 | 1600.00 | 300.00 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 1981-02-22 | 1250.00 | 500.00 | 30 |
| 7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250.00 | 1400.00 | 30 |
| 7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500.00 | 0.00 | 30 |

補充內容:正則表達式的使用:
|1001 | 張三 | 1990-10-10 | 男 |
|1002 | 李四 | 1981-10-10 | 男 |
|1003 | 王五 | 1981-11-10 | 女 |
|1004 | 趙六 | 1988-10-10 | 男 |
|1005 | 孫七 | 1989-01-10 | 女 |
|1006 | 周八 | 1990-10-10 | 男 |
|1007 | 張三 | 1990-06-10 | 女 |
1) 替換開頭的|
^| 替換爲 insert into student(sid,sname,birthday,sex) values (
2) 替換結束的|
|$ 替換爲 );
3)替換中間的內容,其中() 用來分組,分組後就可以使用 $1 引用第一個組的內容
|\s+([^\s.]+) 替換爲 ,'$1'

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