sql|sql全新手教程(全站首发)
1.分类
关联式资料库是用一个表格(主流存储方式)
2.sql (structured query language)
是一种语言,用来和关联式资料库沟通(用于创建资料库,修改资料,删除,增加..)
SQL是一种数据库语言,可以定义和操作数据库。
MySQL是一个全球流行的数据库,也是一个可以处理数据库的管理系统(RDBMS)有免费的版本而且适用面广
3.用mysql来学习sql语言
打开这个东西
sql_workbench(请自行官网安装)
[1]表格 & 键 tables & keys
主键可以唯一区分每一笔资料
外键的举例(表格之间的关联)
外键一定要对应到主键
外键也可以对应到自己表格的主键
也可以设定两个主键
资料库的表格设计是数据库存储数据的关键(key的对应)
4.sql语法
mysql是资料库管理系统
用sql来描述(管理)
[1]创建
先创建一个
CREATE DATABASE sql_tutorial
用`可以避免和关键词的区分
DROP DATABASE ....
用来删除
用下划线,然后闪电执行即可运行代码||用闪电旁边的可以自动运行光标所在的行
[2]创建资料库的表格
常见的资料形态
m:总共几位数,n是小数点占了几位
(3,2)2.33
字串的n 表示最大长度
eg:
CREATE TABLE `student`( `student_id` INT PRIMARY KEY,#也有另外的写法 `name` VARCHAR(20), `major` VARCHAR(20) ); describe `student`;
dorp table `student`; //删除
另一种主关键词的写法
插入删除一个属性
alter table `student` add gpa decimal(3,2); alter table `student` drop column gpa;
[3]储存资料 insert
填入资料的顺序要求是根据表格创建时属性的顺序
insert into `student` values(1,'小白','历史'); select * from `student`; #搜寻资料时的写法
*代表全部的意思(搜寻表格的资料)
未知的可以用null来表示
[4]限制、约束 constraint
CREATE TABLE `student`( `student_id` INT PRIMARY KEY,#也有另外的写法 `name` VARCHAR(20) NOT NULL, `major` VARCHAR(20) UNIQUE #表示这个值是唯一的 #`major` VARCHAR(20) DEFAULT '历史'; );
自动计数器
CREATE TABLE `student`( `student_id` INT auto_increment primary KEY, `name` VARCHAR(20), `major` VARCHAR(20) ); insert into `student` (`name`,`major`)values('小拉','英文');
[5]修改&删除资料 update & delete
首先更改设置
set SQL_SAFE_UPDATES=0;
更新的语法
update `student` set `major`='英语文学' where `major`='英文';
也可以用逻辑表达式
set后面也可以用多个参数
如果不写where那么所有的数据都会发生改变
数据资料的删除
delete from 'student' where 'student_id'=1;
delete from 'student'; #删除所有的资料
<>是sql中不等于
[6]取得资料 select
select * from
student
;
#搜寻资料时的写法取得部分属性
select `name` from `student` order by `score`;
分号前加DESC是降序排序
SELECT * FROM Websites ORDER BY alexa DESC;
#双关键词的排序(有先后顺序) SELECT * FROM Websites ORDER BY country,alexa;
limit 2 ;
这个只输出2个结果
也可以加条件判断 :结尾加上where......
select * from `student` where `major`=`英语`
tip:
select * from `student` where `major`in(`历史`,`英语`)
[7]创建公司资料库
(1)创建与插入
create table `branch`( `branch_id` int primary key, `branch_name` varchar(20), `manager_id` int, foreighn key (`mananger_id`) references `employee`(`emp_id`) on delete set null)
foreigh key的设定
create table `work_with`( `emp_id` int, `client_id` int, `total_sales` int, primary key(`emp_id`,`client_key`) foreign key (`emp_id`) references `employee`(`emp_id`) on delete cascade, foreign key (`client_id`) references `client`(`client_id`) on delete cascade );
注意表格数据插入时的关联顺序和逻辑关系——一般而言是要求先创建底层的表格,如果有冲突的话,把数值还没有的东西改成Null
(2)select
order 排序
仅仅获得某一个属性
select `name` from `employee`; select distinct `sex` from `employee`; #distinct 的用法 ?
(3)聚合函数 aggregate function 更方便的取得资料库中的咨询
count函数(用于回传资料的笔数)
获取员工的人数
select count (*) from `employee`;
count 就是聚合函数的意思
select count (`sup_id`) from `employee`; #寻找有suo_id的资料有几组()除掉null
取得所有出生于1970-01-01之后的女性员工人数
select count(*) from `employee` where `birth_date`>'1970-01-01' and 'sex'='F';
取得所有员工的平均薪水
select avg(`salary`) from `employee`;
取得所有员工的薪水总和
select sum(`salary`) from `employee`;
取得薪水最高的员工
select max(`salary`) from `employee`;
[8]万用字元 wildcard
%代表多个子元,_代表一个字元
取得电话尾号是335的客户
select * from `client` where `phone` like '%335'; select * from `client` where `phone` like '254%'; select * from `client` where `phone` like '%354%'; #只要中间出现354就可以
【sql|sql全新手教程(全站首发)】取得姓艾的客户
select * from `client` where `client_id` like '艾%';
取得生日是12月的员工
select * from `employee` where `birth_date` like '_____12%'; #前面是五个下划线
[9]联集 union
union的几个表格属性数目要求一致(而且资料形态也要求一致)
员工名字union客户名字
select `name` from `emplyee` union select `client_name` from `client`;
员工id+员工名字 union 客户id +客户名字
select `empl_id` +`name` from `emplyee` union select `client_id`+`client_name` from `client`; #此时显示出来表格的属性名称沿用第一个 即`empl_id` +`name` ? 更改属性的名称 select `empl_id` as `total_id` +`name` as `total_name` from `emplyee` union select `client_id`+`client_name` from `client`; ?
员工薪水union销售金额
select `salary` from `emplyee` union select `total_sales` from `works_with`;
[10]连接 join
连接两个表格
获得所有部门经理的名字
select `emp_id`,`name`, `brach_name` from `employee` join `branch` on `emp_id`=`manager_id`; ? ? select `emp_id`,`name`, `brach_name` from `employee` join `branch` on employee.`emp_id`=`manager_id`; #类似类的表达方式(前面加上表格的名称,可以描述的更准确) ? ? select `emp_id`,`name`, `brach_name` from `employee` left join `branch` on `emp_id`=`manager_id`; #左边的表格无论如何都会回传,而右边的表格只有在条件成立的情况下才会回传
[11]子查询 subquery
在一个语句查询的结果 用于一个新的语句的查询
找出研发部门经理的名字(语句的嵌套)
select `name` from `employee` where `emp_id`=(select `manager_id` from `branch` where `barch_name`='研发');
找出一位客户销售金额超过5000的员工的名字
注意结果如果有多个则用in
select `name` from `employee` where `emp_id` in( select `emp_id` from `works_with` where `total_sales`>50000);
[12]on delete(用于表格中foreign key被删除之后这个资料变化的形态(按需求设置))
foreighn key (`mananger_id`) references `employee`(`emp_id`) on delete set null
on delete set null
如果删除了emp_id 那么这个manager_id将会设置成null
foreign key (`client_id`) references `client`(`client_id`) on delete cascade
如果删除了client_id 那么这笔交易直接被删除
如果一个属性既是主键又是外键那么它就不可以被设置为
on delete set null
因为主键不能为null
[13]python 连接 MySQL
密码是123456
create.py
import mysql.connector ? connection = mysql.connector.connect(host='localhost', port='3306', user='root', password='password') ? cursor = connection.cursor() ? # 創建資料庫 cursor.execute("CREATE DATABASE `database`; ") ? ? # 取得所有資料庫名稱 # cursor.execute("SHOW DATABASES; ") # records = cursor.fetchall() # for r in records: #print(r) ? ? # 選擇資料庫 # cursor.execute("USE `sql_tutorial`; ") ? ? # 創建表格 # cursor.execute('CREATE TABLE `qq`(qq INT); ') ? cursor.close() connection.close()
select.py
import mysql.connector ? connection = mysql.connector.connect(host='localhost', port='3306', user='root', password='password', database='sql_tutorial') ? cursor = connection.cursor() ? # 取的部門表格所有資料 cursor.execute('SELECT * FROM `branch`; ') ? records = cursor.fetchall() for r in records: print(r) ? cursor.close() connection.close()
update.py
? import mysql.connector ? connection = mysql.connector.connect(host='localhost', port='3306', user='root', password='password', database='sql_tutorial') ? cursor = connection.cursor() ? # 新增 # cursor.execute("INSERT INTO `branch` VALUES(5, 'qq', NULL)") ? ? # 修改 # cursor.execute('UPDATE `branch` SET `manager_id` = 206 WHERE `branch_id` = 4; ') ? ? # 刪除 # cursor.execute("DELETE FROM `branch` WHERE `branch_id` = 5; ") ? ? cursor.close() connection.commit()#!!!!!注意这边特殊要commit一下 connection.close()
推荐阅读
- 危险也是机会
- 活着就是生命的全部意义
- 一个健康的APP和健全的人格大体类似
- 松软可口易消化,无需烤箱超简单,新手麻麻也能轻松成功~
- NeuVector 会是下一个爆款云原生安全神器吗()
- 全过程工程咨询——时间管理(12)
- 别墅庭院设计,不同的别墅庭院设计也给人视觉上完全不一样的!
- 不让记忆、感觉、情绪成为孩子的负累|不让记忆、感觉、情绪成为孩子的负累|《全脑教养法》(四)
- (全员向连载)云间当铺(一)
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)