数据库叫DB,数据库管理系统叫DBMS
mysql下载:https://dev.mysql.com/downloads/mysql/
mysql偶尔会开机提示连接失效,这时需要进入服务面板开启mysql服务
获取初始密码看这个:http://t.csdn.cn/nCutd
安装步骤看这个:http://t.csdn.cn/yWyoZ
navicat安装和破解看这个:http://t.csdn.cn/eZVJv
(1)执行命令开启一般查询日志:mysql -u root -p输入密码登录后 SET GLOBAL general_log=1; //=0就是关闭通用查询日志。
此时在默认在mysql的data目录中生成了localhost.log文件(就是电脑的用户名,一般不是localhost),该文件就是通用查询日志文件。
数据库是个文件夹,其中frm结尾的是表文件,MYD结尾的是数据文件
注意sql语言不区分大小写!!!
inforation_schema:视图,是逻辑表,没有专门对应的数据库,show databases;后出现
mysql数据库存操作数据库的核心信息
performance_schema数据库存mysql性能相关的信息
sys数据库存系统相关的信息
一般要创建自己的数据库
creat database if not exists db1;如果db1不存在则创建这个数据库,防重名报错
drop database if exists db1;如果db1存在则删除
drop table if exists tb1;如果表tb1存在则删除
show tables;use数据库后,查询数据库中所有表
desc 表名;查看某表结构
数据类型
声明变量:age int;score double(总长度,小数点后保留的位数);
name char(10);最大10字符,且小于10字符补空格占满10字符,存储性能高
name varchar(10);最长10字符,且先计算实际长度再存,小于10字符存实际字符数,存储性能低一些
空值null表示unknown,一个值与空值加减乘除结果是空值
truncate table table_name;直接删除表
navicat对象->按ctrl单击选中几个表->右键选逆向表到模型,看到两个表有线连着就是成功添加了外键
ER图
SHOW DATABASES;
CREATE DATABASE IF NOT EXISTS db1;
DROP DATABASE db1;
USE db1;
SELECT DATABASE();
TRUNCATE TABLE tb1;#直接删除tb1表所有内容,但是表还在
DELETE FROM tb1;
CREATE TABLE tb1(
id int PRIMARY KEY AUTO_INCREMENT ,#DEFAULT 1000 ,#设置id为主键,即id非空且唯一
#AUTO_INCREMENT只能配合数字型主键使用,要求主键且自增长,不填id会自动帮忙加1,填了两个相同的会报错
username VARCHAR(20) DEFAULT "0000",#为空时默认0000,如果传null还是null
password VARCHAR(32) NOT NULL UNIQUE#非空且唯一
);
#先建主表再建从表,先添加主表数据再添加从表数据
CREATE TABLE tb2(
id int,
tb1_id int,#把它设置为外键,在下一句填入
CONSTRAINT fk_tb2_tb1 FOREIGN KEY(tb1_id) REFERENCES tb1(id)
);
ALTER TABLE tb2 DROP FOREIGN KEY fk_tb2_tb1;
ALTER TABLE tb2 ADD CONSTRAINT fk_tb2_tb1 FOREIGN KEY(tb1_id) REFERENCES tb1(id);
ALTER TABLE tb1 ADD birth DATE;
SELECT * FROM tb2;
SELECT * FROM tb1,tb2;#会出现笛卡尔积,即取tb1,tb2两集合的所有组合
SELECT t1.`password`,t1.username,t2.tb1_id FROM tb1 t1,tb2 t2 WHERE t2.tb1_id=t1.id;#隐式内连接查询,查交集数据,消除无效数据,起别名t1,t2
SELECT * FROM tb1 INNER JOIN tb2 ON tb1.id=tb2.tb1_id;#显式内连接
SELECT * FROM tb1 LEFT JOIN tb2 on tb1.id=tb2.tb1_id;#左外连接,查tb1所有数据和tb1与tb2交集 ,常用
SELECT * FROM tb1 RIGHT JOIN tb2 on tb1.id=tb2.tb1_id;#右外连接,查tb2所有数据和tb1与tb2交集
SELECT * FROM tb1 WHERE id<(SELECT id FROM tb1 WHERE birth="1992-11-11");#括号里面是子查询,单行单列
SELECT * FROM tb1 WHERE id in(SELECT tb1_id FROM tb2 WHERE id=1 or id=2);#多行单列
SELECT count ,t1.id,t1.username,t1.password,t1.birth FROM (SELECT id,username,password,birth,count(*)count FROM tb1 GROUP BY id)t1, tb2 WHERE t1.id=tb2.tb1_id; #多行多列,可以通过给count(*)起别名保留它
SELECT * FROM tb1;#查询全部列数据,可以用*代替列名列表,开发时不要用
#要单独选中每句话执行,其他语句也是
INSERT INTO tb1(id,username,password) VALUES(1001,"aaaa","12");
INSERT INTO tb1(id,username,password) VALUES(1002,"bbbb",'11');
INSERT INTO tb2(id,tb1_id) VALUES(1,1001),(2,1002);
-- 每跑一次都是单独添加一行
INSERT INTO tb1(birth,password) VALUES('1992-11-11',"111");-- 单双引号都是字符串
UPDATE tb1 SET id=1002,birth='1111-11-11' WHERE username='aaaa';-- 修改表内容
-- 注意如果update语句没有加where条件,会把表中所有数据全部修改
DELETE FROM tb1 WHERE id=1002;
SHOW TABLES;
DESC tb1;
SELECT id,birth FROM tb1;#查询id、birth两列
SELECT DISTINCT id,username FROM tb1;#去除重复地查询id,username列
SELECT id 编号,birth as 生日 FROM tb1;#起别名,查询时显示别名,加不as都可以
SELECT * FROM tb1 WHERE id BETWEEN 1000 AND 1002;#id>=1000&&id<=1002,id>=1000 AND id<=1002都是正确语法
SELECT * FROM tb1 WHERE birth BETWEEN '1990-1-1' AND '2000-1-1';#日期也能比较
#等号用=,不等用!=或<>,或用||,or,age=12 or age=13,age in(12,13)都是正确语法
#null的比较必须要is和is not,不能用=
#通配符:_代表单个任意字符,%代表任意个数字符
SELECT * FROM tb1 WHERE birth LIKE "_99%";#第二三字符是99
SELECT * FROM tb1 WHERE birth LIKE "%1%";#只要包含1就行了
SELECT * FROM tb1 ORDER BY id ASC;#对id升序排序,id为null的排最前面,默认升序,不写asc也是升序
SELECT * FROM tb1 ORDER BY id DESC;#对id降序排序
SELECT * FROM tb1 ORDER BY id ASC,birth ASC;#id相同时按birth升序排序
SELECT COUNT(id) FROM tb1;#有四行的id列非null
SELECT COUNT(*) FROM tb1;#有6行数据至少1列非空
SELECT MAX(id) FROM tb1;
SELECT MIN(id) FROM tb1;#自动忽略null
SELECT SUM(id) FROM tb1;
SELECT AVG(id) FROM tb1;
SELECT id ,AVG(id),COUNT(*) FROM tb1 GROUP BY id;#先查询按什么分
SELECT id ,AVG(id),COUNT(*) FROM tb1 WHERE id>1001 GROUP BY id;#在上面的基础上限制id>1001才能参与排序
SELECT id ,AVG(id),COUNT(*) FROM tb1 WHERE id>1001 GROUP BY id HAVING COUNT(*)>1;#在上面的基础上限制每组人数大于1才能参与排序
SELECT * FROM tb1 LIMIT 0,3;#限制查三条数据,从0行开始查
#接下来每页起始索引:(当前页码-1)*每页查询条数
#limit是mysql方言,oracle用rownumber,SQL Server用top
#多对多表关系
#商品表
CREATE TABLE goods(
id INT PRIMARY KEY auto_increment,
title VARCHAR(110),
price DOUBLE(10,2)
);
#订单表
CREATE TABLE orders(
id int PRIMARY KEY auto_increment,
payment DOUBLE(10,2),
payment_type TINYINT,
status TINYINT
);
#订单商品中间表
CREATE TABLE orders_goods
(
id int PRIMARY KEY auto_increment,
orders_id int,
goods_id int,
count int
);
ALTER TABLE orders_goods ADD CONSTRAINT fk_order_id FOREIGN KEY(orders_id)REFERENCES orders(id);
ALTER TABLE orders_goods ADD CONSTRAINT fk_goods_id FOREIGN KEY(goods_id)REFERENCES goods(id);