MySQL資料庫筆記

2020-12-22 走進編程世界

1、默認的埠號:3306

2、默認的字符集:UTF-8

3、Mysql安裝目錄:

bin 都是exe的可以執行的文件

include 頭文件

lib 庫文件

share 字符集語言

4、my.ini 這個文件可以修改MySQL配置信息,如:埠號,一般不改,如果這個配置文件修改了,要重啟MySQL的服務。

5、開啟MySQL服務:

<1>啟動MySQL服務:

此電腦->右鍵->管理->服務和應用程式->服務->MySQL 右擊 啟動

<2>第二種方式啟動MySQL服務:

DOS命令窗口方式啟動:net start mysql

<3>DOS命令窗口方式停止:net stop mysql 切記不要加分號

登錄MySQL資料庫:mysql -uroot -p 回車 輸入密碼

登錄MySQL資料庫:mysql -uroot -p密碼 回車

語法:mysql -h 伺服器主機地址 -u 用戶名 -p 密碼

6、root是MySQL中的超級管理員,有所有的權限,而且是MySQL安裝時默認就有的用戶。

7、查看資料庫的版本:select version(),user();

8、資料庫:系統資料庫和用戶資料庫。

系統資料庫:就是我們在安裝MySQL伺服器的時候,默認就有的資料庫,存儲一些用戶名、密碼等,不能刪除,不能隨意更改。

information_schema mysql performance_schema test 這4個是系統資料庫,不能刪除。

用戶資料庫:就是我們自己新建的資料庫,可以隨便刪除。

9、創建資料庫

create database 資料庫名字; (create是創建 database是資料庫,分號是結束符,不可缺,不是SQL語句的組成部分)

10、查看資料庫

show databases;

11、選擇資料庫

use 資料庫名; (使用資料庫前,必須先選擇資料庫)

12、刪除資料庫

drop database 資料庫名;

drop database if exists 資料庫名; 刪除資料庫,如果資料庫不存在不會報錯。

if exists可以省略

13、SQLyog注釋: # 或者 -- 空格

14、查看資料庫的信息 show create database 資料庫名

15、查看當前使用的資料庫 select database();

16、結構化查詢語言:

DML 數據操作語言 insert(增) update(改) delete(刪)這些都是對於表中數據的操作

DDL 數據定義語言 create(創建資料庫或者表) drop(刪除資料庫或者表) alter(改資料庫名字或者表的欄位等)

DQL 數據查詢語言 select(查)

DCL 數據控制語言 grant(賦予權限) commit(提交) rollback(回滾)

17、MySQL和SQL server和Oracle都是關係型資料庫 就是二維表形式的表,二維表就是只有行和列。

18、數據類型

定長字符串 char(255) 最多可以存255個字符

變長字符串 varchar(65535) 最多可以存65535個字符

varchar 省空間

char 效率高 一般確定長度的可以用char 如:性別char(1)

text 字符型大數據

blob 字節型大數據

tinyint 非常小的數據 有符值和無符號值 1位元組

smallint 較小的數據 有符值和無符號值 2位元組

mediumint 中等大小的數據 有符值和無符號值 3位元組

int 標準整數 有符值和無符號值 4位元組

bigint 較大的整數 有符值和無符號值 8位元組

float 單精度浮點數 4位元組

double 雙精度浮點數 8位元組

decimal 字符串形式的浮點數 decimal(M,D) M+2位元組

tinytext 微型文本串

date 格式 YYYY-MM-DD 取值範圍 1000-01-01~9999-12-31,其中Y表示年,M表示月,D表示日

datetime YY-MM-DD hh:mm:ss 取值範圍 1000-01-01 00:00:00~9999-12-31 23:59:59 其中 h表示小時,m表示分鐘,s表示秒

time hh:mm:ss

timestamp YYYYMMDDHHMMSS

year YYYY 取值範圍 1901~2155

若某日期欄位默認值為當前日期,一般設置為timestamp類型

19、創建表的語法:

create table 表名(

欄位 類型 [約束],

欄位 類型 [約束],

欄位 類型 [約束]

)

約束:非空、唯一、自增、主鍵、外鍵等,約束可以不寫。[]括起來的意思是可以寫也可以不寫。

例子:

create table teacher(

id int primary key auto_increment,

name varchar(20) not null,

sex char(2) default '男' not null comment '性別',

phone char(11) comment '電話',

email varchar(200) unique

)

primary key 設置主鍵

auto_increment 設置自增

not null 不能為空

unique 唯一 就是不能重複

comment '電話' 說明

default '男' not null comment '性別' 默認性別是男,不能為空 說明是性別

20、刪除表 drop table if exists 表名;

其中 if exists 可以省略

21、查看當前資料庫下的表 show tables;

22、查看表的結構 desc 表名; 或者 describe 表名;

23、修改表(也就是添加新列)

alter table 表名

添加新列 add 列名 數據類型

同時添加多個新列 add(列 數據類型,列 數據類型)

例如:alter table student add address varchar(200);

例如:alter table student add(shengao double,tizhong double);

