數據庫系統:mysql
數據庫:文件夾正則表達式
數據表:文件sql
表記錄:一條數據數據庫
sql語句規範ide
sql是Structured Query Language(結構化查詢語言)的縮寫。SQL是專爲數據庫而創建的操做命令集,是一種功能齊全的數據庫語言函數
<1> 在數據庫系統中,SQL語句不區分大小寫(建議用大寫) 。但字符串常量區分大小寫。建議命令大寫,表名庫名小寫;spa
<2> SQL語句可單行或多行書寫,以「;」結尾。關鍵詞不能跨多行或簡寫。rest
<3> 用空格和縮進來提升語句的可讀性。子句一般位於獨立行,便於編輯,提升可讀性。排序
1索引 2 |
SELECT * FROM tb_table WHERE NAME="YUAN"; |
<4> 註釋:
單行註釋:--
多行註釋:/*......*/
<5>sql語句能夠折行操做
1、mysql的經常使用sql語句:
a.庫的操做
1.建立數據庫:
create database 庫名 [character set utf8(指定字符集,不加默認爲拉丁文)];
2.查看數據庫
show databases; 查看全部數據庫
show create database 庫名; 查看數據庫的建立信息
use 庫名; 切換到指定數據庫
select database(); 查看當前所在的庫
3.修改數據庫(修改字符集)
alter database 庫名 [character set utf8(指定字符集,不加默認爲拉丁文)];
4.刪除數據庫
drop database 庫名;
b.表的操做
1.建立表
create table 表名 (
字段 類型[完整性約束條件],
字段 類型[完整性約束條件]
);
2.查看錶信息
show tables; 查看當前庫中全部的表
show create table 表名; 查看錶的建表語句
desc 表名; 查看錶結構
show columns from 表名; 同上,查看錶結構
3.修改表結構
alter table 表名(
add 字段 類型[完整性約束條件] [first|after 字段名], #增長字段
modify 字段 類型[完整性約束條件] [first|after 字段名], #修改字段類型
change 舊字段 新字段 類型[完整性約束條件][first|after 字段名] #修改字段名
drop 字段; #刪除一列字段
);
rename table 舊錶名 to 新表名; 修改表名
4.刪除表
drop table 表名; 刪除表
c.表記錄的操做
1.增長表記錄
增長一條記錄:
insert [into] 表名 (字段1,字段2,…) values (值1,值2,…);
增長多條:
insert [into] 表名 (字段1,字段2,…) values (值1,值2,…),
(值1,值2,…),
…… ;
set插入:
insert [into] 表名 set 字段1=值2,字段2=值2;
2.修改表記錄
update 表名 set 字段1=值1 where子句
3.刪除表記錄
delete from 表名 where 子句;
清空表內全部記錄有兩種方法:
方式1:
delete from 表名;
方式2:
truncate table 表名;
對比:
delete語句只能刪除表中的內容,不能刪除表自己,想要刪除表,用drop
truncate也能夠刪除表中的全部數據,語句首先會摧毀表,再新建表,此種方式刪除的數據不能在事務中恢復,數據量大時推薦使用
4.查詢表記錄
select * from 表名; #顯示全部的記錄信息
select 字段1,字段2,… from 表名
where 子句 #過濾查詢
group by 字段 #分組查詢
having 子句 #過濾
order by 字段 #排序
limit #記錄條數限制
Mysql在執行sql語句時的執行順序:
from > where > select > group by > having > orderby
(1)where 子句:
比較運算符:
> < >= <=<> !=
between 80 and 100 值在10到20之間
in(80,90,100) 值是10或20或30
like 'yuan%' (%後面能夠接_,表明匹配一個字符,能夠接多個)
邏輯運算符
在多個條件直接可使用邏輯運算符 and or not
(2)group by 字段:
GROUP BY 語句根據某個列對結果集進行分組,在分組的列上咱們可使用聚合函數進行相關查詢
count 計數
sum 總數值
avg 平均值
max 最大值
min 最小值
(3)having 子句
過濾
與where 子句的區別:
在sql語句中,二者的書寫順序和執行順序不同,where寫在前面,先執行,having寫在後面,後執行,having適用於對查詢結果的二次過濾
(4)order by 字段
按指定的列進行排序,排序的列便可是表中的列名,也能夠是select語句後指定的別名
語法:select*|field1,field2... from tab_name order by field [Asc|Desc]
-- Asc 升序、Desc 降序,其中asc爲默認值 ,ORDER BY 子句應位於SELECT語句的結尾。
(5)limit記錄條數限制
(6)正則表達式
練習:
先建立一個員工表:
create table emp(
id int primary keyauto_increment,
name varchar(20),
gender enum("male","female","other"),
age tinyint,
dep varchar(20),
city varchar(20),
salary double(7,2)
);
表內插入信息:
insert into emp(name,gender,age,dep,city,salary) values
("yuan","male",24,"教學部","河北省",8000),
("egon","male",34,"保安部","山東省",8000),
("alex","male",28,"×××部","山東省",10000),
("景麗陽","female",22,"教學部","北京",9000),
("張三", "male",24,"教學部","河北省",6000),
("李四", "male",32,"保安部","北京",12000),
("王五", "male",38,"教學部","河北省",7000),
("趙六", "male",19,"保安部","河北省",9000),
("豬七", "female",24,"×××部","北京",9000);
查看錶記錄信息:
mysql> select * from emp;
+----+--------+--------+------+--------+--------+----------+
| id | name | gender | age | dep | city | salary |
+----+--------+--------+------+--------+--------+----------+
| 1| yuan | male | 24| 教學部 | 河北省 | 8000.00 |
| 2| egon | male | 34| 保安部 | 山東省 | 8000.00 |
| 3| alex | male | 28| ×××部 | 山東省 | 10000.00 |
| 4| 景麗陽 | female| 22 | 教學部 | 北京 | 9000.00 |
| 5| 張三 | male | 24 | 教學部 | 河北省 | 6000.00 |
| 6| 李四 | male | 32 | 保安部 | 北京 | 12000.00 |
| 7| 王五 | male | 38 | 教學部 | 河北省 | 7000.00 |
| 8| 趙六 | male | 19 | 保安部 | 河北省 | 9000.00 |
| 9| 豬七 | female | 24 | ×××部 | 北京 | 9000.00 |
+----+--------+--------+------+--------+--------+----------+
查詢語句實例:
查詢全部name、salary字段的值
select name,salary from emp;
查詢全部name、salary字段的值並設置別名
select name as 姓名,salary as 薪水 from emp; #as能夠省略不寫
where 子句
查詢全部年齡大於20的:
select * from emp where age>20;
查詢全部年齡大於20的name、salary:
select name,salary from emp whereage>20;
查詢全部年齡除以10大於2的name、age:
select name,age from emp where age/10>2;
查詢全部年齡在20到30歲之間的name、age:
select name,age from emp where age between20 and 30; #閉區間,包含20和30
查詢全部姓張的name、age:
select name,age from emp where name like"張%";
查詢全部性別爲male且年齡大於25的name、age:
select name,age from emp wheregender="male" and age>25;
2.group by 字段
查詢每一個部門的人數:
select dep,count(*) from emp group by dep;
查詢每一個部門裏的最高工資:
select dep,max(salary) from emp group bydep;
查詢男生、女生的人數:
select gender,count(*) from emp group by gender;
查詢每一個省份的最高工資:
select city,avg(salary) from emp group bycity;
3.having 子句:
查詢平均工資大於8000的省份:
select city,avg(salary) from emp group bycity having avg(salary)>8000;
4.order by
按員工薪資從低到高排序:
select * from emp order by salary;
按員工薪資從高到低排序:
select * from emp order by salary desc;
5.limit
查詢表內前5條記錄:
select * from emp limit 5;
查詢第2條記錄之後的3條記錄:
select * from emp limit 2,3; #不包含第2條
2、多表查詢
建立練習表:
首先建立員工表emp:
create table emp(
id int primary key auto_increment,
name varchar(20),
salary double(7,2),
dep_id int
);
插入員工信息(dep_id對應dep表中的id):
insert into emp (name,salary,dep_id) values("張三",8000,2),
("李四",12000,1),
("王五",5000,2),
("趙六",8000,3),
("豬七",9000,1),
("周八",7000,4),
("蔡九",7000,2);
建立部門表dep:
create table dep(
id int primary key auto_increment,
name varchar(20)
);
插入部門信息:
insert into dep (name) values ("教學部"),
("銷售部"),
("人事部");
笛卡爾積查詢:
mysql> select * from emp,dep;
+----+------+----------+--------+----+--------+
| id | name | salary | dep_id | id | name |
+----+------+----------+--------+----+--------+
| 1| 張三 | 8000.00 | 2 | 1 | 教學部 |
| 1| 張三 | 8000.00 | 2 | 2 | 銷售部 |
| 1| 張三 | 8000.00 | 2 | 3 | 人事部 |
| 2| 李四 | 12000.00| 1 | 1 | 教學部 |
| 2| 李四 | 12000.00| 1 | 2 | 銷售部 |
| 2| 李四 | 12000.00| 1 | 3 | 人事部 |
| 3| 王五 | 5000.00 | 2 | 1 | 教學部 |
| 3| 王五 | 5000.00 | 2 | 2 | 銷售部 |
| 3| 王五 | 5000.00 | 2 | 3 | 人事部 |
| 4| 趙六 | 8000.00 | 3 | 1 | 教學部 |
| 4| 趙六 | 8000.00 | 3 | 2 | 銷售部 |
| 4| 趙六 | 8000.00 | 3 | 3 | 人事部 |
| 5| 豬七 | 9000.00 | 1 | 1 | 教學部 |
| 5| 豬七 | 9000.00 | 1 | 2 | 銷售部 |
| 5| 豬七 | 9000.00 | 1 | 3 | 人事部 |
| 6| 周八 | 7000.00 | 4 | 1 | 教學部 |
| 6| 周八 | 7000.00 | 4 | 2 | 銷售部 |
| 6| 周八 | 7000.00 | 4 | 3 | 人事部 |
| 7| 蔡九 | 7000.00 | 2 | 1 | 教學部 |
| 7 |蔡九 | 7000.00 | 2 | 2 | 銷售部 |
| 7| 蔡九 | 7000.00 | 2 | 3 | 人事部 |
+----+------+----------+--------+----+--------+
21 rows in set (0.00 sec)
a.內鏈接查詢
select * from 表1 inner join 表2 on 子句
inner join(等值鏈接) 只返回兩個表中聯結字段相等的行
查詢兩張表中都有的關聯數據,至關於利用條件從笛卡爾積結果中篩選出了正確的結果
查詢張三所在的部門:
select emp.name,dep.name from emp,dep whereemp.dep_id=dep.id and emp.name="張三";
或者
mysql> select emp.name,dep.name from empinner join dep on emp.dep_id=dep.id where emp.name="張三";
b.外鏈接查詢
left join(左聯接) 返回包括左表中的全部記錄和右表中聯結字段相等的記錄
right join(右聯接) 返回包括右表中的全部記錄和左表中聯結字段相等的記錄
以左表爲主,打印出全部信息(包含左表的全部記錄):
select * from emp left join dep onemp.dep_id=dep.id order by emp.id;
以右表爲主,打印出全部信息(包含右表的全部記錄):
select * from emp right join dep onemp.dep_id=dep.id order by emp.id;
3、完整性約束
完整性約束是對字段進行限制,從而符合該字段達到咱們指望的效果好比字段含有默認值,不能是NULL等 。直觀點說:若是插入的數據不知足限制要求,數據庫管理系統就拒絕執行操做
a. 惟一約束
能夠有多個但索引列的值必須惟一,索引列的值容許有空值
若是能肯定某個數據列將只容許包含不相同的值,在爲這個數據列建立索引的時候就應該使用關鍵字unique
在建表時添加惟一約束:
create table 表名(
id int auto_increment, #id字段設置自增
namevarchar(20) default null,
primary key (id), #id字段設置爲主鍵
unique key 索引別名 (name) #name設置爲惟一索引
);
在建表後添加惟一約束:
alter table 表名 add constraint 索引別名 unique (name);
若是不須要惟一約束,則能夠這樣刪除
alter table 表名 drop index 索引別名;
b.自增約束
MySQL 每張表只能有1個自動增加字段,這個自動增加字段一般做爲主鍵,也能夠用做非主鍵使用,可是請注意將自動增加字段當作非主鍵使用時必須爲其添加惟一索引,不然系統將會報錯
create table 表名(
id int not null,
namevarchar(20),
age int uniqueauto_increment #把age字段設置爲自增字段和惟一索引
);
c.主鍵約束
主鍵是用於惟一標識一條記錄的約束,如同×××
主鍵有兩個約束:非空且惟一
建表時添加主鍵的兩種方式:
方式1:
create table 表名(
字段 類型 primary key auto_increment, #設置字段爲主鍵且自增
字段 類型
);
方式2:
create table 表名(
字段 類型 not null,
字段 類型
);
建表後添加主鍵:
alter table 表名 add primary key(字段名)
設置主鍵注意:
1、一張表中最多隻能有一個主鍵
2、表中若是沒有設置主鍵,默認設置NOT NULL的字段爲主鍵;此外,表中若是有多個NOT NULL的字段,則按順序將第一個設置NOT NULL的字段設爲主鍵。
主鍵必定是非空且惟一,但非空且惟一的字段不必定是主鍵。
3、主鍵類型不必定必須是整型
刪除主鍵:
alter table 表名 drop primary key;
刪除主鍵注意:
若是主鍵是auto_increment,須要先取消auto_increment,由於auto_increment只能加在key上
create table 表名(字段 類型 primary key auto_increment);
alter table 表名 modify 字段 類型; #刪除自增,主鍵依然存在
alter table 表名 drop primary key; #刪除主鍵
複合主鍵:
複合主鍵 就是指表的主鍵含有一個以上的字段
若是一列不能惟一區分一個表裏的記錄時,能夠考慮多個列組合起來達到區分表記錄的惟一性
建立複合主鍵:
create table 表名 (
字段1 int,
字段2 int,
字段3 int,
primary key (字段1,字段2)
);
修改複合主鍵:
alter table 表名 add primary key (字段1,字段2,字段3);
d.外鍵約束
外鍵的定義語法:
[constraint symbol] foreign key [id](index_col_name, ...)
references tbl_name(index_col_name, ...)
[on delete {restrict | cascade | set null | no action | set default}]
[on update {restrict | cascade | set null | no action | set default}]
表關係:
表與表之間的關係(兩張表):
一對多
將關聯字段設置在多的表中(多)
有外鍵的叫子表,沒有外鍵的叫主表
多對多
兩表彼此一對多,就是多對多的關係
藉助第三張表來實現
一對一
能夠將關聯字段設在任意一張表上,但約束必須爲unique