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;
視圖注意事項:
視圖中可以使用多個表
一個視圖可以嵌套另一個視圖
對視圖數據進行添加、更新和刪除操作直接影響所引用表中的數據
當視圖數據來自多個表時,不允許添加和刪除數據