原生SQL代码大全
-- -sql語句的注意 : 1 以;作為結束符 2 不區分大小寫
--01 mysql 數據庫的操作-- **鏈接數據庫**mysql -uroot -pmysql-- 不顯示密碼mysql -uroot -pmysql-- 退出數據庫exit/quti/ctrl + d-- sql語句最后需要有分號;結尾-- 顯示數據庫版本 versionselect version();-- 顯示時間select now();-- 查看當前使用的數據庫select database();-- 查看所有數據庫show databases;-- 創建數據庫-- create database 數據庫名 charset=utf8;create database python01; # 可能會出現亂碼create database python01 charset=utf8;-- 查看創建數據庫的語句-- show create database ....show create database python01;-- 使用數據庫-- use 數據庫的名字use python01;-- 刪除數據庫-- drop database 數據庫名;drop database python01;--02 數據表的操作-- 查看當前數據庫中所有表show tables;-- 創建表-- int unsigned 無符號整形-- auto_increment 表示自動增長-- not null 表示不能為空-- primary key 表示主鍵 數據庫主鍵,指的是一個列或多列的組合,-- 其值能唯一地標識表中的每一行,通過它可強制表的實體完整性。-- 主鍵主要是用于其他表的外鍵關聯,以及本記錄的修改與刪除。-- default 默認值-- create table 數據表名字 (字段 類型 約束[, 字段 類型 約束]);create table xxx(id int unsigned primary key not null auto_increment,name varchar(20) not null);-- 查看表結構-- desc 數據表的名字;desc xxx;-- 創建 classes 表(id、name)-- varchar表示可變長度的字符串--create table classes(id int unsigned primary key auto_increment not null,name varchar(20) not null);-- 創建 students 表(id、name、age、high (decimal)、gender (enum)、cls_id)-- decimal表示浮點數,如decimal(5,2)表示共存5位數,小數占2位,例如:185.88-- 枚舉類型(enum) 例如:enum("男性","女性","中性","保密")create table students(id int unsigned primary key auto_increment not null,name varchar(20) not null,age int unsigned,high decimal(5,2),gender enum("男性","女性","中性","保密") default "保密",cls_id int unsigned);-- 查看表的創建語句-- show create table 表名字;show create table xxx;-- 修改表-添加字段 mascot (吉祥物)-- alter table 表名 add 列名 類型;alter table classes add chongwu varchar(20) default"蛇";-- 修改表-修改字段:不重命名版-- alter table 表名 modify 列名 類型及約束;alter table classes modify mascot varchar(30) default"葫蘆娃";-- 修改表-修改字段:重命名版-- alter table 表名 change 原名 新名 類型及約束;alter table classes change chongwu mascot varchar(20) default"法拉利";-- 修改表-刪除字段-- alter table 表名 drop 列名;alter table classes drop mascot;-- 刪除表-- drop table 表名;-- drop database 數據庫;--03 增刪改查(curd)-- 增加
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
+-------+------------------+------+-----+---------+----------------+-- 全列插入-- insert [into] 表名 values(...)-- 主鍵字段 可以用 0 null default 來占位-- 向classes表中插入 一個班級insert into classes values(1,"python大神班");
+--------+-------------------------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------------------------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| age | int(10) unsigned | YES | | NULL | |
| high | decimal(5,2) | YES | | NULL | |
| gender | enum('男性','女性','中性','保密') | YES | | 保密 | |
| cls_id | int(10) unsigned | YES | | NULL | |
+--------+-------------------------------------------+------+-----+---------+-------------- 向students表插入 一個學生信息insert into students values(1,"班主任",18,166.66,2,111);insert into students values(0,"吳彥祖",42,188.88,1,222);insert into students values(null,"晨哥",28,188.88,1,333);-- 部分插入-- insert into 表名(列1,...) values(值1,...)insert into students(name) values("老王");-- 多行插入insert into students values(null,"老李",28,188.88,1,333),(null,"趙四",28,188.88,1,333);-- 修改-- update 表名 set 列1=值1,列2=值2... where 條件;-- 全部修改update students set high = 170.00;-- 按條件修改update students set high = 170.00 where id=3;-- 按條件修改多個值-- update students set gender ="",name = "xxx" ;update students set gender="中性",name="111" where id=3;-- 查詢基本使用-- 查詢所有列-- select * from 表名;select * from students;---定條件查詢select * from students where id=1;-- 查詢指定列-- select 列1,列2,... from 表名;select name,gender from students;-- 可以使用as為列或表指定別名-- select 字段[as 別名] , 字段[as 別名] from 數據表;select name as "姓名",gender as "性別" from students;-- 字段的順序select gender as "性別",name as "姓名" from students;-- 刪除-- 物理刪除-- delete from 表名 where 條件delete from students where id=3;-- 邏輯刪除-- 用一個字段來表示 這條信息是否已經不能再使用了-- 給students表添加一個 is_delete 字段 bit 類型alter table students add is_delete bit default 0;update students set is_delete=1 where id = 1;-- 數據庫備份與恢復(了解)-- mysqldump –uroot –p 數據庫名 > python.sql;-- mysql -uroot –p 新數據庫名 < python.sql;-- 查詢練習-- 查詢所有字段-- select * from 表名;select * from students;-- 查詢指定字段-- select 列1,列2,... from 表名;select name,gender from students;-- 使用 as 給字段起別名-- select 字段 as 名字.... from 表名;select name as "姓名",gender as "性別" from students;-- select 表名.字段 .... from 表名;select name as "姓名",gender as "性別" from students as s;-- 可以通過 as 給表起別名-- select 別名.字段 .... from 表名 as 別名;select s.name as "姓名",s.gender as "性別" from students as s;失敗的select students.name, students.age from students as s;-- 消除重復行(查性別)-- distinct 字段 select gender from students;select distinct gender from students;-- 條件查詢-- 比較運算符-- select .... from 表名 where .....-- >-- 查詢大于18歲的信息select * from students where age > 18;-- <-- 查詢小于18歲的信息select * from students where age < 18;-- >=-- <=-- 查詢小于或者等于18歲的信息select * from students where age <= 18;-- =-- 查詢年齡為18歲的所有學生的名字(區別)select * from students where age = 18;-- != 或者 <>select * from students where age != 18;-- 邏輯運算符-- and-- 18和28之間的所以學生信息select * from students where age >=18 and age <=28;失敗 select * from students where age>18 and <28;-- 18歲以上的女性select * from students where age > 18 and gender = 2;-- or-- 18以上或者身高高過180(包含)以上select * from students where age > 18 or height >= 180;-- not-- 不在 18歲以上的女性 這個范圍內的信息-- select * from students where not age>18 and gender=2;select * from students where not (age > 18 and gender = 2);-- 模糊查詢(where name like 要查詢的數據)-- like -- % 替換任意個-- _ 替換1個-- 查詢姓名中 以 "小" 開始的名字select * from students where name like "小%";-- 查詢姓名中 有 "小" 所有的名字select * from students where name like "%小%";-- 查詢有2個字的名字select * from students where name like "__";-- 查詢有3個字的名字select * from students where name like "___";-- 查詢至少有2個字的名字select * from students where name like "__%";-- 范圍查詢-- in (1, 3, 8)表示在一個非連續的范圍內-- 查詢 年齡為18、34的姓名select * from students where age =18 or age = 34;select * from students where age in (18,34);-- not in 不非連續的范圍之內-- 年齡不是 18、34歲之間的信息select * from students where age not in (18,34);(注意)select name from students where not age in (18,34);-- between ... and ...表示在一個連續的范圍內-- 查詢 年齡在18到34之間的的信息select * from students where age between 18 and 34;-- not between ... and ...表示不在一個連續的范圍內-- 查詢 年齡不在在18到34之間的的信息select * from students where age not between 18 and 34;失敗的select * from students where age not (between 18 and 34);-- 空判斷-- 判空is null-- 查詢身高為空的信息select * from students where height is null;-- 判非空is not nullselect * from students where height is not null;失敗select * from students where height not is null;-- 排序-- order by 字段-- asc從小到大排列,即升序-- desc從大到小排序,即降序-- 查詢年齡在18到34歲之間的男性,按照年齡從小到大到排序select * from students where (age between 18 and 34) and gender = 1 order by age asc;-- 查詢年齡在18到34歲之間的女性,身高從高到矮排序select * from students where (age between 18 and 34) and gender = 2 order by height desc;-- order by 多個字段-- 查詢年齡在18到34歲之間的女性,身高從高到矮排序, 如果身高相同的情況下按照年齡從小到大排序select * from students where (age between 18 and 34) and gender = 2 order by height desc,age asc;-- 查詢年齡在18到34歲之間的女性,身高從高到矮排序, 如果身高相同的情況下按照年齡從小到大排序,-- 如果年齡也相同那么按照id從大到小排序select * from students where (age between 18 and 34) and gender = 2 order by height desc,age asc,id desc;-- 聚合函數-- 總數-- count-- 查詢男性有多少人,女性有多少人select count(*) from students where gender = 1;select count(*) from students where gender = 2;-- 最大值-- max-- 查詢最大的年齡select max(age) from students;-- 查詢女性的最高 身高select max(height) from students where gender = 2;-- 最小值-- minselect min(height) from students where gender = 2;-- 求和-- sum-- 計算所有人的年齡總和select sum(age) from students;-- 平均值-- avg-- 計算平均年齡select avg(age) from students;-- 計算平均年齡 sum(age)/count(*)-- 四舍五入 round(123.23 , 1) 保留1位小數-- 計算所有人的平均年齡,保留3位小數select round(avg(age),3) from students;-- 計算男性的平均身高 保留2位小數select round(avg(height),2) from students where gender = 1;-- 分組-- group by-- 按照性別分組,查詢所有的性別select gender from students group by gender;-- select name,gender from students group by gender;-- 失敗select * from students group by gender;select * from students group by gender;-- 計算每種性別中的人數select count(*),gender from students group by gender;-- group_concat(...)-- 查詢同種性別中的姓名select group_concat(name),gender from students group by gender;-- 查詢每組性別的平均年齡select avg(age),gender from students group by gender;-- having(注意having和group by)(!)-- 查詢平均年齡超過30歲的性別,以及姓名 having avg(age) > 30select gender,group_concat(name) from students group by gender having avg(age) > 30;-- 查詢每種性別中的人數多于2個的信息select gender,group_concat(name) from students group by gender having count(*) > 2;-- with rollup 匯總的作用(了解)select gender,count(*) from students group by gender with rollup;-- 分頁-- limit start, count-- 限制查詢出來的數據個數-- 查詢前5個數據select * from students limit 5;-- 每頁顯示2個,第1個頁面select * from students limit 0,2;-- 每頁顯示2個,第2個頁面select * from students limit 2,2;-- 每頁顯示2個,第3個頁面select * from students limit 4,2;-- 每頁顯示2個,第4個頁面select * from students limit 6,2;-- 每頁顯示2個,顯示第6頁的信息, 按照年齡從小到大排序(limit 必須寫到sql語句的最后)錯誤1 select * from students limit 10,2 order by age asc;-- 工作錯誤的寫法錯誤2 select * from students limit 2*(6-1),2;-- limit 放在最后面(注意)-- 連接查詢-- inner join ... on-- select ... from 表A inner join 表B;select * from students inner join classes;-- 查詢 有能夠對應班級的學生以及班級信息select * from students inner join classes on students.cls_id = classes.id;-- 按照要求顯示姓名、班級select students.name,classes.name from students inner join classes on students.cls_id = classes.id;-- 給數據表起名字select s.name,c.name from students as s inner join classes as c on s.cls_id = c.id;-- 查詢 有能夠對應班級的學生以及班級信息,顯示學生的所有信息 students.*,只顯示班級名稱 classes.name.select s.*,c.name from students as s inner join classes as c on s.cls_id = c.id;-- 在以上的查詢中,將班級姓名顯示在第1列select c.name,s.* from students as s inner join classes as c on s.cls_id = c.id;-- 查詢 有能夠對應班級的學生以及班級信息, 按照班級進行排序-- select c.xxx s.xxx from students as s inner join clssses as c on .... order by ....;select c.name,s.* from students as s inner join classes as c on s.cls_id = c.id order by c.name;-- 當時同一個班級的時候,按照學生的id進行從小到大排序select c.name,s.* from students as s inner join classes as c on s.cls_id = c.id order by c.name,id asc;-- left join-- 查詢每位學生對應的班級信息select * from students left join classes on students.cls_id = classes.id;-- select * from students right join classes on students.cls_id = classes.id;-- 查詢沒有對應班級信息的學生-- select ... from xxx as s left join xxx as c on..... where .....-- select ... from xxx as s left join xxx as c on..... having .....select * from students left join classes on students.cls_id = classes.id where classes.name is null;(注意)不建議使用 select * from students left join classes on students.cls_id=classes.id having classes.id is null;-- right join on-- 將數據表名字互換位置,用left join完成-- 子查詢-- 標量子查詢: 子查詢返回的結果是一個數據(一行一列)-- 列子查詢: 返回的結果是一列(一列多行)-- 行子查詢: 返回的結果是一行(一行多列)-- 查詢出高于平均身高的信息(height)-- 1 查出平均身高select avg(height) from students ; -- 172-- 2 查出高于平均身高的信息select * from students where height >(select avg(height) from students) ;-- 查詢學生的班級號能夠對應的 學生名字-- select name from students where cls_id in (select id from classes);-- 1 查出所有的班級idselect id from classes; -- 1,2-- 2 查出能夠對應上班級號的學生信息select * from students where cls_id in (select id from classes);-- sql強化演練( goods 表練習)-- 查詢類型 cate_name 為 '超級本' 的商品名稱 name 、價格 price ( where )select name,price from goods where cate_name = "超級本";-- 顯示商品的種類-- 1 分組的方式( group by ) select cate_name from goods group by cate_name;-- 2 去重的方法( distinct )select distinct cate_name from goods;-- 求所有電腦產品的平均價格 avg ,并且保留兩位小數( round )select round(avg(price),2) from goods;-- 顯示 每種類型 cate_name (由此可知需要分組)的 平均價格select cate_name,avg(price) from goods group by cate_name;-- 查詢 每種類型 的商品中 最貴 max 、最便宜 min 、平均價 avg 、數量 countselect max(price),min(price),avg(price),count(*) from goods group by cate_name;-- 查詢所有價格大于 平均價格 的商品,并且按 價格降序 排序 order desc-- 1 查詢平局價格(avg_price)select avg(price) as avg_price from goods;-- 2 使用子查詢select * from goods where price > (select avg(price) as avg_price from goods) order by price desc;-- 查詢每種類型中最貴的電腦信息(難)-- 1 查找 每種類型 中 最貴的 max_price 價格select cate_name,max(price) as max_price from goods group by cate_name;-- 2 關聯查詢 inner join 每種類型 中最貴的物品信息-- select * from goods -- inner join-- (select cate_name,max(price) as max_price from goods group by cate_name) as max_price_goods-- on goods.cate_name=max_price_goods.cate_name and goods.price=max_price_goods.max_price;select * from goodsinner join(select cate_name,max(price) as max_price from goods group by cate_name) as max_price_goodson goods.cate_name = max_price_goods.cate_name and goods.price = max_price_goods.max_price;-- 創建"商品分類"表第一步 創建表 (商品種類表 goods_cates )create table if not exists goods_cates(id int unsigned primary key auto_increment,name varchar(40) not null);第二步 同步 商品分類表 數據 將商品的所有 (種類信息) 寫入到 (商品種類表) 中-- 按照 分組 的方式查詢 goods 表中的所有 種類(cate_name)select cate_name from goods group by cate_name;-- (注意) 把查詢出來的 結果 寫入 goods_cates 表里去 ( insert into ) 只插入nameinsert into goods_cates(name) (select cate_name from goods group by cate_name);第三部 同步 商品表 數據 通過 goods_cates 數據表來更新 goods 表-- 因為要通過 goods_cates表 更新 goods 表 所以要把兩個表連接起來select * from goods inner join goods_cates on goods.cate_name = goods_cates.name;-- 把 商品表 goods 中的 cate_name 全部替換成 商品分類表中的 商品id ( update ... set )update (goods inner join goods_cates on goods.cate_name = goods_cates.name) set goods.cate_name = goods_cates.id;第四部 修改表結構-- 查看表結構(注意 兩個表中的 外鍵類型需要一致)desc goods;-- 修改表結構 alter table 字段名字不同 change,把 cate_name 改成 cate_id int unsigned not nullalter table goods change cate_name cate_id int unsigned not null;-- 創建 商品品牌表 goods_brands第一步 創建 "商品品牌表" 表-- 第一種方式 先創建表create table goods_brands (id int unsigned primary key auto_increment,name varchar(40) not null);-- 插入數據 brand_name(分組)-- 按照 分組 的方式查詢 goods 表中的所有 種類(brand_name)select brand_name from goods group by brand_name;--(注意) 把查詢出來的 結果 寫入 goods_brands 表里去 ( insert into ) 只插入nameinsert into goods_brands(name) (select brand_name from goods group by brand_name);-- 第二種方式 創建表的同時插入數據(了解,不建議使用)create table goods_brands (id int unsigned primary key auto_increment,name varchar(40) not null) select brand_name as name from goods group by brand_name;第二步 同步數據-- 通過goods_brands數據表來更新goods數據表 g.brand_name=b.idupdate (goods inner join goods_brands on goods.brand_name = goods_brands.name) set goods.brand_name = goods_brands.id;第三部 修改表結構-- 通過alter table語句修改表結構 brand_id int unsigned not nullalter table goods change brand_name brand_id int unsigned not null;-- 外鍵的使用(了解)-- 向goods表里插入任意一條數據insert into goods (name,cate_id,brand_id,price) values('老王牌拖拉機', 10, 10,'6666');-- 約束 數據的插入 使用 外鍵 foreign key-- alter table goods add foreign key (brand_id) references goods_brands(id);alter table goods add foreign key (cate_id) references goods_cates(id);alter table goods add foreign key(brand_id) references goods_brands(id);-- 失敗原因 老王牌拖拉機 delete-- delete from goods where name="老王牌拖拉機";delete from goods where name="老王牌拖拉機";-- 創建表的同時設置外鍵 (注意 goods_cates 和 goods_brands 兩個表必須事先存在)create table goods(id int primary key auto_increment not null,name varchar(40) default '',price decimal(5,2),cate_id int unsigned,brand_id int unsigned,is_show bit default 1,is_saleoff bit default 0,foreign key(cate_id) references goods_cates(id),foreign key(brand_id) references goods_brands(id));-- 如何取消外鍵約束-- 需要先獲取外鍵約束名稱,該名稱系統會自動生成,可以通過查看表創建語句來獲取名稱show create table goods;-- 獲取名稱之后就可以根據名稱來刪除外鍵約束alter table goods drop foreign key goods_ibfk_1;alter table goods drop foreign key goods_ibfk_2;總結:在實際開發中,很少會使用到外鍵約束,會極大的降低表更新的效率-- python與mysql的交互使用-- 基本流程 1 connection對象 |2 cursor對象 |3 關閉cursor |4 關閉connection-- sql注入 ' or 1 or 'select * from goods where name = '%s' % nameselect * from goods ;
總結
- 上一篇: Python3 色情图片识别
- 下一篇: 无线服务器密码让别人改了,wifi密码被