24、修改列的數據類型--不是修改列名

alter table 表名 modify 列名 新的數據類型

例如:alter table student modify tizhong int;

25、刪除列

alter table 表名 drop 列名;

例如:alter table student drop tizhong;

26、修改列名,也可以修改數據類型

alter table 表名 change 原列名 新列名 數據類型(長度)[屬性];

其中,[] 代表可以寫或者不寫

例如:alter table student change shengao tizhong int;

27、修改表名的2種方式:

第一種方式:rename table 原表名 to 新表名;

第二種方式:alter table 原表名 rename [to] 新表名;

其中,[] 代表可以寫或者不寫。

28、SQL語句不區分大小寫

29、DML 數據操作語言 insert(增) update(改) delete(刪)這些都是對於表中數據的操作

insert(增)

語法:insert into 表名(列名1,列名2,......,列名n) values (值1,值2,......,值n);

值的個數和類型要和前面的列對應。

例如:INSERT INTO `student` (`name`,`sex`,`phone`,`address`,`tizhong`) VALUES ('張三','男','12345678912','中國',60)

其中,char類型、varchar類型、date、datetime、time、year等的值要加單引號,int、double、float不用加單引號

`` 是反單引號,不是單引號,在tab鍵的上面的那個鍵。是為了防止關鍵字的,如果確定不是關鍵字,也可以不加。

我們也可以不指定列

語法:insert into 表名 values (值1,值2,......,值n);

不指定列名時,相當於指定了所有列,順序要和建表時的順序一致。

INSERT INTO student VALUES(DEFAULT,'李四','女','1234678','衡水',70)

INSERT INTO student VALUES(NULL,'李四','女','1234678','衡水',70)

-- Column count doesn't match value count at row 1 列的個數不匹配

id是自增的,但是我們也必須寫上他的值,在不指定列名的時候。

DEFAULT 默認的

NULL 空 表示沒有 表示不存在 不是空字符串'' , 也不是0

Mysql資料庫自持自動增長的列 自增的列,必須是整數類型

30、建表

CREATE TABLE teacher(

id INT PRIMARY KEY AUTO_INCREMENT,

NAME VARCHAR(20) NOT NULL,

email VARCHAR(200) UNIQUE,

address VARCHAR(200)

)

CREATE TABLE `student`(

`studentno` INT(4) NOT NULL COMMENT '學號',

`loginPwd` VARCHAR(20) NOT NULL COMMENT '密碼',

`studentName` VARCHAR(50) NOT NULL COMMENT '學生姓名',

`sex` CHAR(2) DEFAULT '男' NOT NULL COMMENT '性別',

`gradeId` INT(4) UNSIGNED COMMENT '年級編號',

`phone` VARCHAR(50) COMMENT '聯繫電話',

`address` VARCHAR(255) COMMENT '地址',

`bornDate` DATETIME COMMENT '出生時間',

`email` VARCHAR(50) COMMENT '郵箱',

identityCard VARCHAR(18) COMMENT '身份證號',

PRIMARY KEY(`studentNo`)

)COMMENT='學生表'

-- UNSIGNED 無符號數

如果在創建表的時候,沒有創建主鍵,那麼主鍵如何設置呢?

語法:alter table 表名 add constraint 主鍵名 primary key 表名(主鍵欄位)

例如:ALTER TABLE teacher ADD CONSTRAINT pd_id PRIMARY KEY teacher(id);

31、更改表 update(改)

語法:update 表名 set 列名=值,列名=值,.....列名=值;

會把整張表中的某列的數據全部更改,就是更改了所有行。

更改時我們一般都要加條件

語法:update 表名 set 列名=值,列名=值,.....列名=值 where 條件;

update語法可以用新值更新原有表行中的各列。

set子句指示要修改哪些列和要給予哪些值。

where子句指定應更新哪些行。如沒有where子句,則會更新所有行。

關於where條件:作用是用來決定更新哪個或哪些行的。

當有多個條件的時候,

and 並且 要求是多個條件同時成立

or 或者 多個條件中只要一個成立就可以

例子:

-- 把年齡是80歲並且名字是李四的電話更改為12345678912

UPDATE student SET phone='12345678912' WHERE `name`='李四' AND age=80

-- 把年齡是80歲或者名字是李四的電話更改為123

UPDATE student SET phone='123' WHERE `name`='李四' OR age=80

32、刪除 刪除表中的數據,不是刪除表

語法:delete from 表名

因為沒有where條件,會刪除表中的所有行,不會釋放表的內存。

什麼是不會釋放表的內存?

就是說 我們在往表中添加數據的時候,主鍵不會從1重新開始,而是從上一次開始

我們一般都要加where條件

語法:delete from 表名 where 條件

例子:DELETE FROM student WHERE id=24

會釋放表的內存:

語法:truncate table 表名

截斷表 會刪除表中的所有數據,相當於把表刪除後重新創建,id會從1開始

總結:delete刪除表中的數據 如果id是自增的,再insert數據時,會在原來的基礎上繼續增加

而使用truncate也會刪除表中的所有的數據,在insert數據時,會從1開始(讓表恢復成初始狀態)

