python基礎---sql語句
數據庫系統:
數據庫:文件夾
數據表:文件
表記錄:一條數據
sql語句規範
sql是Structured Query Language(結構化查詢語言)的縮寫。SQL是專為數據庫而建立的操作命令集,是一種功能齊全的數據庫語言
<1> 在數據庫系統中,SQL語句不區分大小寫(建議用大寫) 。但字符串常量區分大小寫。建議命令大寫,表名庫名小寫;
<2> SQL語句可單行或多行書寫,以“;”結尾。關鍵詞不能跨多行或簡寫。
<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 字段 類型[完整性約束條件
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
本文出自 “lyndon” 博客,請務必保留此出處http://lyndon.blog.51cto.com/11474010/1965143
python基礎---sql語句