爲啥學習MySQL
呢?由於MySQL
是最流行的關係型數據庫管理系統之一,在web
應用方面,MySQL
是最好的軟件。MySQL
所使用的sql
語言是用於訪問數據庫的最經常使用標準化語言。mysql
放心,讀這期內容的朋友們都適合:網站開發,軟件開發或者愛好者。web
什麼是數據庫呢?sql
讓我來整理一張思惟導圖:
數據庫
細節掌握:編程
MySQL Workbench,SQLyog
;mysql官網:segmentfault
安裝包下載:(安裝操做)安全
點擊安裝:服務器
產品配置的操做:數據結構
打開服務框用win+r
,輸入services.msc
less
bin
目錄:用於存儲一些可執行文件include
目錄:用於存儲包含的一些頭文件lib
目錄:用於存儲一些庫文件share
目錄:用於存儲錯誤信息,字符集文件等data
目錄:用於放置一些日誌文件以及數據庫my.ini
文件:數據庫的配置文件啓動與中止:
mysql
參數:
參數 | 描述 |
---|---|
-u |
用戶名 |
-p |
密碼 |
-V |
輸出版本信息而且退出 |
-h |
主機地址 |
修改用戶密碼的命令:
mysqladmin 命令用於修改用戶密碼 mysqladmin 命令格式: mysqladmin -u用戶名 -p舊密碼 password新密碼
顯示數據庫的命令
show databases;
使用數據庫的命令
use 數據庫的名稱
顯示當前鏈接的信息
select database();
select version();
select now();
select user();
建立數據庫SQL
:
create database [if not exists] db_name [default] character set [=] charset_name
create database database_name;
修改數據庫的語法格式:
alter database db_name [default] character set [=] charset_name
刪除數據庫語法格式:
drop database [if exitsts] db_name;
瞭解數據類型:(藉助圖書管理系統)
圖書類別表:
類別編號(category_id) 類別名稱(category) 父類別(parent_id) 1 計算機 0 2 醫學 0
圖書信息表:
圖書編號(book_id) 類別編號(book_category_id) 書名(book_name) 做者(author) 價格(price) 出版社(press) 出版時間(pubdate) 庫存(store)
借閱信息表:
圖書編號(book_id) 身份證號(card_id) 借出日期(borrow_date) 歸還日期(return_date) 是否歸還(status)
讀者信息表
身份證號(card_id) 姓名(name) 性別(sex) 年齡(age) 聯繫電話(tel) 餘額(balance)
數據類型:
整型:TINYINT
-1字節 SMALLINT
-2字節 MEDIUMINT
-3字節 INT
-4字節 BIGINT
-8字節
浮點數類型和定點數類型:
float-4個字節 double-8個字節 decimal
日期時間類型:
字符型:
建立數據表:create table create table <表名> ( 列名1 數據類型[列級別約束條件][默認值], 列名2 數據類型[列級別約束條件][默認值], ... [表級別約束條件] );
show tables [from db_name];
show columns from tbl_name; describe <表名> /DESC<表名>
show create table tbl_name;
添加列:
alter table <表名> add <新列名> <數據類型> [ 約束條件 ] [first | after 已存在列名];
修改列名:
alter table <表名> change <舊列名> <新列名> <新數據類型>;
修改列的數據類型:
alter table <表名> MODIFY <列名> <數據類型>
修改列的排列位置
alter table<表名> MODIFY <列1> <數據類型> FIRST|AFTER<列2>
刪除列:
alter table <表名> drop <列名>;
修改表名:
alter table <舊錶名> RENAME [TO] <新表名>;
drop table [if exists] 表1,表2,...表n;
查看錶分區
建立表分區:使用partition by
類型(字段)
使用values less than
操做符定義分區
create table bookinfo( book_id int, book_name varchar(20) ) partition by range(book_id)( partition p1 values less than(20101010), partition p3 values less than MAXVALUE );
select price from bookinfo where book_id = 20101010; select * from readerinfo; update readerinfo set balance = balance-(select price from bookinfo where book_id = 20101010) * 0.05 where card_id = '2323232342sxxxxx';
什麼是子查詢呢?
它是指嵌套在其餘sql
語句內的查詢語句。
select * from table1 where col1 = (select col2 from table2);
insert into bookcategory(category,parent_id)values('x',2),('y',2); insert into bookinfo(book_id,book_category_id,book_name,author,price,press,pubdate,store) values (45245244, 6, 'x', '1,2,3 等', 115, '出版社', '2020-06-01',10), (45342545, 6, 'y', '1, 2',27.8, '出版社', '2020-07-01', 5); update readerinfo set balance = 500 where card_id = '683246'; insert into borrowinfo(book_id,card_id,borrow_date,return_date,status) values (35452455,'5724154','2020-10-10','2020-11-10','否');
查詢借閱信息表, 顯示借 xx這本書的借閱記錄
select * from borrowinfo where book_id = (select book_id from bookinfo where book_name = 'xx');
查詢圖書信息表, 顯示圖書價格小於圖書平均價格的全部圖書信息
select * from bookinfo where price < (select round(avg(price),2) from bookinfo);
查詢圖書信息表,顯示圖書類別不是’數據庫’的全部圖書信息
select * from bookinfo where book_category_id<>(select category_id from bookcategory where category = '數據庫');
查詢圖書信息表,顯示圖書類別爲’計算機’的全部圖書信息
select * from bookcategory; select * from bookinfo where book_category_id = ANY(select category_id from bookcategory where parent_id = 1); select * from bookinfo where price > ANY (select price from bookinfo where book_category_id =4); select * from bookinfo where price > ALL (select price from bookinfo where book_category_id =4);
查詢圖書信息表,顯示圖書類別爲’2’的全部圖書信息
in 後面的子查詢返回一個數據列,等於數據列裏的任意一個值都是知足條件的 select * from bookinfo where book_category_id in (select category_id from bookcategory where parent_id = 2); select * from bookinfo where book_category_id = any (select category_id from bookcategory where parent_id = 2);
查看圖書類別表中是否有’y’的類別,若是有,則查看圖書信息表
select * from bookinfo where exists (select category_id from bookcategory where category='y'); select * from bookinfo where exists (select category_id from bookcategory where category='x');
insert into select
語句從一個表複製數據,而後把數據插入到一個已存在的表中。
insert into table2 select * from table1;
須要建立一張罰款記錄信息表,包含以下信息:圖書編號、身份證號、應還日期、實際還書日期,罰款金額
記錄來源於借閱信息表超出還書時間還未還書的讀者
create table readerfee( book_id int, card_id char(18), return_date date, actual_return_date date, book_fee decimal(7,3), primary key(book_id,card_id) ); select book_id,card_id,return_date from borrowinfo where datediff(sysdate(),return_date)>0 and status = '否'; insert into readerfee(book_id,card_id,return_date) select book_id,card_id,return_date from borrowinfo where datediff(sysdate(),return_date)>0 and status = '否'; select * from readerfee;
身份證號爲5461xxxxxxx的讀者將超限的圖書20201101歸還,根據描述實現以下需求:
update borrowinfo set status = '是' where book_id = 20201101 and card_id = '5461xxxxxxx'; select * from borrowinfo; update readerfee set actual_return_date=sysdate(), book_fee=datediff(sysdate(),return_date)*0.2 where book_id = 20201101 and card_id = '5461xxxxxxx'; select * from readerfee;
它事一種限制,經過對錶的行或列的數據作出限制,來確保表的數據的完整性,惟一性。
表結構:
圖書(圖書編號book_id
,類別編號book_category_id
,書名book_name
,做者author
)
在mysql
中經常使用的幾種約束類型:
約束類型 | 非空約束 | 主鍵約束 | 惟一約束 | 默認約束 | 外鍵約束 |
---|---|---|---|---|---|
關鍵字 | not null |
primary key |
unique |
default |
foreign key |
圖書信息表:
(圖書編號book_id
,類別編號book_category_id
,書名book_name
,做者author
,價格price
,出版社press
,出版時間pubdate
,庫存store
)
圖書類別表:
(類別編號category_id
- 主鍵,類別名稱category
- 惟一,父類別parent_id
-非空)
讀者信息表:
(身份證號card_id
,姓名name
,性別sex
,年齡age
,聯繫電話tel
,餘額balance
)
借閱信息表:
(圖書編號book_id
,身份證號card_id
,借出日期borrow_date
,歸還日期return_date
,是否歸還status
)
null
字段值能夠爲空
not null
字段值禁止爲空
非空約束
非空約束指字段的值不能爲空。對於使用了非空約束的字段若是用戶在添加數據時,沒有指定值,數據庫系統會報錯。
列名 數據類型 not null
建立表時添加非空約束
create table bookinfo( book_id int, book_name varchar(20) not null );
刪除非空約束
alter table bookinfo modify book_name varchar(20);
經過修改表添加非空約束
alter table bookinfo modify book_name varchar(20) not null;
主鍵約束:要求主鍵列的數據惟一,而且不容許爲空,主鍵可以惟一地標識表中的一條記錄。
主鍵的類型:
主鍵分爲單字段主鍵和多字段聯合主鍵
單字段主鍵:是由一個字段組成
在定義列的同時指定主鍵 列名 數據類型 primary key; 在列定義的後邊指定主鍵 [constraint<約束名>] primary key(列名);
建立表時添加主鍵約束
create table bookinfo( book_id int primary key, book_name varchar(20) not null );
create table bookinfo( book_id int, book_name varchar(20) not null, constraint pk_id primary key(book_id) );
刪除主鍵約束
ALTER TABLE bookinfo DROP PRIMARY KEY;
經過修改表的方式添加主鍵約束
ALTER TABLE bookinfo ADD PRIMARY KEY(book_id);
多字段聯合主鍵,複合主鍵
主鍵有多個字段聯合組成。primary key(字段1,字段2,...字段n);
create table borrowinfo( book_id int, card_id char(18), primary key(book_id,card_id) );
經過修改表爲列添加主鍵
create table bookinfo( book_id int, book_name varchar(20) not null ); alter table bookinfo modify book_id int primary key; alter table bookinfo add primary key(book_id); alter table bookinfo add constraint pk_id primary key(book_id);
惟一約束要求該列惟一,容許爲空,惟一約束能夠確保一列或者幾列不出現重複值。
語法規則:
列名 數據類型 unique [constraint <約束名>] unique(<列名>)
建立表時添加惟一約束
CREATE TABLE bookinfo( book_id INT PRIMARY KEY, book_name VARCHAR(20) NOT NULL UNIQUE ); 或: create table bookinfo( book_id int primary key, book_name varchar(20) not null, constraint uk_bname unique(book_name) );
經過修改表的方式添加惟一約束
alter table bookinfo modify book_name varchar(20) unique; ALTER TABLE bookinfo ADD UNIQUE(book_name); alter table bookinfo add constraint uk_bname unique(book_name);
刪除惟一約束
ALTER TABLE book_info DROP KEY uk_bname; ALTER TABLE book_info DROP INDEX uk_bname;
惟一約束和主鍵約束的區別
unique
聲明,但只能有一個primary key
聲明primary key
的列不容許有空值unique
的列容許空值默認約束是指某列的默認值
列名 數據類型 default 默認值
建立表時添加默認約束
CREATE TABLE bookinfo( book_id INT PRIMARY KEY, press VARCHAR(20) DEFAULT '出版社' );
經過修改表的方式添加默認約束
ALTER TABLE bookinfo ALTER COLUMN press SET DEFAULT '出版社'; alter table bookinfo modify press varchar(10) default '出版社';
刪除默認約束
alter table bookinfo modify press varchar(20); ALTER TABLE bookinfo ALTER COLUMN press DROP DEFAULT;
外鍵是用來在兩個表的數據之間創建連接,能夠是一列或者多列,一個表能夠有一個或者多個外鍵。
外鍵對應的是參照完整性,一個表的外鍵能夠爲空值,若不爲空值,則每個外鍵必須等於另外一個表中主鍵的某個值。
做用:保持數據的一致性,完整性。
建立表時添加外鍵約束
圖書類別表(父表) CREATE TABLE bookcategory( category_id INT PRIMARY KEY, category VARCHAR(20), parent_id INT ); 圖書信息表(子表) CREATE TABLE bookinfo( book_id INT PRIMARY KEY, book_category_id INT, CONSTRAINT fk_cid FOREIGN KEY(book_category_id) REFERENCES bookcategory(category_id) );
經過修改表的方式添加外鍵約束
ALTER TABLE bookinfo ADD FOREIGN KEY(book_category_id) REFERENCES bookcategory(category_id);
刪除外鍵約束
ALTER TABLE bookinfo DROP FOREIGN KEY fk_cid;
外鍵約束的參照操做
cascade
,從父表刪除或更新且自動刪除或更新子表中匹配的行
create table bookinfo( book_id int primary key, book_category_id int, constraint fk_cid foreign key (book_category_id) references bookcategory(category_id) on delete cascade);
圖書類別表
create table bookcategory( category_id int primary key, category varchar(20) not null unique, parent_id int not null );
圖書信息表
create table bookinfo( book_id int primary key, book_category_id int, book_name varchar(20) not null unique, author varchar(20) not null, price float(5,2) not null, press varchar(20) default '機械工業出版社', pubdate date not null, store int not null, constraint fk_bcid foreign key(book_category_id) references bookcategory(category_id) );
讀者信息表
create table readerinfo( card_id char(18) primary key, name varchar(20) not null, sex enum('男','女','保密') default '保密', age tinyint, tel char(11) not null, balance decimal(7,3) default 200 );
借閱信息表
create table borrowinfo( book_id int, card_id char(18), borrow_date date not null, return_date date not null, status char(11) not null, primary key(book_id,card_id) );
語法格式:
insert into table_name(column_list) values(value_list);
爲表的全部列插入數據
insert into bookcategory (category_id,category,parent_id)values (1,'x',0); insert into bookcategory values(2,'y',0);
爲表的指定列插入數據
insert into readerinfo (card_id,name,tel)values('4562135465','張飛','4651354651');
同時插入多條記錄
insert into bookcategory(category_id,category,parent_id)values(3,'x',1),(4,'y',1),(5,'z',2);
將查詢結果插入的表中
insert into bookcategory select * from test where id>5;
設置表的屬性值自動增長:
列名 數據類型 auto_increment
建立表時添加自增列
create table bookcategory_tmp( category_id int primary key auto_increment, category varchar(20) not null unique, parent_id int not null )auto_increment=5;
測試自增列
insert into bookcategory_tmp(category,parent_id)values('dadaqianduan',0);
去掉自增列
alter table bookcategory_tmp modify category_id int;
添加自增列
alter table bookcategory_tmp modify category_id int auto_increment;
修改自增列的起始值
alter table bookcategory_tmp auto_increment = 15; insert into bookcategory_tmp(category,parent_id)values('文學',0);
刪除圖書信息表的外鍵
alter table bookinfo drop foreign key fk_bcid;
爲圖書類別表添加自動編號的功能
alter table bookcategory modify category_id int auto_increment;
恢復關聯
alter table bookinfo add constraint fk_bcid foreign key(book_category_id)references bookcategory(category_id);
向借閱信息表插入一條借閱信息
insert into borrowinfo(book_id,card_id,borrow_date,return_date,status)values(20202010,46516874,'2020-11-29','2020-12-29','否');
更新讀者信息表中的餘額
查看書的價格 79.80 select price from bookinfo where book_id = 20202010;
更新餘額
update readerinfo set balance = balance - 79.80*0.05 where card_id = '46516874'; select * from readerinfo;
更新圖書信息表的庫存
update bookinfo set store = store -1 where book_id = 20150201; select * from bookinfo;
刪除指定條件的記錄
delete from readerinfo where card_id = '46461265464565';
刪除表中全部記錄
delete from readerinfo; truncate table readerinfo;快
想要刪除表中的全部記錄,可使用truncate table
語句,truncate
將直接刪除原來的表,並從新建立一個表,其語法結構:
truncate table table_name
查詢兒科學的類別編號
select category_id from bookcategory where category='兒科學';
刪除圖書編號爲5的圖書信息
delete from bookinfo where book_category_id = 5;
刪除圖書類別表中兒科學這個類別
delete from bookcategory where category = '兒科學';
查詢全部列
select * from bookcategory; select category_id,category,parent_id from bookcategory;
查詢指定列
select category from bookcategory; select category_id,category from bookcategory;
查詢指定條件的記錄
select book_id,book_name,price from bookinfo where press='出版社';
查詢結果不重複的記錄
select distinct press from bookinfo;
查看空值
select * from readerinfo where age is null;
統計讀者信息表中男讀者的人數
select count(*) from readerinfo where sex='男';
將讀者信息表中的記錄按性別進行分組
select sex from readerinfo group by sex;
將讀者信息表中的記錄按性別進行分組,並統計每種性別的人數
select sex,count(*) from readerinfo group by sex;
將讀者信息表中的記錄按性別進行分組,分組後人數大於的性別
select sex from readerinfo group by sex having count(sex)>2;
經過order by子句對查詢的結果進行排序
order by 列名 [asc|desc]
排序方向:
asc
desc
單列排序
select * from bookinfo order by price;
多列排序
select * from bookinfo order by price,store;
指定排序方向
select * from bookinfo order by price,store desc;
前3行記錄
select * from bookinfo limit 3;
從第3條記錄開始的後2條記錄
select * from bookinfo limit 2,2; select * from bookinfo limit 2 offset 2;
insert into bookinfo(book_id,book_category_id,book_name,author,price,press,pubdate,store) values (454235424,4, '123', 'xxx',85.8, '出版社', '2020-04-01', 10), (452454542,4, '456', 'xxx', 35.5, '出版社', '2020-08-01', 20), (454578754,4, '789', 'xxx', 46.6, '出版社', '2020-05-01',8);
將圖書信息按照庫存進行分組,統計每組庫存下的個數,而後按庫存進行降序排序,並查看結果中的前四條記錄
select store,count(*)from bookinfo group by store order by store desc limit 4;
MySQL 主要有如下幾種運算符:
算術運算符
比較運算符
邏輯運算符
位運算符
運算符優先級
讀者的身份證號,姓名,電話,餘額。
select card_id, name, tel, balance from readerinfo where balance-200<=0;
查看讀者信息表中,餘額大於200的讀者信息。
select * from readerinfo where balance>200;
查看讀者信息表中,餘額不等於200的讀者信息。
select * from readerinfo where balance <> 200;
查看讀者信息表中,年齡不爲空的讀者信息。
select * from readerinfo where age is not null;
查看讀者信息表中,餘額在350到450之間的讀者信息。
select * from readerinfo where balance between 350 and 450;
select * from readerinfo where name in('dada','dada1','dada2'); select * from readerinfo where name like '張_'; select * from readerinfo where tel like '135%'; select * from bookinfo where price>50 and store<5; select * from bookinfo where price>80 or press = '出版社'; select * from bookinfo where price not between 50 and 100;
ceil返回大於x的最小整數值
select ceil(28.55); // 29
floor返回小於x的最大整數值
select floor(28.55); // 28
四捨五入
round返回最接近於參數x的整數,對參數x進行四捨五入
select round(28.55); // 29 select round(28.55,1),round(28.55,0),round(28.55,-1); // 28.6 29 30
截斷函數
select truncate(28.55,1),truncate(28.55,0),truncate(28.55,-1); // 28.5 28 20
取模,返回x被y除後的餘數
select mod(11,2); // 1
select book_id,book_name,price, round(price) from bookinfo; select * from bookinfo where mod(book_id,2)=0;
字符串鏈接
select concat('hello','world'); select concat_ws('-','hello','world');
字母轉換大小寫
select lower('Hello World'); select upper('Hello World');
求長度
select length(' hello ');
刪除空格
select ltrim(' hello '),length(ltrim(' hello ')); select rtrim(' hello '),length(rtrim(' hello ')); select trim(' hello '),length(trim(' hello '));
截取字符串
select substring('hello world',1,5); select substring('hello world',-5,2);
獲取指定長度的字符串
select left('hello world', 5); // hello select right('hello world', 5); // world
替換函數
select replace('hello world','world','mysql'); // hello mysql
格式化函數
select format(1234.5678,2),format(1234.5,2),format(1234.5678,0); //1234.57 1234.50 12345 select book_id,book_name,format(price,2)from bookinfo;
查看當前的系統日期
select curdate(); // 2020-02-02
select curdate()+0; select curtime()+0;
查看當前的系統日期和時間
select now(); // 2020-10-10 12:12:12 select sysdate(); // 2020-10-10 12:12:12
date_add(date,interval expr type):
year,month,day,week,hour
日期的加運算 select date_add('2020-01-01', interval 5 month); // 2020-06-01 計算兩個日期之間間隔的天數 select datediff('2020-02-10','2020-02-01'); 日期格式化 select date_format('2020-02-01', '%Y%m');
| 名稱 | 描述 |
| avg()
| 返回某列的平均值 |
| count()
| 返回某列的行數 |
| max()
| 返回某列的最大值 |
| min()
| 返回某列的最小值 |
| sum()
| 返回某列值的和 |
求圖書信息表中,全部圖書的平均價格。
select avg(price) from bookinfo;
求圖書信息表中,全部圖書的總價格。
select sum(price) from bookinfo;
求圖書信息表中的最大庫存。
select max(store) from bookinfo;
求圖書信息表中的最小庫存。
select min(store) from bookinfo;
求圖書信息表中有多少種圖書。
select count(*) from bookinfo;
按類別進行分組, 查詢每種類別下有多少種圖書以及每種類別圖書的庫存總和。
select book_category_id as '圖書類別',count(book_id) as '圖書種類', sum(store) as '庫存總和' from bookinfo group by book_category_id;
系統信息函數
查看當前MySQL服務器版本的版本號 select version(); 查看MySQL服務器當前鏈接的次數 select connection_id(); 查看當前的數據庫名 select schema(); 查看當前登陸的用戶名 select user();
加密函數
select md5('test'); create table myuser( username varchar(10), password varchar(35) ); insert into myuser values('user1',md5('pwd1')); select * from myuser; select * from myuser where username = 'user1' and password = md5('pwd1'); select password('rootpwd'); set password = password('rootpwd'); select user,authentication_string from mysql.user;
多表鏈接查詢是從多個表中獲取數據。
由圖書信息表:(圖書編號book_id
,類別編號book_category_id
,書名book_name
)
由圖書類別表:(類別編號category_id
,類別名稱category
,父類別parent_id
)
獲取表:(圖書編號book_id
,書名book_name
,類別名稱category
)
多表鏈接的語法結構:
table_reference [INNER] JOIN | {LEFT|RIGHT} [OUTER] JOIN table_reference on conditional_expr
多表鏈接
經過查看圖書信息表和圖書類別表
來獲取圖書編號、圖書名稱、圖書類別
select book_id,book_name,category from bookinfo inner join bookcategory on bookinfo.book_category_id = bookcategory.category_id;
根據鏈接條件從多個表中查詢選擇數據,顯示這些表中與鏈接條件相匹配的數據行,組合成新記錄。(內鏈接就是二者共同都有的)
內鏈接的語法結構:
select column_list from t1 [INNER] JOIN t2 ON join_condition1 [INNER] JOIN t3 ON join_condition2 ...] where where_conditions;
因爲圖書借閱統計的須要,想查詢未歸還圖書的圖書編號,圖書名稱,身份證號,姓名,電話,歸還日期, 是否歸還。
select borrowinfo.book_id,book_name,borrowinfo.card_id, name, tel, return_date, status from borrowinfo inner join bookinfo on borrowinfo.book_id = bookinfo.book_id inner join readerinfo on borrowinfo.card_id = readerinfo.card_id where borrowinfo.status = '否'; select t1.book_id,book_name,t1.card_id, name, tel, return_date, status from borrowinfo t1 join bookinfo t2 on t1.book_id = t2.book_id join readerinfo t3 on t1.card_id = t3.card_id where t1.status = '否';
外鏈接將查詢多個表中相關聯的行。
外鏈接分爲:左外鏈接 left outer join
;右外鏈接right outer join
根據業務須要,咱們須要查看圖書類別表中的全部類別下都有哪些圖書。
select book_id, book_name, category from bookcategory left join bookinfo on bookcategory.category_id = bookinfo.book_category_id where parent_id<>0; select book_id, book_name, category from bookinfo a right join bookcategory b on b.category_id = a.book_category_id; select * from bookcategory;
左外鏈接:顯示左表所有記錄,右表知足鏈接條件的記錄。
右外鏈接:顯示右表所有記錄,左表知足鏈接條件的記錄。
語法結構:
select column_list from t1 left | right [outer] join t2 on join_condition1;
若是在一個鏈接查詢中,涉及的兩個表都是同一個表,這種查詢稱爲自鏈接
查詢全部圖書類別的圖書類別編號,類別名稱,上級分類名稱。
select * from bookcategory; select s.category_id as'圖書類別編號', s.category as '圖書類別名稱', p.category as'圖書的上級分類名稱' from bookcategory s inner join bookcategory p on s.parent_id = p.category_id;
update table1 {[inner] join | {left|right} [outer] join} table2 on conditional_expr set col1 = {expr1|default} [,col2 = {expr2|default}]... [where where_condition]
身份證號爲432xxxxxx的讀者將超時的圖書86154歸還,根據描述實現以下需求:
update readerfee t1 join readerinfo t2 on t1.card_id = t2.card_id set actual_return_date = sysdate(),book_fee=datediff(sysdate(),return_date)*0.2,balance = balance - book_fee where t1.book_id = 86154 and t1.card_id = '432xxxxxx'; select * from readerinfo;
delete table1[.*], table2[.*] from table1 {[inner]join|{left|right}[outer]join} table2 on conditional_expr [where where_condition]
圖書類別表,圖書信息表:
因爲業務需求,須要刪除圖書類別表中在圖書信息表中沒有圖書記錄的類別。
select book_id,book_name,category from bookcategory_bak t1 left join bookinfo_bak t2 on t1.category_id = t2.book_category_id where parent_id<>0; delete t1 from bookcategory_bak t1 left join bookinfo_bak t2 on t1.category_id = t2.book_category_id where parent_id<>0 and book_id is null; select * from bookcategory_bak;
須要刪除圖書類別表的編程語言的類別,以及圖書信息表中關於編程語言的圖書記錄。
select book_id,book_name,category_id,category from bookcategory_bak t1 inner join bookinfo_bak t2 on t1.category_id = t2.book_category_id; delete t1,t2 from bookcategory_bak t1 inner join bookinfo_bak t2 on t1.category_id = t2.book_category_id where t1.category_id = 3;
根據鏈接查詢返回的結果:內鏈接(inner join),外鏈接(outer join),交叉鏈接(cross join)。
根據鏈接條件所使用的操做符:相等鏈接,不等鏈接。
建立函數
CREATE FUNCTION 函數名(參數列表) RETURNS 返回類型 BEGIN 函數體 END
調用函數
SELECT 函數名(參數列表)
查看函數
SHOW FUNCTION STATUS;
刪除函數
DROP FUNCTION IF EXISTS function_name;
函數:須要有返回值,能夠指定0~n個參數
建立自定義函數:
create function function_name([func_parameter]) returns type [characteristics..] routine_body
Characteristics
指定存儲函數的特性,取值舉例:
sql security{definer|invoker}指明誰有權限來執行。 definer表示只有定義者才能執行。 invoker表示擁有權限的調用者才能夠執行,默認狀況下,系統指定爲definer。 comment 'string':註釋信息,能夠用來描述存儲函數。
函數體是由sql代碼構成,能夠簡單的sql語句。若是爲複合結構須要使用begin...end
語句,複合結構能夠包含聲明,流程控制。
select length('hello'); select date_format(pubdate,'%Y-%m') from bookinfo; delimiter // create function ym_date(mydate date) returns varchar(15) begin return date_format(mydate,'%Y-%m'); end// delimiter; select ym_date(pubdate) from bookinfo;
建立自定義函數:
語法格式:
create function function_name([func_parameter]) returns type [characteristics...] routine_body
select length('hello'); select date_format(pubdate,'%Y-%m') from bookinfo;
delimiter // create function ym_date(mydate date) returns varchar(15) begin return date_format(mydate,'%Y-%m'); end// delimiter ; 使用(調用)自定義函數 select ym_date(pubdate) from bookinfo;
實例分析函數:
建立一個函數 delimiter $$ --定界符 --- 開始建立函數 create function user_main_fn(v_id int) returns varchar(50) begin --定義變量 declare v_userName varchar(50); --給定義的變量賦值 select f_userName info v_userName from t_user_main where f_userId = v_id; --返回函數處理結果 return v_userName; end $$ --函數建立定界符 delimiter;
自定義函數兩個必要條件:參數,返回值
create function function_name returns {string|integer|real|decimal} routine_body 語法格式: CREATE FUNCTION function_name([func_parameter]) RETURNS type [characteristics … ] routine_body
建立無參的自定義函數:
刪除自定義函數
DROP FUNCTION [IF EXISTS] func_name;
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H點:%i分:%s秒') CREATE FUNCTION f1() RETURNS VARCHAR(30) RETURN DATE_FORMAT(NOW(), '%Y年%m月%d日 %H點:%i分:%s秒'); SELECT f1();
複合結構體的函數
-- 將語句結束符改成$$,爲了防止下面的函數將;當作是語句的結束 DELIMITER $$ CREATE FUNCTION adduser(username VARCHAR(20)) RETURNS INT UNSIGNED RETURN BEGIN INSERT INTO table_1(username) VALUES(username); LAST_INSERT_ID(); END; -- 將分隔符改回來 DELIMITER ;
經常使用的流程控制語句:
局部變量以關鍵字DECLARE
聲明
DECLARE var_name [, varname2, varname3 …] date_type [DEFAULT value]; 例:DECARE num INT DEFAULE 10;
內部BEGIN…END
塊中定義的變量只在該塊內有效
會話變量的做用範圍爲整個程序
語法結果
create procedure proc_name([proc_parameter]) [characteristics...] routine_body
delimiter // create procedure selectproc1() begin select book_id, book_name, price, store from bookinfo; end // delimiter; call selectproc();
刪除存儲過程:
drop procedure [if exists] proc_name;
建立一個查詢圖書的編號、書名、價格和庫存的存儲過程。 delimiter // create procedure selectproc1() begin select book_id,book_name,price,store from bookinfo; end// delimiter ; 調用存儲過程 call selectproc1();
建立查詢圖書編號、書名、圖書類別的存儲過程 delimiter // create procedure proc1() begin select book_id,book_name,category from bookinfo t1 join bookcategory t2 on t1.book_category_id = t2.category_id; end// delimiter ; call proc1(); 設計一個存儲過程,刪除一個讀者,並輸出剩餘讀者的個數。 delimiter // create procedure proc2(in cid char(18), out num int) begin delete from readerinfo where card_id = cid; select count(card_id) into num from readerinfo; end// delimiter ; select * from readerinfo; call proc2('6545xx', @num); select @num; 設計一個存儲過程,實現交換兩個數的處理。 delimiter // create procedure proc3(inout num1 int, inout num2 int) begin declare t int default 0; set t = num1; set num1 = num2; set num2 = t; end// delimiter ; set @n1 = 3, @n2 = 5; call proc3(@n1,@n2); select @n1,@n2; 刪除存儲過程 drop procedure proc1; drop procedure if exists proc2;
存儲過程,存儲過程實現的功能比較複製,功能強大,能夠執行包括修改表等一系列數據庫操做。
存儲函數,實現的功能針對性比較強。
返回值上的不一樣
存儲過程:能夠返回多個值,也能夠不返回值,只是實現某種效果或動做。
存儲函數:必須有返回值,並且只能有一個返回值。
參數不一樣
存儲過程:存儲過程的參數類型有三種,in,out,inout。
存儲函數:參數類型只有一種,相似於in參數,調用函數時須要按照參數的類型指定值便可。
語法結構
存儲過程,存儲過程聲明時不須要指定返回類型。
存儲函數,函數聲明時須要指定返回類型,且在函數體中必須包含一個有效的return語句。
調用方式
存儲過程,用call
語句進行調用
存儲函數,嵌入在sql
中使用的,能夠在select
中調用
事務必須知足的四個條件:
atomicity 原子性 consistency 一致性 lsolation 隔離性 durability 持久性
控制事務處理
rollback
,回滾會結束用戶的事務,並撤銷正在進行的全部未提交的修改
commit
,會提交事務,並使已對數據庫進行的全部修改稱爲永久性的
savepoint identifier
,容許在事務中建立一個保存點,一個事務中能夠有多個savepoint
rollback to identifier
,把事務回滾到標記點
事務處理主要有兩種方法
用begin, rollback, commit
來實現
begin,start transaction
開始一個事務rollback
事務回滾commit
事務確認
直接用set來改變mysql的自動提交模式
set autocommit = 0
禁止自動提交set autocommit = 1
開始自動提交從Mysql5.5版本開始,InnoDB是默認的表存儲引擎。
innodb
是事務型數據庫的首選引擎,支持事務安全表。
MySql中 delimiter
默認下,delimiter是分號,在命令行客戶端中,若是有一行命令以分號結束,那麼回車後,mysql將會執行該命令。
(告訴mysql解釋器,該段命令是否已經結束了,mysql是否能夠執行了。 )
什麼是存儲引擎:數據庫存儲引擎是數據庫底層軟件組件。數據庫管理系統使用數據引擎進行建立,查詢,更新和刪除數據的操做。
mysql
的核心就是存儲引擎。
innodb
存儲引擎
mysql
提供了具備提交,回滾和崩潰恢復能力的事務安全存儲引擎。innodb
存儲引擎支持外鍵完整性約束innodb
被用在衆多須要高性能的大型數據庫站點上設置存儲引擎:
default-storage-engine=InnoDB
建立表(單個)設置存儲引擎 create table mytest( id int primary key, name varchar(10) ) engine = innodb default charset = utf8;
修改表的存儲引擎
alter table tablename engine = engineName
管理用戶
USE mysql; select user from user;
權限表:存儲帳號的權限信息表:user,db,host,tables_priv,columns_priv
和procs_priv
各個權限表的做用
tables_priv
表用來對錶設置操做權限;columns_priv
表用來對錶的某一列設置權限;procs_priv
表能夠對存儲過程和存儲函數設置操做權限。
使用CREATE USER語句建立新用戶
語法格式:
CREATE USER 「user」@「host」 [IDENTIFIED BY 「password」];
使用DROP USER 語句刪除用戶
語法格式:
DROP USER user[, user]; 例:使用DROP USER刪除帳戶"rose"@"localhost": DROP USER "rose"@"localhost";
示例:
查看日誌文件的路徑 show variables like 'log_error'; 建立新的日誌信息表 flush logs; 建立新的日誌信息表 mysqladmin -uroot -p flush-logs
好了各位,以上就是這篇文章的所有內容,能看到這裏的人都是人才。我後面會不斷更新技術相關的文章,若是以爲文章對你有用,歡迎給個「贊」,也歡迎分享,感謝你們 !!