33、查詢

語法:select 列1,列2,....,列n from 表名 [where 條件]

SELECT `name` FROM student

SELECT `name`,`age` FROM student

SELECT `name`,`age`,`phone` FROM student

-- 如果我想查看所有的列 就把所有的列全部寫上,但是會很麻煩

SELECT * FROM student

* 表示所有的列

寫 * 雖然方便但是效率低,寫全部的列雖然麻煩,但是效率高,

一般我們都要寫全部列,平時做練習可以寫* ,但是真正做項目我們寫全部列

34、去重複

SELECT DISTINCT `name` FROM student

35、起別名

SELECT studentNo 學生編號,subjectNo 學科,examDate 考試日期

,studentResult 成績 FROM result

SELECT studentNo AS 學生編號,subjectNo AS 學科,examDate AS 考試日期

,studentResult AS 成績 FROM result

其中AS 可以省略不寫

36、練習:

1>創建表

create table exam(

id int primary key auto_increment,

name varchar(200),

math int,

chinese int,

english int

)

2>增加數據

insert into exam values (null,'王明傑',59,71,62);

insert into exam values (null,'牛海勝',65,73,75);

insert into exam values (null,'宋永',85,83,84);

insert into exam values (null,'徐君',78,73,86);

insert into exam values (null,'王坤',86,68,91);

3>問題:

1.查詢表中所有學生的信息

SELECT * FROM exam

2.查詢表中所有學生的姓名和對應的英語成績

SELECT `name`,`english` FROM exam

3.查詢在所有學生每科分數上加10分特長分後的結果。

SELECT math+10,chinese+10,english+10 FROM exam

4.統計每個學生的總分

SELECT math+chinese+english FROM exam

5.使用別名表示學生總分

SELECT math+chinese+english 總分 FROM exam

37、關於where 條件:

比較符號 = > < >= <= <>(不等於) !=(不等於)

-- 查詢數學是59分的學生信息

SELECT * FROM exam WHERE math=59

-- 查詢數學大於60分

SELECT * FROM exam WHERE math>60

-- 查詢數學大於等於60分

SELECT * FROM exam WHERE math>=60

-- 查詢數學小於60分

SELECT * FROM exam WHERE math<60

-- 查詢數學小於等於60分

SELECT * FROM exam WHERE math<=60

-- 查詢數學不等於59分和65的

SELECT * FROM exam WHERE math<>59 AND math<>65

-- 查詢數學不等於59分和65的

SELECT * FROM exam WHERE math!=59 AND math!=65

-- 查詢數學大於60分小於70分的學生信息

SELECT * FROM exam WHERE math>60 AND math<70

-- 查詢姓名為王明傑的學生成績

SELECT * FROM exam WHERE `name`='王明傑'

-- 查詢總分大於200分的所有同學

SELECT * FROM exam WHERE math+chinese+english>200

38、between..... and.....在...和...之間

例如:

-- 查詢數學大於60分小於70分的學生信息

-- 左邊是包含,右邊也是包含 相當於 >= <=

SELECT * FROM exam WHERE math>=59 AND math<=78

等價於

SELECT * FROM exam WHERE math BETWEEN 59 AND 78

39、in

-- 查詢數學分數是59、65、86的學生信息

SELECT * FROM exam WHERE math=59 OR math=65 OR math=86

等價於

SELECT * FROM exam WHERE math IN(59,65,86)

40、like 模糊查詢

-- 查詢姓王的學生成績

-- % 表示任意多個字符 _表示一個字符

SELECT * FROM exam WHERE `name` LIKE '王%'

-- 查詢名字中包含 勝 字的學生的信息

SELECT * FROM exam WHERE `name` LIKE '%勝%'

-- 查詢第三個字是 勝 字的學生的信息

SELECT * FROM exam WHERE `name` LIKE '__勝%'

-- 查詢名字中包含%的學生的信息

-- \是轉意字符 \%表示真正的% %表示任意多個字符

SELECT * FROM exam WHERE `name` LIKE '%\%%'

其實 sql語句中除了\ 其他字符也可以做為轉意字符

select * from employee where name like '%#%%' escape '#';

#%----- 表示真正的%

41、補充:insert語句

插入結果集

我們之前在SqlServer資料庫中SQL語句可以這麼寫

insert into 新表(欄位1,欄位2...) select 欄位1,欄位2... from 原表;

要求是新表必須事先創建好。那麼在MySQL中同樣適用。

第二種在SqlServer中插入結果集的方式:

select 欄位1,欄位2...into 新表 from 原表

這種方式要求是新表不存在,如果存在,則會報錯。

但是在MySQL中這種語句是不支持的,但是有一個和他類似的語句可以在MySQL中執行:

CREATE TABLE 新表(SELECT 欄位1,欄位2……FROM 原表);

這種方式的新表也是事先不存在。如果存在,將會報錯。

例子:

-- insert into 新表(欄位1,欄位2...) select 欄位1,欄位2... from 原表;

-- 要求是新表必須事先創建好

-- 相當於把原表中的數據複製到了新表中

INSERT INTO exam1(id,`name`,math,chinese,english) SELECT id,`name`,math,chinese,english FROM exam

例子:

-- CREATE TABLE 新表(SELECT 欄位1,欄位2……FROM 原表);

-- 也是把原表中的數據複製到新表中,要求是新表不能存在

CREATE TABLE abc (SELECT id,`name` FROM exam)

42、ALTER TABLE 表名 ADD CONSTRAINT 外鍵名 FOREIGN KEY(外鍵欄位)REFERENCES 關聯表名(關聯欄位);

例子:ALTER TABLE emp ADD CONSTRAINT dept_emp_pk FOREIGN KEY(dept_id) REFERENCES dept(id)

43、INSERT INTO 表名 [(欄位名列表)] VALUES (值列表);

其中,values可以寫成value ,也可以添加數據,但是,原因是MySQL資料庫不嚴謹,正確的寫法是values

以後,我們學習Oracle資料庫,Oracle資料庫必須加s,Oracle資料庫嚴謹

44、插入多條數據

INSERT INTO 新表(欄位名列表)VALUES(值列表1),(值列表2),……,(值列表n);

例子:INSERT INTO dept VALUE(NULL,'技術部'),(NULL,'諮詢部'),(NULL,'財務部');

45、limit語法:

SELECT <欄位名列表>

FROM <表名或視圖>

[WHERE <查詢條件>]

[GROUP BY <分組的欄位名>]

[ORDER BY <排序的列名> [ASC 或 DESC]]

[LIMIT [位置偏移量, ]行數];

面試的時候經常被提問,通常用於網頁中的分頁

例子:

-- 查詢第1行到第10行 limit 位置,行數,位置從0開始,0表示第一行

-- 每頁顯示5條數據

SELECT * FROM emp LIMIT 0,5 -- 第一頁

SELECT * FROM emp LIMIT 5,5 -- 第2頁

SELECT * FROM emp LIMIT 10,5 -- 第3頁

-- 規律 第N頁,SELECT * FROM emp LIMIT (n-1)*行數,5

46、聚合函數

avg() 平均數 SELECT AVG(列名) FROM 表名

例子:SELECT AVG(score) FROM emp

count() 行數

例子:

SELECT COUNT(*) FROM emp

SELECT COUNT(id) FROM emp

max() 最大值 SELECT MAX(列名) FROM 表名

例子:SELECT MAX(score) FROM emp

min() 最小值 SELECT MIN(列名) FROM 表名

例子:SELECT MIN(score) FROM emp

sum() 求和 SELECT SUM(列名) FROM 表名

例子:SELECT SUM(score) FROM emp

47、字符串函數

CONCAT(str1,str1...strn) 字符串連接

例子:

-- DUAL 虛表 啞表

SELECT CONCAT('我','你') FROM DUAL

SELECT CONCAT(id,`name`) FROM emp

SELECT * FROM emp WHERE NAME LIKE '%三%'

SELECT * FROM emp WHERE NAME LIKE CONCAT('%','三','%')

-- 查詢名字是NULL的

SELECT * FROM emp WHERE NAME IS NULL

-- 查詢名字不是NULL的

SELECT * FROM emp WHERE NAME IS NOT NULL

INSERT(str,pos,len,newstr) 字符串替換 pos從1開始

例子:

SELECT INSERT('這是SQL Server資料庫',3,10,'MySQL');

SELECT INSERT(`name`,1,2,'名字') FROM emp;

LOWER(str) 轉小寫

例子:

SELECT LOWER('MySQL');

UPPER(str) 大寫

例子:SELECT UPPER('AAAbbb');

SUBSTRING(str,num,len) 截取字符串 num從1開始

例子:SELECT SUBSTRING('JavaMySQLOracle',5,5);

48、時間日期函數

CURDATE() 獲取當前日期 SELECT CURDATE();

CURTIME() 獲取當前時間 SELECT CURTIME();

NOW() 獲取當前日期和時間 SELECT NOW();

WEEK(date) 返回日期date為一年中的第幾周 SELECT WEEK(NOW());

YEAR(date) 返回日期date的年份 SELECT YEAR(NOW());

HOUR(time) 返回時間time的小時值 SELECT HOUR(NOW());

MINUTE(time) 返回時間time的分鐘值 SELECT MINUTE(NOW());

DATEDIFF(date1,date2) 返回日期參數date1和date2之間相隔的天數 SELECT DATEDIFF(NOW(),'2008-8-8'); 前面的減去後面的

ADDDATE(date,n) 計算日期參數date加上n天后的日期 SELECT ADDDATE(NOW(),5);

49、數學函數

CEIL(x) 返回大於或等於數值x的最小整數 SELECT CEIL(2.3) 不是四捨五入

FLOOR(x)返回小於或等於數值x的最大整數 SELECT FLOOR(2.3) 不是四捨五入

RAND() 返回0~1間的隨機數 SELECT RAND()

50、什麼是子查詢

-- 第一步 求出李斯文的出生日期

SELECT bornDate FROM student WHERE studentName='李斯文';

-- 第二步 求比這個日期要大的學生

SELECT * FROM student WHERE bornDate>'1993-07-23'

-- 但是,這是我們用了2個SQL語句做出來的,

-- 合併成一條SQL語句

SELECT * FROM student WHERE bornDate>(SELECT bornDate FROM student WHERE studentName='李斯文')

舉例:

-- 第一種方法: 查詢張三是哪個部門的?

SELECT d.`name` FROM dept d,emp e WHERE

e.`name`='張三' AND e.`dept_id`=d.`id`

-- 第二種方法:查詢張三是哪個部門的?

SELECT d.`name` FROM dept d INNER JOIN emp e ON

d.`id`=e.`dept_id` WHERE e.`name`='張三'

51、創建表並添加數據:

CREATE TABLE dept(

deptno INT(11) PRIMARY KEY,

dname VARCHAR(20),

loc VARCHAR(20)

);

CREATE TABLE emp(

empno INT(11) PRIMARY KEY,

ename VARCHAR(20) NOT NULL,

job VARCHAR(20) CHECK (job in('CLERK','SALESMAN','MANAGER','SALESMAN','ANALYST')),

mgp INT(11) ,

hiredate DATETIME ,

sal DECIMAL(10,2),

comm DECIMAL(10,2),

deptno INT

);

alter table emp add FOREIGN key(deptno) REFERENCES dept(deptno);

INSERT INTO dept VALUES (10,'ACCOUNTING','NEWTORK');

INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');

INSERT INTO dept VALUES (30,'SALES','CHICAGO');

INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');

insert into emp values(7369,'SMITH','CLERK',7902,'1980-12-17',1640,NULL,20);

insert into emp values(7499,'ALLEN','SALESMAN',7698,'1981-2-20',11400,300,30);

insert into emp values(7521,'WARD','SALESMAN',7698,'1981-2-22',5200,500,30);

insert into emp values(7566,'JOENS','MANAGER',7839,'1981-4-2',7015,NULL,20);

insert into emp values(7654,'MARTIN','SALESMAN',7698,'1981-9-28',5200,1400,30);

insert into emp values(7698,'BLAKE','MANAGER',7839,'1981-5-1',5900,NULL,30);

insert into emp values(7782,'CLARK','MANAGER',7839,'1981-6-9',2470,NULL,10);

insert into emp values(7788,'SCOTT','ANALYST',7566,'1987-4-19',3040,NULL,20);

insert into emp values(7844,'TURNER','SALESMAN',7698,'1980-12-17',6200,0,30);

insert into emp values(7876,'ADAMS','CLERK',7788,'1981-9-8',2240,NULL,20);

insert into emp values(7900,'JAMES','CLERK',7698,'1987-5-23',4000,NULL,30);

insert into emp values(7902,'FORD','ANALYST',7566,'1981-12-3',3040,NULL,20);

insert into emp values(7934,'MILLER','CLERK',7782,'1982-12-3',2620,NULL,10);

insert into emp values(7935,'MILLER','CLERK',8000,'1985-11-3',2820,800,10);

(1)查詢20部門的所有員工信息;

SELECT * FROM emp WHERE deptno=20;

(2)查詢所有工種為CLERK的員工的員工號、員工名和部門號;

SELECT empno, ename, deptno FROM emp WHERE job='CLERK';

(3)查詢獎金(COMM) 高於工資(SAL)的員工信息;

SELECT * FROM emp WHERE comm>sal

(4)查詢獎金高於工資的20%的員工信息;

SELECT * FROM emp WHERE comm>sal*0.2

(5)查詢10號部門]中工種為MANAGER和20部門中工種為CLERK的員工的信息;

SELECT * FROM emp WHERE deptno=10 AND job='MANAGER' OR deptno=20 AND job='CLERK'

(6)查詢所有工種不是MANAGER和CLERK,且工資大於或等於2000的員工的詳細信息;

SELECT * FROM emp WHERE sal>=2000 AND job!='MANAGER' AND

job!='CLERK'

或者

SELECT * FROM emp WHERE sal>=2000 AND job<>'MANAGER' AND

job<>'CLERK'

(7)查詢有獎金的員工的不同工種;

SELECT DISTINCT job FROM emp WHERE comm

IS NOT NULL AND comm!=0

或者

SELECT DISTINCT myjob FROM

(SELECT job myjob FROM emp WHERE comm>0) AS test;

或者

SELECT DISTINCT job FROM emp WHERE comm>0

(8)查詢所有員工工資與獎金的和;

SELECT SUM(comm)+SUM(sal) FROM emp;

(9)查詢沒有獎金或獎金低於100的員工信息;

SELECT * FROM emp WHERE comm IS NULL OR comm<=100

(10)查詢各月倒數第3天(倒數第2天)入職的員工信息;

SELECT * FROM emp WHERE DAY(LAST_DAY(hiredate))-DAYOFMONTH(hiredate)=1 OR DAY(LAST_DAY(hiredate)) -DAYOFMONTH(hiredate)=2;

其中:

SELECT DAY(LAST_DAY('2020-2-9')) 查詢當月有多少天

SELECT DAYOFMONTH('2020-4-9') 查詢一個月當中的第幾天

(11)查詢工齡大於或等於25年的員工信息;

SELECT * FROM emp WHERE

SUBSTRING(NOW(),1,4)-SUBSTRING(hiredate,1,4)>=25

或者

SELECT * FROM emp WHERE DATE_FORMAT(NOW(),'%Y')

- YEAR(hiredate)>=25;

或者

SELECT * FROM emp WHERE YEAR(NOW())

- YEAR(hiredate)>=25;

(12)查詢員工信息,要求以首字母大寫的方式顯示所有員工的姓名;

SELECT e.`empno`,CONCAT(UPPER(SUBSTRING(e.`ename`,1,1)),LOWER(SUBSTRING(e.`ename`,2,LENGTH(e.`ename`)-1))) `name`,e.`job`,e.`mgp`,e.`hiredate`,e.`sal`,e.`comm`,e.`deptno` FROM emp e

或者

SELECT CONCAT (UPPER(LEFT(ename, 1)),LOWER(SUBSTRING(ename,2,(LENGTH(ename)-1)))) AS newname FROM emp;

SELECT LEFT('abcd',3) -- 從左邊截取3個字符

SELECT RIGHT('abcd',2) -- 從右邊截取2個字符

LENGTH('nnnn') -- 求長度

(13)查詢員工名正好為6個字符的員工的信息;

SELECT * FROM emp WHERE LENGTH(ename)=6

(14) 查詢員工名字中不包含字母「S」的員工;

SELECT * FROM emp WHERE ename NOT LIKE '%S%'

(15) 查詢員工姓名的第二字母為「M」的員工信息;

SELECT * FROM emp WHERE ename LIKE '_M%'

(16) 查詢所有員工姓名的前三個字符;

SELECT SUBSTRING(ename,1,3) FROM emp

或者

SELECT LEFT(ename,3) FROM emp

(18) 查詢員工的姓名和入職日期,並按入職日期從先到後進行排序;

SELECT ename,hiredate FROM emp ORDER BY hiredate DESC

(19) 顯示所有員工的姓名、工種、工資和獎金,按工種降序排序,若工種相同則按工資升序排序;

SELECT ename,job,sal,comm FROM emp ORDER BY job DESC,sal

(20) 顯示所有員工的姓名、入職的年份和月份,按入職日期所在的月份排序,若月份相同則按入職的年份排序;

SELECT ename,CONCAT(YEAR(hiredate),'-',MONTH(hiredate)) FROM emp ORDER BY MONTH(hiredate),YEAR(hiredate)

(21) 查詢在2月份入職的所有員工信息;

SELECT * FROM emp WHERE MONTH(hiredate)=2

(22) 查詢所有員工入職以來的工作期限,用「XX年XX月XX日」的形式表示;

SELECT DATE_FORMAT(NOW(), '%Y') - YEAR(hiredate) 年,

DATEDIFF(NOW(),hiredate)/30 月, DATEDIFF(NOW(),hiredate) 天 FROM emp;

或者

SELECT CONCAT(DATE_FORMAT(NOW(), '%Y') - YEAR(hiredate),'年',

FLOOR(DATEDIFF(NOW(),hiredate)/30),'月',DATEDIFF(NOW(),hiredate),'日') 工作期限

FROM emp;

(23.1) 查詢至少有一個員工的部門信息;

52、資料庫事務:

一組sql完成一個工作

例如 轉帳

update account set money= money-1000 where id =1;

update account set money= money+1000 where id= 2;

這兩個語句完成一個工作 ----- 這就是一個事務

資料庫事務的四個基本特徵:

A 原子性

這個事務不能再拆分 如果再拆開 就不能完成相應的工作

要保證一個事務中的多個sql語句 同時成功 或 同時失敗

C 一致性

通常指數據的一致性 事務執行前後 數據的總和不變

I 隔離性

多個事務之間不能互相影響

D 持久性

事務提交以後 數據要真正的持久化到資料庫

對於MySQL 默認情況下 每個DML語句獨自執行在一個事務中 默認自動提交事務

BEGIN;

/*--轉帳:張三的帳戶減少500元,李四的帳戶增加500元--*/

UPDATE `bank` SET `currentMoney`=`currentMoney`-500

WHERE `customerName`='張三';

UPDATE `bank` SET `currentMoney`=`currentMoney`+500

WHERE `customerName`='李四';

COMMIT;

BEGIN;

UPDATE `bank` SET `currentMoney`=`currentMoney`-1000 WHERE `customerName`='張三';

ROLLBACK;

默認情況下,每條單獨的SQL語句視為一個事務

關閉默認提交狀態後,可手動開啟、關閉事務

SET autocommit = 0|1;

值為0:關閉自動提交

值為1:開啟自動提交

SET autocommit=0;

/*--轉帳:張三的帳戶減少500元,李四的帳戶增加500元--*/

UPDATE `bank` SET `currentMoney`=`currentMoney`-500

WHERE `customerName`='張三';

UPDATE `bank` SET `currentMoney`=`currentMoney`+500

WHERE `customerName`='李四';

COMMIT;

UPDATE `bank` SET `currentMoney`=`currentMoney`-1000 WHERE `customerName`='張三';

ROLLBACK;

SET autocommit = 1;

53、視圖 (view):

什麼是視圖? 由一個表 或多個表的部分數據組成的一個新的資料庫對象

視圖是一張虛擬表

表示一張表的部分數據或多張表的綜合數據

其結構和數據是建立在對表的查詢基礎上

為什麼有視圖:

1 最主要就是限制數據訪問

2 使得複雜的查詢變的簡單

視圖是一張虛擬表

表示一張表的部分數據或多張表的綜合數據

其結構和數據是建立在對表的查詢基礎上

視圖中不存放數據

數據存放在視圖所引用的原始表中

一個原始表,根據不同用戶的不同需求,可以創建不同的視圖

視圖的用途

篩選表中的行

防止未經許可的用戶訪問敏感數據

降低資料庫的複雜程度

將多個物理資料庫抽象為一個邏輯資料庫

使用SQL語句創建視圖:

CREATE VIEW view_name

AS

<SELECT 語句>;

使用SQL語句刪除視圖

DROP VIEW [IF EXISTS] view_name;

使用SQL語句查看視圖

SELECT 欄位1, 欄位2, …… FROM view_name;

查看所有視圖

USE information_schema;

SELECT * FROM views\G;

視圖注意事項:

視圖中可以使用多個表

一個視圖可以嵌套另一個視圖

對視圖數據進行添加、更新和刪除操作直接影響所引用表中的數據

當視圖數據來自多個表時,不允許添加和刪除數據

相關焦點

  • MySQL-mysqldump備份資料庫
    mysqldump備份1、備份命令格式:mysqldump -h主機名 -P埠 -u用戶名 -p密碼 --database 資料庫名 > 文件名.sql 例如: mysqldump -h 192.168.1.100 -p 3306 -uroot -ppassword --database
  • Loadrunner測試mysql資料庫
    loadrunner可以利用mysql lib庫,通過引用外部DLL,模擬mysql客戶端連接資料庫進行增刪改查的操作進行測試。下面主要介紹如何利用mysql lib庫連接mysql資料庫進行性能測試。一、準備工作1.
  • 資料庫基礎:mysql主從集群搭建
    還好mysql資料庫提供了一種主從備份的機制,其實就是把主資料庫的所有的數據同時寫到備份的資料庫中。實現mysql資料庫的熱備份。 要想實現雙機的熱備,首先要了解主從資料庫伺服器的版本的需求。要實現熱備mysql的版本都高於3.2。還有一個基本的原則就是作為從資料庫的數據版本可以高於主伺服器資料庫的版本,但是不可以低於主伺服器的資料庫版本。
  • 完美,阿里DBA骨幹團隊編寫的792頁MySQL調優筆記真香
    資料庫的性能優化首先是計算機系統的優化。資料庫程序是運行在計算機系統上的應用程式,需要先優化的就是計算機系統。也就是說,讓硬體儘量均衡,作業系統充分發揮硬體的全部性能,而資料庫充分利用作業系統和文件系統提供的便利發揮全部性能,而且避免資源的相互競爭。
  • Mysql資料庫部分
    在筆試題最後一般都是有一道關於mysql語句的問題,讓手寫出增、刪、改、查語句,今天我們就學習一下mysql語句。通過存儲過程可以使沒有權限的用戶在控制之下間接地存取資料庫,從而保證數據的安全。通過存儲過程可以使相關的動作在一起發生,從而可以維護資料庫的完整性。6. 增強安全性。a) 通過向用戶授予對存儲過程(而不是基於表)的訪問權限,它們可以提供對特定數據的訪問。
  • laravel高性能地從mysql資料庫中隨機獲取n條數據
    laravel如何高性能地從mysql資料庫中隨機獲取n條數據,有時候我們常常會需要從資料庫隨機獲取數據,比如:給工作人員隨機分配10個訂單,隨機從資料庫中隨機抽查100個用戶;這樣我們就需要隨機從資料庫獲取數據。
  • 神仙筆記!9位阿里大牛發布這份800多頁MySQL性能優化法則筆記
    第12章mysq|系統庫之權限系統表:從本章開始的第12~17章,將為大家詳細介紹mysql系統庫。本章先介紹mysql 系統庫中的權限系統表。第13章mysq|系統庫之 訪問權限控制系統:本章將在第12章內容的基礎上詳細介紹MySQL的訪問權限控制系統。
  • MySQL 實戰筆記 第04期:alter table 語句進度評估
    無為,多年 MySQL DBA 工作經驗,現就職於某知名網際網路公司,對 MySQL、 Redis、PostgrepSQL 等主流資料庫有一定了解
  • 搞定MySQL安裝難安裝貴問題
    >命令成功生成data目錄,同時生成無密碼的root用戶啟動MySQLbin下執行mysqld--console設置root密碼執行mysql-uroot-p連入資料庫,密碼不用輸入,直接按回車進入mysql>
  • mysql實現php函數explode功能mysql_explode
    table temp_keys(id int(10) primary key auto_increment,keystr varchar(255));新建一個自定義函數mysql_explode,將"獨孤九劍,萬劍歸宗,乾坤大挪移"這樣的字符串以逗號為分隔符以多條記錄的形式存入資料庫等同於一下子完成了如下操作:insert into temp_keys values(null,'獨孤九劍');insert into temp_keys values
  • Prometheus 監控MySQL資料庫
    Prometheus 監控mysql容器Prometheus這裡我們演示中,prometheus以及mysqld_exporter都使用容器進行運行。mysqld_exporter支持的版本為MySQL> = 5.6MariaDB> = 10.1為了方便管理,這裡mysqld_exporter就是用docker進行運行,如果是使用二進位安裝參數基本上相同這裡先到mysql
  • Centos7.9安裝Mariadb資料庫
    MariaDB 資料庫管理系統是 MySQL 的一個分支,主要由開源社區在維護,採用 GPL 授權許可。開發這個分支的原因之一是:甲骨文公司收購了 MySQL 後,有將 MySQL 閉源的潛在風險,因此社區採用分支的方式來避開這個風險。MariaDB完全兼容mysql。
  • Mysql常用關鍵字指令和參數總結
    最近在學習極客時間上的mysql課程,對mysql資料庫有了更多了解,本篇文章是想總結一些mysql的基礎知識。目的是加深自己的記憶,也可以提升對mysql設計原理的了解。表結構文件ibd:mysql表數據文件髒頁:內存數據和磁碟不一致的數據頁刷髒頁:就是把內存中的數據刷到磁碟上MVCC:資料庫的多版本並發控制
  • MySQL一直自動重啟解決辦法
    近期,測試環境出現了一次MySQL資料庫不斷自動重啟的問題,導致的原因是強行kill -9 殺掉資料庫進程導致,報錯信息如下:2019-07-24T01:14:53.769512Z 0 [Note] Executing
  • MySQL的user表被刪除了怎麼辦 user表被清空解決辦法
    my.cnf文件中添加 skip-grant-tables 重啟資料庫登錄資料庫,添加root@'localhost'帳號(可以從相同版本資料庫中導出一個root帳號的sql語句恢復/usr/local/mysql5.7/bin/mysqldump -uroot -p'123456'  -t --socket=/data/mysql3307/tmp/mysql.sock
  • 主庫n -> 從庫s - MySQL5.7多主一從(多源複製)同步配置 - 計算機...
    多主一從,也稱為多源複製,數據流向:主庫1 -> 從庫s主庫2 -> 從庫s主庫n -> 從庫s應用場景數據匯總,可將多個主資料庫同步匯總到一個從資料庫中,方便數據統計分析。讀寫分離,從庫只用於查詢,提高資料庫整體性能。部署環境註:使用docker部署mysql實例,方便快速搭建演示環境。
  • SpringBoot + MyBatis + MySQL讀寫分離實踐!
    引言讀寫分離要做的事情就是對於一條SQL該選擇哪個資料庫去執行,至於誰來做選擇資料庫這件事兒,無非兩個,要麼中間件幫我們做,要麼程序自己做。因此,一般來講,讀寫分離有兩種實現方式。第一種是依靠中間件(比如:MyCat),也就是說應用程式連接到中間件,中間件幫我們做SQL分離;第二種是應用程式自己去做分離。
  • CentOS7.X 掛載磁碟 與Mysql 自動備份
    8、Mysql的自動備份 沒有安裝mysql的自己安裝一下就不貼教程了 8.1、在掛載磁碟新建文件夾/bin/bash DATE=`date +%Y%m%d%H%M` #every minute 時間 DATABASE=hosp_mobile #database name資料庫名稱 DB_USERNAME=root
  • 基於Canal和Kafka實現MySQL的Binlog近實時同步
    從 2010 年開始,業務逐步嘗試資料庫日誌解析獲取增量變更進行同步,由此衍生出了大量的資料庫增量訂閱和消費業務。安裝MySQL為了簡單起見,選用yum源安裝(官方連結是https://dev.mysql.com/downloads/repo/yum):mysql80-community-release-el7-3雖然包名帶了mysql80關鍵字,其實已經集成了MySQL主流版本5.6、5.7和8.x等等的最新安裝包倉庫選用的是最新版的MySQL8.x社區版
  • 高性能Mysql主從架構的複製原理及配置詳解
    如果因為mysql版本新舊密碼算法不同,可以設置:拷貝數據:(假如是你完全新安裝mysql主從伺服器,這個一步就不需要。(2)熱拷貝(warm copy)如果你僅使用MyISAM表,你可以使用mysqlhotcopy拷貝,即使伺服器正在運行。(3)使用mysqldump<1>鎖表:如果你還沒有鎖表,你應該對表加鎖,防止其它連接修改資料庫,否則,你得到的數據可以是不一致的。